starpu-1.1.5/0002755000373600000000000000000012571541166010040 500000000000000starpu-1.1.5/tools/0002755000373600000000000000000012571541161011173 500000000000000starpu-1.1.5/tools/starpu_paje_draw_histogram.10000644000373600000000000000160312571536746016617 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PAJE_DRAW_HISTOGRAM "1" "September 2015" "starpu_paje_draw_histogram (StarPU) 1.1.5" "User Commands" .SH NAME starpu_paje_draw_histogram \- manual page for starpu_paje_draw_histogram (StarPU) 1.1.5 .SH DESCRIPTION Give statistical analysis of the paje trace .PP \&./starpu_paje_draw_histogram [ options ] paje.trace [paje.trace2 ...] .SH OPTIONS .TP \fB\-r\fR To fix range x1:x2 ("\-1" for infinity) .TP \fB\-n\fR To choose a certain state .TP \fB\-v\fR Print output to command line .TP \fB\-h\fR Show this message .SH EXAMPLES \&./starpu_paje_draw_histogram \fB\-n\fR chol_model_22 example.native.trace .PP \&./starpu_paje_draw_histogram \fB\-r\fR 100:300 \fB\-n\fR FetchingInput,Overhead \fB\-v\fR example.native.trace example.simgrid.trace .SH "REPORTING BUGS" Report bugs to starpu-1.1.5/tools/starpu_machine_display.c0000644000373600000000000001050112571536604016007 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define PROGNAME "starpu_machine_display" static void display_worker_names(enum starpu_worker_archtype type) { unsigned nworkers = starpu_worker_get_count_by_type(type); if (!nworkers) return; int ids[nworkers]; starpu_worker_get_ids_by_type(type, ids, nworkers); unsigned i; for (i = 0; i < nworkers; i++) { char name[256]; starpu_worker_get_name(ids[i], name, 256); fprintf(stdout, "\t\t%s\n", name); } } static void display_combined_worker(unsigned workerid) { int worker_size; int *combined_workerid; starpu_combined_worker_get_description(workerid, &worker_size, &combined_workerid); fprintf(stdout, "\t\t"); int i; for (i = 0; i < worker_size; i++) { char name[256]; starpu_worker_get_name(combined_workerid[i], name, 256); fprintf(stdout, "%s\t", name); } fprintf(stdout, "\n"); } static void display_all_combined_workers(void) { unsigned ncombined_workers = starpu_combined_worker_get_count(); if (ncombined_workers == 0) return; unsigned nworkers = starpu_worker_get_count(); fprintf(stdout, "\t%u Combined workers\n", ncombined_workers); unsigned i; for (i = 0; i < ncombined_workers; i++) display_combined_worker(nworkers + i); } static void parse_args(int argc, char **argv, int *force) { int 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], "--help", 6) == 0 || strncmp(argv[i], "-h", 2) == 0) { (void) fprintf(stderr, "\ Show the processing units that StarPU can use, and the \n \ bandwitdh and affinity measured between the memory nodes. \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 \ -f, --force force bus sampling and show measures \n \ \n \ Report bugs to <" PACKAGE_BUGREPORT ">.\n", PROGNAME); 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]); exit(EXIT_FAILURE); } } } int main(int argc, char **argv) { int ret; int force = 0; struct starpu_conf conf; parse_args(argc, argv, &force); 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; } unsigned ncpu = starpu_cpu_worker_get_count(); unsigned ncuda = starpu_cuda_worker_get_count(); unsigned nopencl = starpu_opencl_worker_get_count(); fprintf(stdout, "StarPU has found :\n"); fprintf(stdout, "\t%u CPU cores\n", ncpu); display_worker_names(STARPU_CPU_WORKER); fprintf(stdout, "\t%u CUDA devices\n", ncuda); display_worker_names(STARPU_CUDA_WORKER); fprintf(stdout, "\t%u OpenCL devices\n", nopencl); display_worker_names(STARPU_OPENCL_WORKER); display_all_combined_workers(); if (ret != -ENODEV) { fprintf(stdout, "\ntopology ...\n"); starpu_topology_print(stdout); fprintf(stdout, "\nbandwidth and latency ...\n"); starpu_bus_print_bandwidth(stdout); starpu_shutdown(); } return 0; } starpu-1.1.5/tools/starpu_codelet_profile.in0000755000373600000000000000430412571536606016212 00000000000000#!@BASH@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2008, 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.1.5/tools/perfmodels/0002755000373600000000000000000012571541161013333 500000000000000starpu-1.1.5/tools/perfmodels/README0000644000373600000000000000133212571536606014140 00000000000000This 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 / C2070, thus 3 GPUs - CUDA 6.0 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.1.5/tools/perfmodels/sampling/0002755000373600000000000000000012571541161015145 500000000000000starpu-1.1.5/tools/perfmodels/sampling/codelets/0002755000373600000000000000000012571541161016747 500000000000000starpu-1.1.5/tools/perfmodels/sampling/codelets/42/0002755000373600000000000000000012571541161017174 500000000000000starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_21.attila0000644000373600000000000000700412571536606024706 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.377909e+04 1.008911e+03 6.145473e+06 8.513300e+10 446 ff82dda0 7372800 0.000000e+00 4.298380e+04 1.919778e+03 1.177756e+07 5.072542e+11 274 2c1922b7 819200 0.000000e+00 1.936516e+03 1.503574e+02 4.725100e+05 9.205395e+08 244 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.656425e+03 2.270595e+02 3.320531e+05 8.885184e+08 125 ff82dda0 7372800 0.000000e+00 6.358340e+03 3.816293e+02 5.023088e+05 3.205356e+09 79 2c1922b7 819200 0.000000e+00 3.867923e+02 4.867053e+01 4.564149e+04 1.793330e+07 118 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.902887e+03 4.574719e+02 4.585957e+05 9.230924e+08 241 ff82dda0 7372800 0.000000e+00 3.810456e+03 1.334249e+02 3.353201e+05 1.279289e+09 88 2c1922b7 819200 0.000000e+00 3.835296e+02 4.543249e+01 2.262825e+04 8.800385e+06 59 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.657310e+03 2.918518e+02 3.162199e+05 8.504305e+08 119 ff82dda0 7372800 0.000000e+00 3.819809e+03 1.073068e+02 3.055848e+05 1.168197e+09 80 2c1922b7 819200 0.000000e+00 4.020211e+02 5.372009e+01 3.256371e+04 1.332505e+07 81 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_12.mirage0000644000373600000000000000701112571536606024672 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.615269e+04 4.099119e+02 4.748890e+06 7.675673e+10 294 ff82dda0 7372800 0.000000e+00 5.118532e+04 6.422962e+02 1.530441e+07 7.834845e+11 299 2c1922b7 819200 0.000000e+00 2.296074e+03 7.445272e+01 1.021753e+06 2.348487e+09 445 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.740712e+03 2.663471e+02 5.755494e+05 1.592313e+09 210 ff82dda0 7372800 0.000000e+00 6.504044e+03 4.912781e+02 1.385361e+06 9.061859e+09 213 2c1922b7 819200 0.000000e+00 6.801212e+02 1.149855e+02 1.129001e+05 7.898057e+07 166 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.716114e+03 2.688407e+02 4.237138e+05 1.162130e+09 156 ff82dda0 7372800 0.000000e+00 6.512491e+03 5.367987e+02 8.270864e+05 5.422988e+09 127 2c1922b7 819200 0.000000e+00 7.284912e+02 1.021807e+02 1.049027e+05 7.792421e+07 144 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.294336e+03 5.071880e+02 4.909878e+05 1.181540e+09 214 ff82dda0 7372800 0.000000e+00 6.469485e+03 5.370376e+02 7.698688e+05 5.014976e+09 119 2c1922b7 819200 0.000000e+00 7.112055e+02 1.136474e+02 1.002800e+05 7.314078e+07 141 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/save_cl_bottom.attila0000644000373600000000000000700112571536606023320 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 4.419323e+01 9.394629e+00 1.825180e+04 8.430572e+05 413 fb4b8624 4427800 0.000000e+00 1.267467e+01 2.411186e+00 5.754301e+03 7.557335e+04 454 4af260f6 14678040 0.000000e+00 2.442142e+01 5.135780e+00 1.394463e+04 3.556084e+05 571 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.910144e+01 6.371108e+00 1.329449e+03 5.336347e+04 34 fb4b8624 4427800 0.000000e+00 3.998483e+01 8.150933e+00 2.519044e+03 1.049091e+05 63 4af260f6 14678040 0.000000e+00 3.398450e+01 5.156207e+00 8.156280e+02 2.835679e+04 24 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.173112e+01 3.816078e+00 7.615470e+02 2.451424e+04 24 fb4b8624 4427800 0.000000e+00 2.860497e+01 5.248990e+00 1.029779e+03 3.044867e+04 36 4af260f6 14678040 0.000000e+00 3.652883e+01 8.229435e+00 1.716855e+03 6.589771e+04 47 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.719045e+01 7.851419e+00 2.566141e+03 9.968943e+04 69 fb4b8624 4427800 0.000000e+00 4.509905e+01 6.110617e+00 9.470800e+02 4.349654e+04 21 4af260f6 14678040 0.000000e+00 2.634116e+01 3.746211e+00 6.479926e+03 1.741412e+05 246 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/chol_model_11.mirage0000644000373600000000000000677612571536606022736 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n cea37d6d 409600 1.097392e+07 9.221097e+02 4.521529e+01 7.930143e+04 7.330044e+07 86 617e5fe6 3686400 2.953730e+08 1.884969e+04 7.370619e+02 2.111165e+06 3.985565e+10 112 afdd228b 1638400 8.758624e+07 5.940712e+03 2.434960e+02 2.376285e+05 1.414054e+09 40 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.366740e+03 9.457424e+01 1.556354e+05 8.355143e+08 29 cea37d6d 409600 1.097392e+07 2.003232e+03 2.738589e+01 5.809372e+04 1.163969e+08 29 afdd228b 1638400 8.758624e+07 3.522008e+03 5.701992e+01 1.021382e+05 3.598259e+08 29 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 8.758624e+07 3.775579e+03 6.170997e+01 1.094918e+05 4.135053e+08 29 cea37d6d 409600 1.097392e+07 2.237869e+03 3.535637e+01 6.489820e+04 1.452699e+08 29 617e5fe6 3686400 2.953730e+08 5.557011e+03 6.001156e+01 1.611533e+05 8.956353e+08 29 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 5.500099e+03 6.565775e+01 1.595029e+05 8.774066e+08 29 cea37d6d 409600 1.097392e+07 2.220120e+03 2.867670e+01 6.438348e+04 1.429629e+08 29 afdd228b 1638400 8.758624e+07 3.742877e+03 5.898784e+01 1.085434e+05 4.063656e+08 29 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dgemm_gemm.attila0000644000373600000000000000700412571536606024017 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 6.739553e+05 1.180373e+04 5.391643e+07 3.634841e+13 80 0b0b0ce8 7372800 2.621440e+08 2.919185e+04 3.106016e+03 2.335348e+06 6.894489e+10 80 4220e23d 29491200 2.097152e+09 2.058556e+05 4.934163e+03 1.646845e+07 3.392071e+12 80 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.313178e+04 3.749098e+01 2.451969e+06 5.671856e+10 106 0b0b0ce8 7372800 2.621440e+08 1.039822e+03 4.572723e+01 9.982293e+04 1.039988e+08 96 4220e23d 29491200 2.097152e+09 7.017044e+03 9.150160e+00 7.367896e+05 5.170094e+09 105 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.311999e+04 3.792305e+01 2.427599e+06 5.612623e+10 105 0b0b0ce8 7372800 2.621440e+08 1.036523e+03 7.589914e+00 8.810443e+04 9.132713e+07 85 4220e23d 29491200 2.097152e+09 7.017425e+03 3.431116e+01 7.298122e+05 5.121525e+09 104 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 66355200 7.077888e+09 2.312215e+04 3.532854e+01 2.427826e+06 5.613668e+10 105 0b0b0ce8 7372800 2.621440e+08 1.036998e+03 4.343669e+01 1.078478e+05 1.120342e+08 104 4220e23d 29491200 2.097152e+09 7.010229e+03 3.598880e+01 7.360740e+05 5.160183e+09 105 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_22.mirage0000644000373600000000000000702512571536606024661 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 5.319005e+04 1.072845e+03 1.074439e+08 5.717271e+12 2020 24c84a50 22118400 0.000000e+00 1.747556e+05 3.288616e+03 2.457064e+08 4.295378e+13 1406 d46431bb 2457600 0.000000e+00 6.731248e+03 2.017842e+02 1.758875e+07 1.185006e+11 2613 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 1.857771e+03 5.953793e+01 1.442559e+07 2.682697e+10 7765 24c84a50 22118400 0.000000e+00 5.825821e+03 1.536397e+02 3.023019e+07 1.762382e+11 5189 d46431bb 2457600 0.000000e+00 2.626388e+02 2.130047e+01 1.891262e+06 4.999858e+08 7201 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 1.841710e+03 6.898710e+01 1.448873e+07 2.672149e+10 7867 24c84a50 22118400 0.000000e+00 5.866678e+03 1.842980e+02 2.977339e+07 1.748433e+11 5075 d46431bb 2457600 0.000000e+00 2.614108e+02 2.029949e+01 1.936531e+06 5.092829e+08 7408 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 9830400 0.000000e+00 1.853277e+03 6.983878e+01 1.439996e+07 2.672502e+10 7770 24c84a50 22118400 0.000000e+00 5.858635e+03 1.761006e+02 3.008995e+07 1.764453e+11 5136 d46431bb 2457600 0.000000e+00 2.701366e+02 1.779276e+01 1.899060e+06 5.152311e+08 7030 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_12.attila0000644000373600000000000000701112571536606024665 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 8.869540e+04 4.010843e+03 1.765039e+07 1.568709e+12 199 d39bff17 6553600 0.000000e+00 2.736718e+04 1.452565e+03 3.886139e+06 1.066523e+11 142 2c1922b7 1638400 0.000000e+00 4.006489e+03 3.502972e+02 8.493756e+05 3.429028e+09 212 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 7.250005e+03 1.530886e+03 8.555006e+05 6.478930e+09 118 d39bff17 6553600 0.000000e+00 2.060505e+03 3.149423e+02 4.265246e+05 8.993882e+08 207 2c1922b7 1638400 0.000000e+00 5.794447e+02 1.035504e+02 9.155226e+04 5.474365e+07 158 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.906255e+03 1.105050e+03 1.042844e+06 7.386541e+09 151 d39bff17 6553600 0.000000e+00 2.044032e+03 3.248232e+02 3.863220e+05 8.095958e+08 189 2c1922b7 1638400 0.000000e+00 6.103626e+02 1.085471e+02 1.062031e+05 6.687255e+07 174 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.859160e+03 1.144150e+03 1.008296e+06 7.108501e+09 147 d39bff17 6553600 0.000000e+00 2.022724e+03 3.006626e+02 4.308402e+05 8.907256e+08 213 2c1922b7 1638400 0.000000e+00 5.771721e+02 9.999833e+01 9.638774e+04 5.730226e+07 167 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_sgemm_gemm.attila0000644000373600000000000000700612571536606024040 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 3.328725e+05 1.185902e+04 2.563119e+07 8.542747e+12 77 0b0b0ce8 3686400 2.621440e+08 1.421718e+04 3.409134e+02 9.098993e+05 1.294364e+10 64 4220e23d 14745600 2.097152e+09 1.008105e+05 2.361630e+03 8.064841e+06 8.134670e+11 80 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.123499e+04 6.785566e+01 1.190909e+06 1.338033e+10 106 0b0b0ce8 3686400 2.621440e+08 6.738679e+02 4.393713e+01 6.873452e+04 4.651489e+07 102 4220e23d 14745600 2.097152e+09 5.557425e+03 3.241733e+02 5.835297e+05 3.253957e+09 105 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.123077e+04 9.504466e+01 1.179231e+06 1.324463e+10 105 0b0b0ce8 3686400 2.621440e+08 6.672056e+02 3.376608e+01 6.805497e+04 4.552295e+07 102 4220e23d 14745600 2.097152e+09 5.553764e+03 3.500896e+02 5.831453e+05 3.251521e+09 105 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 492beed5 33177600 7.077888e+09 1.124174e+04 2.629960e+01 1.180383e+06 1.326963e+10 105 0b0b0ce8 3686400 2.621440e+08 6.002221e+02 2.259043e+01 6.242310e+04 3.752080e+07 104 4220e23d 14745600 2.097152e+09 5.577722e+03 1.615194e+02 5.912385e+05 3.300529e+09 106 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_11.attila0000644000373600000000000000677512571536606024723 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 4.182946e+04 4.195402e+03 1.171225e+06 4.948453e+10 28 617e5fe6 3686400 0.000000e+00 1.431791e+05 1.961610e+04 1.431791e+06 2.088506e+11 10 cea37d6d 409600 0.000000e+00 4.839229e+03 3.061560e+02 1.258200e+05 6.113086e+08 26 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.565619e+04 2.729977e+03 4.618114e+05 1.198247e+10 18 617e5fe6 3686400 0.000000e+00 5.517976e+04 5.023576e+03 8.828762e+05 4.912068e+10 16 cea37d6d 409600 0.000000e+00 9.325377e+03 4.741281e+02 9.325377e+04 8.718745e+08 10 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.512124e+04 2.223761e+03 4.773036e+05 1.208442e+10 19 617e5fe6 3686400 0.000000e+00 5.116041e+04 1.272422e+03 7.674062e+05 3.928511e+10 15 cea37d6d 409600 0.000000e+00 9.353760e+03 7.152342e+02 9.353760e+04 8.800438e+08 10 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.814234e+04 3.880171e+03 5.065622e+05 1.452685e+10 18 617e5fe6 3686400 0.000000e+00 5.467956e+04 6.741916e+03 8.201934e+05 4.552961e+10 15 cea37d6d 409600 0.000000e+00 1.004502e+04 9.839619e+02 1.004502e+05 1.018706e+09 10 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dgemm_gemm.mirage0000644000373600000000000000700512571536606024006 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 2.783376e+04 1.016266e+03 2.254534e+06 6.283582e+10 81 492beed5 66355200 7.077888e+09 7.068870e+05 1.582112e+04 5.725785e+07 4.049511e+13 81 4220e23d 29491200 2.097152e+09 2.135531e+05 4.787239e+03 1.729780e+07 3.695855e+12 81 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.040745e+03 1.710737e+01 1.040745e+05 1.083442e+08 100 492beed5 66355200 7.077888e+09 2.322675e+04 6.514638e+01 2.438809e+06 5.664606e+10 105 4220e23d 29491200 2.097152e+09 7.042883e+03 4.736092e+01 7.395027e+05 5.208467e+09 105 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.057967e+03 4.209841e+01 1.057967e+05 1.121067e+08 100 492beed5 66355200 7.077888e+09 2.322865e+04 8.861437e+01 2.439008e+06 5.665569e+10 105 4220e23d 29491200 2.097152e+09 7.053091e+03 5.410169e+01 7.405746e+05 5.223647e+09 105 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 7372800 2.621440e+08 1.050834e+03 7.708100e+01 1.019309e+05 1.076889e+08 97 492beed5 66355200 7.077888e+09 2.323864e+04 5.619683e+01 2.440057e+06 5.670394e+10 105 4220e23d 29491200 2.097152e+09 7.040571e+03 3.296604e+01 7.392600e+05 5.204926e+09 105 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_11.mirage0000644000373600000000000000677512571536606024672 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 7.065042e+04 7.118479e+03 1.271707e+06 9.075877e+10 18 617e5fe6 7372800 0.000000e+00 2.321971e+05 3.386520e+04 2.554168e+06 6.056858e+11 11 cea37d6d 819200 0.000000e+00 8.644872e+03 1.175676e+03 4.581782e+05 4.034149e+09 53 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.469534e+04 1.243993e+03 9.714695e+05 3.374879e+10 28 617e5fe6 7372800 0.000000e+00 8.533007e+04 9.757927e+03 1.194621e+06 1.032701e+11 14 cea37d6d 819200 0.000000e+00 1.145973e+04 6.017234e+02 1.145973e+05 1.316874e+09 10 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.498011e+04 2.179531e+03 6.996022e+05 2.456717e+10 20 617e5fe6 7372800 0.000000e+00 8.442764e+04 6.770170e+03 1.350842e+06 1.147818e+11 16 cea37d6d 819200 0.000000e+00 1.080764e+04 2.151492e+02 1.188840e+05 1.285365e+09 11 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 3276800 0.000000e+00 3.506064e+04 2.956747e+03 6.310915e+05 2.228383e+10 18 617e5fe6 7372800 0.000000e+00 8.151052e+04 4.250155e+02 1.059637e+06 8.637388e+10 13 cea37d6d 819200 0.000000e+00 1.153062e+04 1.200141e+03 1.153062e+05 1.343956e+09 10 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_11.attila0000644000373600000000000000677512571536606024704 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 2.515766e+05 2.096151e+04 2.515766e+06 6.373017e+11 10 afdd228b 3276800 0.000000e+00 7.350482e+04 4.292777e+03 9.555626e+05 7.047802e+10 13 cea37d6d 819200 0.000000e+00 9.586125e+03 1.023620e+03 2.108948e+05 2.044715e+09 22 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 6.990473e+04 4.071360e+03 1.118476e+06 7.845196e+10 16 afdd228b 3276800 0.000000e+00 2.992444e+04 7.760944e+02 4.787910e+05 1.433719e+10 16 cea37d6d 819200 0.000000e+00 9.620220e+03 2.335102e+02 1.058224e+05 1.018635e+09 11 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 6.793522e+04 8.600858e+02 6.793522e+05 4.615934e+10 10 afdd228b 3276800 0.000000e+00 2.989699e+04 1.490344e+03 3.587638e+05 1.075261e+10 12 cea37d6d 819200 0.000000e+00 9.974140e+03 1.055336e+03 1.097155e+05 1.106569e+09 11 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 7372800 0.000000e+00 6.962168e+04 1.952172e+02 1.322812e+06 9.209711e+10 19 afdd228b 3276800 0.000000e+00 3.047853e+04 4.777511e+01 4.571780e+05 1.393415e+10 15 cea37d6d 819200 0.000000e+00 1.119488e+04 2.171263e+03 1.231437e+05 1.430437e+09 11 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_21.attila0000644000373600000000000000701112571536606024665 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 8.795690e+04 4.598673e+03 1.715160e+07 1.512725e+12 195 d39bff17 6553600 0.000000e+00 2.744119e+04 1.740624e+03 4.390591e+06 1.209678e+11 160 2c1922b7 1638400 0.000000e+00 4.091631e+03 5.062810e+02 7.283104e+05 3.025603e+09 178 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 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 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.816836e+03 1.179433e+03 1.172496e+06 8.231973e+09 172 d39bff17 6553600 0.000000e+00 2.055421e+03 3.154533e+02 3.864192e+05 8.129623e+08 188 2c1922b7 1638400 0.000000e+00 6.121868e+02 1.314710e+02 9.550115e+04 6.116094e+07 156 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 14745600 0.000000e+00 6.940618e+03 1.147691e+03 1.006390e+06 7.175959e+09 145 d39bff17 6553600 0.000000e+00 2.093041e+03 3.377347e+02 3.851195e+05 8.270585e+08 184 2c1922b7 1638400 0.000000e+00 6.098259e+02 1.286153e+02 1.091588e+05 6.952888e+07 179 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_11.mirage0000644000373600000000000000677512571536606024711 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 3.789658e+04 4.182352e+03 1.250587e+06 4.797021e+10 33 617e5fe6 3686400 0.000000e+00 1.286436e+05 1.271269e+04 2.958803e+06 3.843483e+11 23 cea37d6d 409600 0.000000e+00 4.236597e+03 2.366692e+02 2.372495e+05 1.008267e+09 56 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.864580e+04 3.233071e+03 5.156243e+05 1.495862e+10 18 617e5fe6 3686400 0.000000e+00 5.948740e+04 4.910517e+03 1.070773e+06 6.413154e+10 18 cea37d6d 409600 0.000000e+00 1.060245e+04 4.247968e+02 1.060245e+05 1.125924e+09 10 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 3.046163e+04 4.754796e+03 5.483094e+05 1.710934e+10 18 617e5fe6 3686400 0.000000e+00 5.865963e+04 4.672589e+03 1.349171e+06 7.964405e+10 23 cea37d6d 409600 0.000000e+00 1.042618e+04 1.817032e+02 1.042618e+05 1.087383e+09 10 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n afdd228b 1638400 0.000000e+00 2.939722e+04 4.040622e+03 4.409582e+05 1.320784e+10 15 617e5fe6 3686400 0.000000e+00 5.704610e+04 3.429433e+03 1.255014e+06 7.185241e+10 22 cea37d6d 409600 0.000000e+00 1.049902e+04 4.776188e+02 1.049902e+05 1.104575e+09 10 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_21.mirage0000644000373600000000000000700612571536606024676 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.373117e+04 2.756172e+02 7.167670e+06 9.846014e+10 522 ff82dda0 7372800 0.000000e+00 4.545501e+04 7.462378e+02 1.750018e+07 7.956851e+11 385 2c1922b7 819200 0.000000e+00 1.798916e+03 8.480081e+01 1.219665e+06 2.198952e+09 678 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.883473e+03 4.679640e+02 2.537456e+05 7.509396e+08 88 ff82dda0 7372800 0.000000e+00 6.462089e+03 4.136967e+02 5.751259e+05 3.731746e+09 89 2c1922b7 819200 0.000000e+00 4.040830e+02 6.411732e+01 3.717564e+04 1.540026e+07 92 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.231007e+03 5.378925e+02 3.234960e+05 7.636746e+08 145 ff82dda0 7372800 0.000000e+00 3.904524e+03 2.515208e+02 4.021660e+05 1.576783e+09 103 2c1922b7 819200 0.000000e+00 5.307827e+02 1.276617e+02 5.467062e+04 3.069686e+07 103 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.665736e+03 1.392688e+02 2.881723e+05 4.833744e+08 173 ff82dda0 7372800 0.000000e+00 3.891632e+03 2.259287e+02 7.199519e+05 2.811230e+09 185 2c1922b7 819200 0.000000e+00 5.125766e+02 1.240167e+02 5.587085e+04 3.031453e+07 109 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/chol_model_22.mirage0000644000373600000000000000703012571536606022720 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 3.262643e+03 7.810468e+01 1.532463e+07 5.002746e+10 4697 24c84a50 11059200 1.769472e+09 8.778020e+04 9.598441e+02 2.889724e+08 2.536909e+13 3292 f0ac7beb 4915200 5.242880e+08 2.647095e+04 4.073263e+02 4.762124e+07 1.260878e+12 1799 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 2.011248e+02 1.498037e+01 1.633334e+06 3.303264e+08 8121 24c84a50 11059200 1.769472e+09 2.805491e+03 6.931361e+01 3.683329e+07 1.033985e+11 13129 f0ac7beb 4915200 5.242880e+08 8.944354e+02 3.828761e+01 5.687714e+06 5.096615e+09 6359 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 2.004836e+02 1.337883e+01 1.620709e+06 3.263726e+08 8084 24c84a50 11059200 1.769472e+09 2.828590e+03 6.702999e+01 3.650578e+07 1.033178e+11 12906 f0ac7beb 4915200 5.242880e+08 9.090465e+02 3.898196e+01 5.691540e+06 5.183389e+09 6261 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d46431bb 1228800 6.553600e+07 1.603761e+02 1.178063e+01 1.522450e+06 2.454821e+08 9493 24c84a50 11059200 1.769472e+09 2.828209e+03 7.003112e+01 3.675541e+07 1.040157e+11 12996 f0ac7beb 4915200 5.242880e+08 8.858930e+02 3.323656e+01 5.675030e+06 5.034546e+09 6406 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/cl_update.mirage0000644000373600000000000000701412571536606022252 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 6.670318e+03 3.279077e+02 6.103341e+06 4.080961e+10 915 8ec75d42 14753312 0.000000e+00 2.178007e+04 1.559694e+03 1.008417e+07 2.207603e+11 463 49ec0825 34613280 0.000000e+00 5.101465e+04 2.613713e+03 2.443602e+07 1.249867e+12 479 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 1.028619e+03 1.201323e+02 5.626547e+05 5.866515e+08 547 8ec75d42 14753312 0.000000e+00 1.871093e+03 3.437894e+02 1.981488e+06 3.832713e+09 1059 49ec0825 34613280 0.000000e+00 5.018828e+03 7.664203e+02 4.672528e+06 2.399748e+10 931 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 1.024201e+03 1.096599e+02 6.452464e+05 6.684377e+08 630 8ec75d42 14753312 0.000000e+00 1.877457e+03 3.608958e+02 1.907496e+06 3.713572e+09 1016 49ec0825 34613280 0.000000e+00 5.018101e+03 7.255196e+02 5.314169e+06 2.722447e+10 1059 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 6d78e48f 4461600 0.000000e+00 1.010004e+03 1.090743e+02 5.383321e+05 5.500588e+08 533 8ec75d42 14753312 0.000000e+00 1.986058e+03 3.264552e+02 1.288952e+06 2.629100e+09 649 49ec0825 34613280 0.000000e+00 5.064765e+03 7.492118e+02 4.948276e+06 2.561026e+10 977 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_22.attila0000644000373600000000000000702512571536606024673 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 1.687897e+05 8.023245e+03 3.110794e+08 5.262564e+13 1843 f0ac7beb 9830400 0.000000e+00 5.125521e+04 2.656019e+03 7.375625e+07 3.790543e+12 1439 d46431bb 2457600 0.000000e+00 6.821106e+03 3.878220e+02 1.100926e+07 7.533811e+10 1614 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.852261e+03 2.067645e+02 2.783335e+07 1.630914e+11 4756 f0ac7beb 9830400 0.000000e+00 1.831142e+03 6.447275e+01 9.274735e+06 1.700441e+10 5065 d46431bb 2457600 0.000000e+00 2.556618e+02 1.838263e+01 1.252232e+06 3.218030e+08 4898 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.846675e+03 2.141855e+02 2.732736e+07 1.599886e+11 4674 f0ac7beb 9830400 0.000000e+00 1.834114e+03 5.380375e+01 9.566740e+06 1.756159e+10 5216 d46431bb 2457600 0.000000e+00 2.610266e+02 2.020042e+01 1.246402e+06 3.272925e+08 4775 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 22118400 0.000000e+00 5.840318e+03 1.756302e+02 2.921911e+07 1.708032e+11 5003 f0ac7beb 9830400 0.000000e+00 1.840833e+03 4.879997e+01 9.542881e+06 1.757920e+10 5184 d46431bb 2457600 0.000000e+00 2.617920e+02 1.853601e+01 1.281472e+06 3.371609e+08 4895 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/chol_model_21.mirage0000644000373600000000000000701312571536606022720 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 1.868713e+03 9.872163e+01 2.535843e+06 4.751987e+09 1357 ff82dda0 7372800 8.856576e+08 4.564676e+04 7.031596e+02 5.687586e+07 2.596815e+12 1246 d39bff17 3276800 2.625536e+08 1.417018e+04 5.255501e+02 8.232874e+06 1.168218e+11 581 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 6.829247e+02 7.632991e+01 1.420483e+05 9.822018e+07 208 ff82dda0 7372800 8.856576e+08 6.393638e+03 3.362739e+02 3.650767e+06 2.340625e+10 571 d39bff17 3276800 2.625536e+08 2.602204e+03 1.876810e+02 6.895839e+05 1.803772e+09 265 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 6.842707e+02 6.860830e+01 1.211159e+05 8.370922e+07 177 ff82dda0 7372800 8.856576e+08 6.416842e+03 2.746569e+02 2.951747e+06 1.897560e+10 460 d39bff17 3276800 2.625536e+08 2.601751e+03 2.008905e+02 6.114115e+05 1.600224e+09 235 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 2c1922b7 819200 3.287040e+07 6.827700e+02 7.214633e+01 1.297263e+05 8.956219e+07 190 ff82dda0 7372800 8.856576e+08 6.409443e+03 3.434222e+02 3.243178e+06 2.084664e+10 506 d39bff17 3276800 2.625536e+08 2.604891e+03 2.068197e+02 6.069396e+05 1.590978e+09 233 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/save_cl_top.mirage0000644000373600000000000000701112571536606022605 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 1.161593e+01 2.312881e+00 1.684310e+04 2.034051e+05 1450 4af260f6 14678040 0.000000e+00 2.793439e+01 6.208645e+00 2.807406e+04 8.229715e+05 1005 f2ff9ae5 34480152 0.000000e+00 5.388292e+01 1.191766e+01 4.930288e+04 2.786541e+06 915 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 3.349897e+01 6.495369e+00 7.939257e+03 2.759560e+05 237 4af260f6 14678040 0.000000e+00 3.814493e+01 8.460348e+00 1.609716e+04 6.442306e+05 422 f2ff9ae5 34480152 0.000000e+00 3.894616e+01 8.022125e+00 1.339748e+04 5.439182e+05 344 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 4.505725e+01 1.044174e+01 7.209160e+02 3.422697e+04 16 4af260f6 14678040 0.000000e+00 3.820932e+01 8.787776e+00 1.138638e+04 4.580788e+05 298 f2ff9ae5 34480152 0.000000e+00 4.714002e+01 1.060923e+01 1.343491e+04 6.654002e+05 285 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 2.397521e+01 2.109607e+00 5.754050e+02 1.390227e+04 24 4af260f6 14678040 0.000000e+00 3.827520e+01 8.943097e+00 9.453975e+03 3.816076e+05 247 f2ff9ae5 34480152 0.000000e+00 5.567087e+01 1.159966e+01 8.127947e+03 4.721345e+05 146 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_22.attila0000644000373600000000000000702512571536606024712 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 2.587052e+04 1.487038e+03 5.386241e+07 1.398052e+12 2082 24c84a50 11059200 0.000000e+00 8.218890e+04 3.347888e+03 1.244340e+08 1.024406e+13 1514 d46431bb 1228800 0.000000e+00 3.265838e+03 1.561177e+02 8.347482e+06 2.732382e+10 2556 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 9.047163e+02 4.943457e+01 7.022408e+06 6.372255e+09 7762 24c84a50 11059200 0.000000e+00 2.963966e+03 7.453353e+01 1.530888e+07 4.540369e+10 5165 d46431bb 1228800 0.000000e+00 1.924610e+02 1.043827e+01 8.556817e+05 1.651698e+08 4446 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 8.810829e+02 4.167975e+01 6.874209e+06 6.070301e+09 7802 24c84a50 11059200 0.000000e+00 2.960803e+03 8.260112e+01 1.519780e+07 4.503271e+10 5133 d46431bb 1228800 0.000000e+00 1.894698e+02 9.561378e+00 8.340462e+05 1.584290e+08 4402 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 8.953024e+02 5.096374e+01 6.835634e+06 6.139790e+09 7635 24c84a50 11059200 0.000000e+00 2.963787e+03 5.048433e+01 1.524275e+07 4.518938e+10 5143 d46431bb 1228800 0.000000e+00 1.803248e+02 8.617192e+00 8.859357e+05 1.601210e+08 4913 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/chol_model_11.attila0000644000373600000000000000677512571536606022747 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 7.593370e+04 4.030251e+03 2.353945e+06 1.792473e+11 31 afdd228b 1638400 8.758624e+07 2.346245e+04 1.988237e+03 1.032348e+06 2.439534e+10 44 cea37d6d 409600 1.097392e+07 3.401100e+03 3.819888e+02 1.564506e+05 5.388163e+08 46 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 4.425357e+04 2.763302e+03 7.523107e+05 3.342224e+10 17 afdd228b 1638400 8.758624e+07 2.425311e+04 2.094515e+03 2.910373e+05 7.111204e+09 12 cea37d6d 409600 1.097392e+07 1.130795e+04 5.745206e+02 1.130795e+05 1.281997e+09 10 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 4.555777e+04 5.907293e+03 7.744821e+05 3.587692e+10 17 afdd228b 1638400 8.758624e+07 2.509024e+04 3.469720e+03 2.509024e+05 6.415590e+09 10 cea37d6d 409600 1.097392e+07 1.082278e+04 2.477308e+02 1.082278e+05 1.171939e+09 10 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 617e5fe6 3686400 2.953730e+08 4.828333e+04 3.379151e+03 5.311166e+05 2.576968e+10 11 afdd228b 1638400 8.758624e+07 2.737149e+04 3.217773e+03 2.737149e+05 7.595526e+09 10 cea37d6d 409600 1.097392e+07 1.143954e+04 1.654563e+02 1.143954e+05 1.308904e+09 10 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/cl_update.attila0000644000373600000000000000700712571536606022266 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 7.774706e+04 9.102018e+02 4.664824e+06 3.627260e+11 60 6d78e48f 4461600 0.000000e+00 9.929947e+03 1.596124e+02 1.797320e+06 1.785191e+10 181 8ec75d42 14753312 0.000000e+00 3.310870e+04 5.189822e+02 1.920304e+06 6.359440e+10 58 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 5.051327e+03 6.437605e+02 2.692357e+06 1.382086e+10 533 6d78e48f 4461600 0.000000e+00 1.009230e+03 9.724548e+01 3.835076e+05 3.906410e+08 380 8ec75d42 14753312 0.000000e+00 1.883088e+03 3.340290e+02 1.069594e+06 2.077513e+09 568 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 5.105276e+03 6.922431e+02 2.807902e+06 1.459867e+10 550 6d78e48f 4461600 0.000000e+00 1.012651e+03 9.766669e+01 3.686049e+05 3.767403e+08 364 8ec75d42 14753312 0.000000e+00 2.097710e+03 2.383227e+02 9.880215e+05 2.099334e+09 471 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 49ec0825 34613280 0.000000e+00 4.938766e+03 7.348710e+02 2.780525e+06 1.403640e+10 563 6d78e48f 4461600 0.000000e+00 1.022015e+03 1.088844e+02 3.740577e+05 3.866319e+08 366 8ec75d42 14753312 0.000000e+00 1.829845e+03 3.604651e+02 8.893047e+05 1.690438e+09 486 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_22.mirage0000644000373600000000000000702512571536606024700 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 2.645658e+04 4.968429e+02 5.820449e+07 1.540435e+12 2200 24c84a50 11059200 0.000000e+00 8.756135e+04 9.752924e+02 1.866808e+08 1.634805e+13 2132 d46431bb 1228800 0.000000e+00 3.234444e+03 8.877025e+01 1.325799e+07 4.291452e+10 4099 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 8.760921e+02 3.574580e+01 7.074444e+06 6.208182e+09 8075 24c84a50 11059200 0.000000e+00 2.988744e+03 8.136061e+01 2.363499e+07 7.069126e+10 7908 d46431bb 1228800 0.000000e+00 1.911930e+02 1.434147e+01 1.248108e+06 2.399722e+08 6528 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 9.198175e+02 4.677043e+01 6.931745e+06 6.392425e+09 7536 24c84a50 11059200 0.000000e+00 3.016176e+03 6.737054e+01 2.311597e+07 6.975663e+10 7664 d46431bb 1228800 0.000000e+00 1.910500e+02 1.400155e+01 1.317099e+06 2.529832e+08 6894 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f0ac7beb 4915200 0.000000e+00 9.143628e+02 4.685332e+01 6.720566e+06 6.161171e+09 7350 24c84a50 11059200 0.000000e+00 3.002393e+03 6.861698e+01 2.339765e+07 7.028562e+10 7793 d46431bb 1228800 0.000000e+00 1.898967e+02 1.421585e+01 1.327568e+06 2.535136e+08 6991 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_21.mirage0000644000373600000000000000701112571536606024653 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.762618e+04 9.983022e+02 6.575032e+06 1.818802e+11 238 ff82dda0 14745600 0.000000e+00 9.068591e+04 1.985325e+03 1.324014e+07 1.201270e+12 146 2c1922b7 1638400 0.000000e+00 3.579286e+03 2.361748e+02 1.449611e+06 5.211162e+09 405 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 1 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 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 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.072463e+03 3.421274e+02 6.590431e+05 1.403064e+09 318 ff82dda0 14745600 0.000000e+00 6.791353e+03 1.183637e+03 1.195278e+06 8.364131e+09 176 2c1922b7 1638400 0.000000e+00 6.128580e+02 1.104622e+02 1.378931e+05 8.725430e+07 225 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.129169e+03 3.327197e+02 5.024838e+05 1.095999e+09 236 ff82dda0 14745600 0.000000e+00 6.700018e+03 1.125184e+03 1.139003e+06 7.846568e+09 170 2c1922b7 1638400 0.000000e+00 6.207819e+02 1.142635e+02 1.440214e+05 9.243491e+07 232 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/save_cl_top.attila0000644000373600000000000000700612571536606022623 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 4.346555e+01 9.370422e+00 2.103733e+04 9.568966e+05 484 fb4b8624 4427800 0.000000e+00 1.080055e+01 2.408554e+00 6.631537e+03 7.518614e+04 614 4af260f6 14678040 0.000000e+00 2.045608e+01 4.186697e+00 1.294870e+04 2.759751e+05 633 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.184284e+01 5.707419e+00 4.840111e+03 1.590742e+05 152 fb4b8624 4427800 0.000000e+00 3.194475e+01 5.964283e+00 1.150011e+03 3.801743e+04 36 4af260f6 14678040 0.000000e+00 3.430576e+01 6.297323e+00 5.523228e+03 1.958632e+05 161 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 2.735681e+01 5.823931e+00 3.063963e+03 8.761910e+04 112 fb4b8624 4427800 0.000000e+00 3.161427e+01 5.733859e+00 2.212999e+03 7.226375e+04 70 4af260f6 14678040 0.000000e+00 3.666193e+01 6.692591e+00 6.819119e+03 2.583331e+05 186 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n f2ff9ae5 34480152 0.000000e+00 3.900993e+01 8.465923e+00 7.489907e+03 3.059418e+05 192 fb4b8624 4427800 0.000000e+00 3.364966e+01 7.354940e+00 1.278687e+03 4.508300e+04 38 4af260f6 14678040 0.000000e+00 2.853135e+01 5.469952e+00 8.730594e+03 2.582513e+05 306 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_sgemm_gemm.mirage0000644000373600000000000000700612571536606024026 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 1.352609e+04 3.616534e+02 1.082087e+06 1.464687e+10 80 492beed5 33177600 7.077888e+09 3.550396e+05 8.949994e+03 2.840317e+07 1.009066e+13 80 4220e23d 14745600 2.097152e+09 1.078112e+05 1.983800e+03 8.624897e+06 9.301755e+11 80 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.589631e+02 8.406511e+00 6.787320e+04 4.473321e+07 103 492beed5 33177600 7.077888e+09 1.151398e+04 9.050114e+01 1.220482e+06 1.405348e+10 106 4220e23d 14745600 2.097152e+09 5.574713e+03 3.353004e+02 5.909196e+05 3.306125e+09 106 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.663664e+02 8.616537e+01 6.796937e+04 4.604980e+07 102 492beed5 33177600 7.077888e+09 1.150036e+04 8.404527e+01 1.207538e+06 1.388786e+10 105 4220e23d 14745600 2.097152e+09 5.579034e+03 3.672012e+02 5.857985e+05 3.282348e+09 105 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 0b0b0ce8 3686400 2.621440e+08 6.181769e+02 5.174143e+01 6.181769e+04 3.848198e+07 100 492beed5 33177600 7.077888e+09 1.148096e+04 7.289415e+01 1.205501e+06 1.384086e+10 105 4220e23d 14745600 2.097152e+09 5.580581e+03 3.970717e+02 5.859610e+05 3.286558e+09 105 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_slu_lu_model_12.attila0000644000373600000000000000700412571536606024706 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 1.416946e+04 8.998511e+02 5.341885e+06 7.599687e+10 377 ff82dda0 7372800 0.000000e+00 4.394377e+04 1.700468e+03 1.138144e+07 5.008920e+11 259 2c1922b7 819200 0.000000e+00 1.978198e+03 1.079993e+02 7.517154e+05 1.491475e+09 380 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.676312e+03 2.039650e+02 4.549731e+05 1.224722e+09 170 ff82dda0 7372800 0.000000e+00 6.450199e+03 3.193507e+02 5.482669e+05 3.545099e+09 85 2c1922b7 819200 0.000000e+00 7.090855e+02 1.344985e+02 5.247233e+04 3.854602e+07 74 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.648361e+03 2.330106e+02 2.913197e+05 7.774920e+08 110 ff82dda0 7372800 0.000000e+00 3.907893e+03 1.767346e+02 3.790657e+05 1.484378e+09 97 2c1922b7 819200 0.000000e+00 5.977702e+02 1.137267e+02 6.695026e+04 4.146945e+07 112 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 3276800 0.000000e+00 2.649815e+03 2.112061e+02 4.054218e+05 1.081118e+09 153 ff82dda0 7372800 0.000000e+00 6.517136e+03 3.918474e+02 3.454082e+05 2.259210e+09 53 2c1922b7 819200 0.000000e+00 6.507707e+02 8.750699e+01 4.750626e+04 3.147468e+07 73 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/save_cl_bottom.mirage0000644000373600000000000000700212571536606023307 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 1.291871e+01 2.707056e+00 1.452063e+04 1.958246e+05 1124 4af260f6 14678040 0.000000e+00 2.737328e+01 5.740626e+00 2.241872e+04 6.406639e+05 819 f2ff9ae5 34480152 0.000000e+00 4.727593e+01 1.006422e+01 4.179193e+04 2.065291e+06 884 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 4.529760e+01 1.106616e+01 3.940891e+03 1.891669e+05 87 4af260f6 14678040 0.000000e+00 5.186998e+01 9.163546e+00 2.386019e+03 1.276254e+05 46 f2ff9ae5 34480152 0.000000e+00 5.555996e+01 1.123960e+01 2.777998e+03 1.606619e+05 50 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 4.174505e+01 7.717897e+00 1.711547e+03 7.389082e+04 41 4af260f6 14678040 0.000000e+00 4.338701e+01 9.950636e+00 8.677401e+03 3.962895e+05 200 f2ff9ae5 34480152 0.000000e+00 5.523574e+01 1.243105e+01 2.154194e+03 1.250152e+05 39 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n fb4b8624 4427800 0.000000e+00 5.145250e+01 1.035300e+01 1.955195e+03 1.046727e+05 38 4af260f6 14678040 0.000000e+00 4.717138e+01 8.365012e+00 2.217055e+03 1.078703e+05 47 f2ff9ae5 34480152 0.000000e+00 4.374296e+01 8.852326e+00 3.455694e+03 1.573530e+05 79 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/chol_model_21.attila0000644000373600000000000000701112571536606022730 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 4.361594e+04 1.992990e+03 1.840593e+07 8.044680e+11 422 d39bff17 3276800 2.625536e+08 1.391260e+04 9.732436e+02 6.552836e+06 9.161314e+10 471 2c1922b7 819200 3.287040e+07 2.026126e+03 2.243730e+02 1.355478e+06 2.780050e+09 669 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.302421e+03 2.284702e+02 1.739468e+06 1.097727e+10 276 d39bff17 3276800 2.625536e+08 2.553136e+03 1.599096e+02 6.714747e+05 1.721091e+09 263 2c1922b7 819200 3.287040e+07 6.889531e+02 1.162392e+02 1.198778e+05 8.494121e+07 174 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.325409e+03 1.859324e+02 1.688884e+06 1.069211e+10 267 d39bff17 3276800 2.625536e+08 2.539349e+03 1.556256e+02 6.297585e+05 1.605183e+09 248 2c1922b7 819200 3.287040e+07 6.837878e+02 1.012279e+02 1.319710e+05 9.221787e+07 193 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n ff82dda0 7372800 8.856576e+08 6.297128e+03 2.218514e+02 1.542796e+06 9.727245e+09 245 d39bff17 3276800 2.625536e+08 2.528040e+03 1.085312e+02 7.255475e+05 1.837594e+09 287 2c1922b7 819200 3.287040e+07 6.470080e+02 5.924722e+01 1.598110e+05 1.042660e+08 247 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/chol_model_22.attila0000644000373600000000000000702512571536606022736 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 8.407559e+04 3.415249e+03 1.399859e+08 1.178881e+13 1665 f0ac7beb 4915200 5.242880e+08 2.610119e+04 1.422415e+03 4.251883e+07 1.113088e+12 1629 d46431bb 1228800 6.553600e+07 3.432588e+03 1.640071e+02 9.130685e+06 3.141343e+10 2660 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.795670e+03 5.624760e+01 1.818024e+07 5.084653e+10 6503 f0ac7beb 4915200 5.242880e+08 8.880682e+02 3.243424e+01 5.760010e+06 5.122105e+09 6486 d46431bb 1228800 6.553600e+07 2.022322e+02 1.071833e+01 1.116119e+06 2.263493e+08 5519 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.815870e+03 4.694553e+01 1.827781e+07 5.148226e+10 6491 f0ac7beb 4915200 5.242880e+08 8.961392e+02 3.565427e+01 5.741564e+06 5.153386e+09 6407 d46431bb 1228800 6.553600e+07 2.020566e+02 9.551669e+00 1.107876e+06 2.243540e+08 5483 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n 24c84a50 11059200 1.769472e+09 2.810209e+03 3.946230e+01 1.806121e+07 5.076578e+10 6427 f0ac7beb 4915200 5.242880e+08 8.833768e+02 3.092949e+01 5.707497e+06 5.048051e+09 6461 d46431bb 1228800 6.553600e+07 1.637484e+02 6.969807e+00 1.084015e+06 1.778273e+08 6620 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/codelets/42/starpu_dlu_lu_model_12.mirage0000644000373600000000000000701112571536606024653 00000000000000################## # Performance Model Version 42 #################### # CPUs # number of CPU devices 1 ############### # CPU_0 # number of workers on device CPU_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cpu_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.758103e+04 7.024890e+02 7.033162e+06 1.941076e+11 255 ff82dda0 14745600 0.000000e+00 9.143755e+04 1.725750e+03 1.234407e+07 1.129114e+12 135 2c1922b7 1638400 0.000000e+00 3.516018e+03 1.528455e+02 1.613852e+06 5.685057e+09 459 #################### # CUDAs # number of CUDA devices 3 ############### # CUDA_0 # number of workers on device CUDA_0 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_0_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.131008e+03 3.294125e+02 6.755295e+05 1.473957e+09 317 ff82dda0 14745600 0.000000e+00 7.209283e+03 1.090675e+03 1.564414e+06 1.153644e+10 217 2c1922b7 1638400 0.000000e+00 6.237527e+02 1.148972e+02 1.210080e+05 7.804013e+07 194 ############### # CUDA_1 # number of workers on device CUDA_1 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_1_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.163459e+03 3.374464e+02 5.538454e+05 1.227372e+09 256 ff82dda0 14745600 0.000000e+00 6.895326e+03 1.111793e+03 1.234263e+06 8.731908e+09 179 2c1922b7 1638400 0.000000e+00 6.290993e+02 1.019490e+02 1.333690e+05 8.610581e+07 212 ############### # CUDA_2 # number of workers on device CUDA_2 1 ########## # 1 worker(s) in parallel # number of implementations 1 ##### # Model for cuda_2_impl_0 # number of entries 3 # sumlnx sumlnx2 sumlny sumlnxlny alpha beta n minx maxx 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 nan nan 0 0 0 # a b c nan nan nan # hash size flops mean (us) dev (us) sum sum2 n d39bff17 6553600 0.000000e+00 2.119354e+03 3.243594e+02 5.912998e+05 1.282527e+09 279 ff82dda0 14745600 0.000000e+00 6.998019e+03 1.239620e+03 1.070697e+06 7.727865e+09 153 2c1922b7 1638400 0.000000e+00 6.140937e+02 1.075567e+02 1.430838e+05 9.056234e+07 233 #################### # OPENCLs # number of OPENCLs devices 0 #################### # MICs # number of MIC devices 0 #################### # SCCs # number of SCC devices 0 starpu-1.1.5/tools/perfmodels/sampling/bus/0002755000373600000000000000000012571541161015736 500000000000000starpu-1.1.5/tools/perfmodels/sampling/bus/attila.platform.xml0000644000373600000000000002473612571536606021523 00000000000000 starpu-1.1.5/tools/perfmodels/sampling/bus/mirage.affinity0000644000373600000000000000036312571536606020665 00000000000000# 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.1.5/tools/perfmodels/sampling/bus/attila.affinity0000644000373600000000000000036312571536606020677 00000000000000# 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.1.5/tools/perfmodels/sampling/bus/mirage.bandwidth0000644000373600000000000001111412571536606021014 00000000000000# 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.1.5/tools/perfmodels/sampling/bus/mirage.config0000644000373600000000000000017612571536606020323 00000000000000# Current configuration 12 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.1.5/tools/perfmodels/sampling/bus/mirage.latency0000644000373600000000000001076512571536606020522 00000000000000# 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.1.5/tools/perfmodels/sampling/bus/attila.bandwidth0000644000373600000000000001111412571536606021026 00000000000000# 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.1.5/tools/perfmodels/sampling/bus/mirage.platform.xml0000644000373600000000000002473612571536606021511 00000000000000 starpu-1.1.5/tools/perfmodels/sampling/bus/attila.config0000644000373600000000000000017612571536606020335 00000000000000# Current configuration 12 # Number of CPUs 3 # Number of CUDA devices 3 # Number of OpenCL devices 0 # Number of MIC devices starpu-1.1.5/tools/perfmodels/sampling/bus/attila.latency0000644000373600000000000001076412571536606020533 00000000000000# 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.1.5/tools/Makefile.in0000644000373600000000000023151012571536634013171 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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_lp2paje$(EXEEXT) TESTS = $(am__EXEEXT_5) @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_2) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_5) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_5) @STARPU_USE_FXT_TRUE@am__append_1 = \ @STARPU_USE_FXT_TRUE@ starpu_fxt_tool \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats @STARPU_USE_FXT_TRUE@am__append_2 = \ @STARPU_USE_FXT_TRUE@ starpu_fxt_tool \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats @STARPU_LONG_CHECK_TRUE@am__append_3 = \ @STARPU_LONG_CHECK_TRUE@ starpu_calibrate_bus @STARPU_HAVE_WINDOWS_FALSE@am__append_4 = \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_display \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_plot @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@am__append_5 = \ @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ starpu_fxt_tool.1 \ @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ starpu_fxt_stats.1 subdir = tools DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/starpu_codelet_profile.in \ $(srcdir)/starpu_codelet_histo_profile.in \ $(srcdir)/starpu_workers_activity.in \ $(srcdir)/starpu_paje_draw_histogram.in \ $(srcdir)/starpu_paje_state_stats.in \ $(srcdir)/starpu_paje_summary.in $(srcdir)/starpu_paje_sort.in \ $(dist_bin_SCRIPTS) $(top_srcdir)/build-aux/depcomp \ $(dist_man1_MANS) $(dist_pkgdata_DATA) \ $(dist_pkgdata_perfmodels_sampling_bus_DATA) \ $(dist_pkgdata_perfmodels_sampling_codelets_DATA) \ $(top_srcdir)/build-aux/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = starpu_codelet_profile \ starpu_codelet_histo_profile starpu_workers_activity \ starpu_paje_draw_histogram starpu_paje_state_stats \ starpu_paje_summary starpu_paje_sort CONFIG_CLEAN_VPATH_FILES = @STARPU_USE_FXT_TRUE@am__EXEEXT_1 = starpu_fxt_tool$(EXEEXT) \ @STARPU_USE_FXT_TRUE@ starpu_fxt_stats$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgdatadir)" \ "$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)" \ "$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)" \ "$(DESTDIR)$(STARPU_MVSC_dir)" @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_2 = loader$(EXEEXT) @STARPU_LONG_CHECK_TRUE@am__EXEEXT_3 = starpu_calibrate_bus$(EXEEXT) @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_4 = \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_display$(EXEEXT) \ @STARPU_HAVE_WINDOWS_FALSE@ starpu_perfmodel_plot$(EXEEXT) am__EXEEXT_5 = $(am__EXEEXT_1) $(am__EXEEXT_3) \ starpu_machine_display$(EXEEXT) $(am__EXEEXT_4) PROGRAMS = $(bin_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 = starpu_calibrate_bus_SOURCES = starpu_calibrate_bus.c starpu_calibrate_bus_OBJECTS = starpu_calibrate_bus.$(OBJEXT) starpu_calibrate_bus_LDADD = $(LDADD) starpu_fxt_stats_SOURCES = starpu_fxt_stats.c starpu_fxt_stats_OBJECTS = \ starpu_fxt_stats-starpu_fxt_stats.$(OBJEXT) am__DEPENDENCIES_1 = @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) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(dist_bin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(loader_SOURCES) starpu_calibrate_bus.c starpu_fxt_stats.c \ starpu_fxt_tool.c starpu_lp2paje.c starpu_machine_display.c \ starpu_perfmodel_display.c starpu_perfmodel_plot.c DIST_SOURCES = $(am__loader_SOURCES_DIST) starpu_calibrate_bus.c \ starpu_fxt_stats.c starpu_fxt_tool.c starpu_lp2paje.c \ starpu_machine_display.c starpu_perfmodel_display.c \ starpu_perfmodel_plot.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) DATA = $(dist_pkgdata_DATA) \ $(dist_pkgdata_perfmodels_sampling_bus_DATA) \ $(dist_pkgdata_perfmodels_sampling_codelets_DATA) \ $(nobase_STARPU_MVSC__DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = AM_CFLAGS = $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_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 dist_bin_SCRIPTS = starpu_workers_activity \ starpu_codelet_histo_profile starpu_codelet_profile \ starpu_paje_draw_histogram starpu_paje_state_stats dist_pkgdata_DATA = gdbinit pkgdata_perfmodels_sampling_busdir = $(datarootdir)/starpu/perfmodels/sampling/bus pkgdata_perfmodels_sampling_codeletsdir = $(datarootdir)/starpu/perfmodels/sampling/codelets/42 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/mirage.affinity \ perfmodels/sampling/bus/mirage.bandwidth \ perfmodels/sampling/bus/mirage.config \ perfmodels/sampling/bus/mirage.latency \ perfmodels/sampling/bus/mirage.platform.xml dist_pkgdata_perfmodels_sampling_codelets_DATA = \ perfmodels/sampling/codelets/42/chol_model_11.attila \ perfmodels/sampling/codelets/42/chol_model_21.attila \ perfmodels/sampling/codelets/42/chol_model_22.attila \ perfmodels/sampling/codelets/42/cl_update.attila \ perfmodels/sampling/codelets/42/save_cl_bottom.attila \ perfmodels/sampling/codelets/42/save_cl_top.attila \ perfmodels/sampling/codelets/42/starpu_sgemm_gemm.attila \ perfmodels/sampling/codelets/42/starpu_dgemm_gemm.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_11.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_12.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_21.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_22.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_11.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_12.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_21.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_22.attila \ perfmodels/sampling/codelets/42/chol_model_11.mirage \ perfmodels/sampling/codelets/42/chol_model_21.mirage \ perfmodels/sampling/codelets/42/chol_model_22.mirage \ perfmodels/sampling/codelets/42/cl_update.mirage \ perfmodels/sampling/codelets/42/save_cl_bottom.mirage \ perfmodels/sampling/codelets/42/save_cl_top.mirage \ perfmodels/sampling/codelets/42/starpu_sgemm_gemm.mirage \ perfmodels/sampling/codelets/42/starpu_dgemm_gemm.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_11.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_12.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_21.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_22.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_11.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_12.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_21.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_22.mirage EXTRA_DIST = \ dev/rename.sed \ dev/rename.sh \ mvsc/starpu_clean.bat \ mvsc/starpu_open.bat \ mvsc/starpu_exec.bat \ mvsc/starpu_var.bat \ mvsc/starpu.sln \ mvsc/starpu/starpu.vcxproj \ perfmodels/README \ valgrind/libc.suppr \ valgrind/hwloc.suppr \ valgrind/libnuma.suppr \ valgrind/openmpi.suppr \ valgrind/pthread.suppr \ valgrind/starpu.suppr \ tsan/starpu.suppr CLEANFILES = *.gcno *.gcda *.linkinfo ##################################### # What to install and what to check # ##################################### STARPU_TOOLS = $(am__append_2) $(am__append_3) starpu_machine_display \ $(am__append_4) @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)/tools/$(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) @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_perfmodel_plot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) @STARPU_HAVE_WINDOWS_TRUE@STARPU_MVSC_dir = $(bindir) @STARPU_HAVE_WINDOWS_TRUE@nobase_STARPU_MVSC__DATA = \ @STARPU_HAVE_WINDOWS_TRUE@ mvsc/starpu_clean.bat \ @STARPU_HAVE_WINDOWS_TRUE@ mvsc/starpu_open.bat \ @STARPU_HAVE_WINDOWS_TRUE@ mvsc/starpu_exec.bat \ @STARPU_HAVE_WINDOWS_TRUE@ mvsc/starpu_var.bat \ @STARPU_HAVE_WINDOWS_TRUE@ mvsc/starpu.sln \ @STARPU_HAVE_WINDOWS_TRUE@ mvsc/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_lp2paje.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_workers_activity.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_codelet_profile.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_codelet_histo_profile.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_paje_draw_histogram.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ starpu_paje_state_stats.1 \ @STARPU_HAVE_HELP2MAN_TRUE@ $(am__append_5) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): starpu_codelet_profile: $(top_builddir)/config.status $(srcdir)/starpu_codelet_profile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_codelet_histo_profile: $(top_builddir)/config.status $(srcdir)/starpu_codelet_histo_profile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_workers_activity: $(top_builddir)/config.status $(srcdir)/starpu_workers_activity.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_draw_histogram: $(top_builddir)/config.status $(srcdir)/starpu_paje_draw_histogram.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_state_stats: $(top_builddir)/config.status $(srcdir)/starpu_paje_state_stats.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_summary: $(top_builddir)/config.status $(srcdir)/starpu_paje_summary.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ starpu_paje_sort: $(top_builddir)/config.status $(srcdir)/starpu_paje_sort.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list loader$(EXEEXT): $(loader_OBJECTS) $(loader_DEPENDENCIES) $(EXTRA_loader_DEPENDENCIES) @rm -f loader$(EXEEXT) $(AM_V_CCLD)$(LINK) $(loader_OBJECTS) $(loader_LDADD) $(LIBS) starpu_calibrate_bus$(EXEEXT): $(starpu_calibrate_bus_OBJECTS) $(starpu_calibrate_bus_DEPENDENCIES) $(EXTRA_starpu_calibrate_bus_DEPENDENCIES) @rm -f starpu_calibrate_bus$(EXEEXT) $(AM_V_CCLD)$(LINK) $(starpu_calibrate_bus_OBJECTS) $(starpu_calibrate_bus_LDADD) $(LIBS) starpu_fxt_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) install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-dist_binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader-loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_calibrate_bus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_stats-starpu_fxt_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_fxt_tool-starpu_fxt_tool.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_lp2paje.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_machine_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_perfmodel_plot-starpu_perfmodel_plot.Po@am__quote@ .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_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_MVSC_DATA: $(nobase_STARPU_MVSC__DATA) @$(NORMAL_INSTALL) @list='$(nobase_STARPU_MVSC__DATA)'; test -n "$(STARPU_MVSC_dir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_MVSC_dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_MVSC_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_MVSC_dir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_MVSC_dir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(STARPU_MVSC_dir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(STARPU_MVSC_dir)/$$dir" || exit $$?; }; \ done uninstall-nobase_STARPU_MVSC_DATA: @$(NORMAL_UNINSTALL) @list='$(nobase_STARPU_MVSC__DATA)'; test -n "$(STARPU_MVSC_dir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(STARPU_MVSC_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; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? starpu_fxt_tool.log: starpu_fxt_tool$(EXEEXT) @p='starpu_fxt_tool$(EXEEXT)'; \ b='starpu_fxt_tool'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_fxt_stats.log: starpu_fxt_stats$(EXEEXT) @p='starpu_fxt_stats$(EXEEXT)'; \ b='starpu_fxt_stats'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_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_perfmodel_display.log: starpu_perfmodel_display$(EXEEXT) @p='starpu_perfmodel_display$(EXEEXT)'; \ b='starpu_perfmodel_display'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) starpu_perfmodel_plot.log: starpu_perfmodel_plot$(EXEEXT) @p='starpu_perfmodel_plot$(EXEEXT)'; \ b='starpu_perfmodel_plot'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(pkgdata_perfmodels_sampling_busdir)" "$(DESTDIR)$(pkgdata_perfmodels_sampling_codeletsdir)" "$(DESTDIR)$(STARPU_MVSC_dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @STARPU_HAVE_HELP2MAN_FALSE@clean-local: clean: clean-recursive clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_pkgdataDATA \ install-dist_pkgdata_perfmodels_sampling_busDATA \ install-dist_pkgdata_perfmodels_sampling_codeletsDATA \ install-man install-nobase_STARPU_MVSC_DATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-dist_binSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-dist_binSCRIPTS \ uninstall-dist_pkgdataDATA \ uninstall-dist_pkgdata_perfmodels_sampling_busDATA \ uninstall-dist_pkgdata_perfmodels_sampling_codeletsDATA \ uninstall-man uninstall-nobase_STARPU_MVSC_DATA uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-binPROGRAMS \ clean-checkPROGRAMS clean-generic clean-libtool clean-local \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-dist_binSCRIPTS install-dist_pkgdataDATA \ install-dist_pkgdata_perfmodels_sampling_busDATA \ install-dist_pkgdata_perfmodels_sampling_codeletsDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-man1 install-nobase_STARPU_MVSC_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_MVSC_DATA @STARPU_HAVE_HELP2MAN_TRUE@starpu_calibrate_bus.1: starpu_calibrate_bus$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_machine_display.1: starpu_machine_display$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_perfmodel_display.1: starpu_perfmodel_display$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_perfmodel_plot.1: starpu_perfmodel_plot$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_lp2paje.1: starpu_lp2paje$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_workers_activity.1: starpu_workers_activity @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_codelet_profile.1: starpu_codelet_profile @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_codelet_histo_profile.1: starpu_codelet_histo_profile @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_paje_draw_histogram.1: starpu_paje_draw_histogram @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@starpu_paje_state_stats.1: starpu_paje_state_stats @STARPU_HAVE_HELP2MAN_TRUE@ chmod +x $< @STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@starpu_fxt_tool.1: starpu_fxt_tool$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@starpu_fxt_stats.1: starpu_fxt_stats$(EXEEXT) @STARPU_HAVE_HELP2MAN_TRUE@@STARPU_USE_FXT_TRUE@ help2man --no-discard-stderr -N --output=$@ ./$< @STARPU_HAVE_HELP2MAN_TRUE@clean-local: @STARPU_HAVE_HELP2MAN_TRUE@ $(RM) $(dist_man1_MANS) 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 # 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.1.5/tools/starpu_codelet_histo_profile.10000644000373600000000000000121012571536746017145 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_CODELET_HISTO_PROFILE "1" "September 2015" "starpu_codelet_histo_profile (StarPU) 1.1.5" "User Commands" .SH NAME starpu_codelet_histo_profile \- manual page for starpu_codelet_histo_profile (StarPU) 1.1.5 .SH SYNOPSIS .B starpu_codelet_histo_profile \fIdistrib.data\fR .SH DESCRIPTION Offline tool to draw codelet profile histogram 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.1.5/tools/starpu_fxt_tool.c0000644000373600000000000000703112571536604014520 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2013 Universite de Bordeaux 1 * Copyright (C) 2012-2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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(char **argv) { 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. This can be specified several\n"); fprintf(stderr, " times for MPI execution 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-counter set the FxT no counter option\n"); fprintf(stderr, " -no-bus set the FxT no bus option\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, "Reports bugs to <"PACKAGE_BUGREPORT">."); fprintf(stderr, "\n"); } static struct starpu_fxt_options options; static void parse_args(int argc, char **argv) { /* Default options */ starpu_fxt_options_init(&options); /* We want to support arguments such as "fxt_tool -i trace_*" */ unsigned reading_input_filenames = 0; int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { options.per_task_colour = 1; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-o") == 0) { options.out_paje_path = argv[++i]; reading_input_filenames = 0; continue; } if (strcmp(argv[i], "-i") == 0) { options.filenames[options.ninputfiles++] = argv[++i]; reading_input_filenames = 1; continue; } if (strcmp(argv[i], "-no-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], "-h") == 0 || strcmp(argv[i], "--help") == 0) { usage(argv); 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); } /* 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(argv); exit(77); } } int main(int argc, char **argv) { parse_args(argc, argv); starpu_fxt_generate_trace(&options); return 0; } starpu-1.1.5/tools/gdbinit0000644000373600000000000004022512571536606012467 00000000000000 # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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-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 _starpu_use_fxt == 1 if $job->model_name printf "\tmodel_name:\t\t\t<%s>\n", $job->model_name end end end end document starpu-print-job Prints a StarPU job end define starpu-print-task set language c set $task = (struct starpu_task *)$arg0 set $job = (struct _starpu_job *)$task->starpu_private set $status=0 if $task->status == 0 set $status="STARPU_TASK_INVALID" end if $task->status == 1 set $status="STARPU_TASK_BLOCKED" end if $task->status == 2 set $status="STARPU_TASK_READY" end if $task->status == 3 set $status="STARPU_TASK_RUNNING" end if $task->status == 4 set $status="STARPU_TASK_FINISHED" end if $task->status == 5 set $status="STARPU_TASK_BLOCKED_ON_TAG" end if $task->status == 6 set $status="STARPU_TASK_BLOCKED_ON_TASK" end if $task->status == 7 set $status="STARPU_TASK_BLOCKED_ON_DATA" end printf "StarPU Task (%p)\n", $task printf "\tcodelet:\t\t\t<%p>\n", $task->cl printf "\tcallback:\t\t\t<%p>\n", $task->callback_func printf "\tsynchronous:\t\t\t<%d>\n", $task->synchronous printf "\texecute_on_a_specific_worker:\t<%d>\n", $task->execute_on_a_specific_worker printf "\tworkerid:\t\t\t<%d>\n", $task->workerid printf "\tdetach:\t\t\t\t<%d>\n", $task->detach printf "\tdestroy:\t\t\t<%d>\n", $task->destroy printf "\tregenerate:\t\t\t<%d>\n", $task->regenerate printf "\tstatus:\t\t\t\t<%s>\n", $status printf "\tjob:\t\t\t\t<%p>\n", $job printf "\tndeps:\t\t\t\t<%u>\n", $job->job_successors->ndeps printf "\tndeps_completed:\t\t<%u>\n", $job->job_successors->ndeps_completed printf "\tnsuccs:\t\t\t\t<%u>\n", $job->job_successors->nsuccs if $job starpu-print-job $job end end document starpu-print-task Prints a StarPU task end define starpu-tasks-on-worker set language c set $worker=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 $numtopology->nworkers printf "Worker %s\n", 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 $numtopology->nworkers set $worker=&config->workers[$num] if $worker->status == STATUS_INVALID set $status="INVALID" end if $worker->status == STATUS_UNKNOWN set $status="UNKNOWN" end if $worker->status == STATUS_INITIALIZING set $status="INITIALIZING" end if $worker->status == STATUS_EXECUTING set $status="EXECUTING" end if $worker->status == STATUS_CALLBACK set $status="CALLBACK" end if $worker->status == STATUS_SCHEDULING set $status="SCHEDULING" end if $worker->status == STATUS_SLEEPING set $status="SLEEPING" end if $worker->status == STATUS_WAKING_UP set $status="WAKING_UP" end printf "[%2d] %-40s %-4d %-4d %-5d %-6d %-8d %-9d %-13d %s\n", $num, $worker->name, $worker->arch, $worker->worker_mask, \ $worker->devid, $worker->bindid, $worker->workerid, $worker->worker_is_running, $worker->worker_is_initialized, $status set $num = $num + 1 end end document starpu-workers Prints a list of the StarPU workers end define starpu-tags printf "tags htbl %p\n", tag_htbl printf "TODO\n" end define starpu-tasks set language c set $num=0 set $nsubmitted=0 set $nready=0 while $numtopology->nsched_ctxs set $nsubmitted = $nsubmitted + config->sched_ctxs[$num]->tasks_barrier->barrier->reached_start set $nready = $nready + 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 < config.topology.nworkers set $task = config.workers[$n].current_task if ($task) printf "worker %d:\n", $n starpu-print-task $task set $j = (struct _starpu_job *) $task->starpu_private set $nsuccs = $j->job_successors.nsuccs set $i = 0 while $i < $nsuccs set $cg = $j->job_successors.succ[$i] if ($cg->cg_type == 1) # STARPU_CG_APPS printf "waited for by application" end if ($cg->cg_type == 2) # STARPU_CG_TAG printf "will produce tag %x\n", $cg->succ.tag end if ($cg->cg_type == 4) # STARPU_CG_TASK printf "dep of task %p\n", $cg->succ.job starpu-print-task $cg->succ.job->task end set $i = $i + 1 end end set $n = $n + 1 end if (tag_htbl) printf "TODO: tags\n" end print "TODO: complete\n" 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 printf "Home node %d\n", $data->home_node printf "RWlock refs %d\n", $data->refcnt printf "Busy count %d\n", $data->busy_count printf "Current mode " starpu-print-mode $data->current_mode printf "\n" if $data->current_mode & (4|8) set $n = 0 while $n < config.topology.nworkers set $replicate = $data->per_worker[$n] printf "Worker %2d %10s:", $n, 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 < 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 $n = $n + 1 end end printf "Post sync tasks\n" set $tasklist = $data->post_sync_tasks while $tasklist != 0x0 starpu-print-task $tasklist->task set $tasklist = $tasklist->next end printf "Requester tasks\n" set $requesterlist = $data->req_list._head while $requesterlist != 0x0 printf "mode: " starpu-print-mode $requesterlist->mode printf "\n" starpu-print-job $requesterlist->j set $requesterlist = $requesterlist->_next end 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 < 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 < descr.nnodes set $replicate = &$data->per_node[$n] if $replicate.state == 0 set $replicate_n_owners = $replicate_n_owners + 1 end if $replicate.state == 1 set $replicate_n_shared = $replicate_n_shared + 1 end if $replicate.state == 2 set $replicate_n_invalid = $replicate_n_invalid + 1 end if $replicate.initialized set $replicate_n_initialized = $replicate_n_initialized + 1 end if $replicate.allocated set $replicate_n_allocated = $replicate_n_allocated + 1 set $data_allocated = 1 end set $n = $n + 1 end if $data_allocated set $data_n_allocated = $data_n_allocated + 1 end end set $entry = (struct handle_entry *) $entry.hh.next end printf "Number of handles: %d\n", $data_n printf "Number of allocated handles: %d\n", $data_n_allocated printf "Number of OWNER replicates: %d\n", $replicate_n_owners printf "Number of SHARED replicates: %d\n", $replicate_n_shared printf "Number of INVALID replicates: %d\n", $replicate_n_invalid printf "Number of initialized replicates: %d\n", $replicate_n_initialized printf "Number of allocated replicates: %d\n", $replicate_n_allocated printf "Number of per-worker handles: %d\n", $pw_data_n printf "Number of OWNER per-worker replicates: %d\n", $pw_replicate_n_owners printf "Number of SHARED per-worker replicates: %d\n", $pw_replicate_n_shared printf "Number of INVALID per-worker replicates: %d\n", $pw_replicate_n_invalid printf "Number of initialized per-worker replicates: %d\n", $pw_replicate_n_initialized printf "Number of allocated per-worker replicates: %d\n", $pw_replicate_n_allocated end define starpu-print-request set $r = (struct _starpu_data_request *)$arg0 printf "Request %p\n", $r printf "Refcnt %d\n", $r->refcnt printf "Handle %p\n", $r->handle printf "src_replicate %p\n", $r->src_replicate printf "dst_replicate %p\n", $r->dst_replicate printf "handling_node %d\n", $r->handling_node if ($r->mode & 1) printf "R" end if ($r->mode & 2) printf "W" end if ($r->mode & 4) printf "S" end if ($r->mode & 8) printf "X" end printf "\n" printf "completed: %d\n", $r->completed printf "prefetch: %d\n", $r->prefetch printf "retval: %d\n", $r->retval printf "ndeps: %d\n", $r->ndeps printf "next_req_count: %d\n", $r->next_req_count printf "comid: %u\n", $r->com_id set $c = $r->callbacks while $c != 0 printf "callback: %p %p\n", $c->callback_func, $c->callback_arg set $c = $c->next end end define starpu-print-requests set $node = 0 while $node < descr.nnodes printf "Node %u:\n", $node set $request = data_requests[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-print-prequests set $node = 0 while $node < descr.nnodes printf "Node %u:\n", $node printf "%u pending requests\n", data_requests_npending[$node] set $request = data_requests_pending[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-print-frequests set $node = 0 while $node < descr.nnodes printf "Node %u:\n", $node set $request = prefetch_requests[$node]._head while $request != 0 printf " Request %p: handle %p ", $request, $request->handle starpu-print-mode $request->mode printf "\n" set $request = $request->_next end set $node = $node + 1 end end define starpu-memusage set scheduler-locking on set $node = 0 while $node < descr.nnodes printf "Node %u:\n", $node set $total = 0 set $total_b = 0 set $wt = 0 set $wt_b = 0 set $home = 0 set $home_b = 0 set $redux = 0 set $redux_b = 0 set $relax = 0 set $relax_b = 0 set $noref = 0 set $noref_b = 0 set $nodataref = 0 set $nodataref_b = 0 set $nosubdataref = 0 set $nosubdataref_b = 0 set $mc = mc_list[$node]->_head while $mc != 0 set $handle = $mc->data set $size = _starpu_data_get_size($handle) set $total = $total + 1 set $total_b = $total_b + $size if $handle->wt_mask & (1 << $node) set $wt = $wt + 1 set $wt_b = $wt_b + $size end if $node == $handle->home_node set $home = $home + 1 set $home_b = $home_b + $size end if $mc->relaxed_coherency == 2 set $redux = $redux + 1 set $redux_b = $redux_b + $size end if $mc->relaxed_coherency == 1 set $relax = $relax + 1 set $relax_b = $relax_b + $size if $mc->replicate if $mc->replicate->refcnt == 0 set $noref = $noref + 1 set $noref_b = $noref_b + $size end end end if $mc->relaxed_coherency == 0 if (may_free_subtree($handle,$node)) set $nosubdataref = $nosubdataref + 1 set $nosubdataref_b = $nosubdataref_b + $size end if $handle->per_node[$node].refcnt == 0 set $nodataref = $nodataref + 1 set $nodataref_b = $nodataref_b + $size end end set $mc = $mc->_next end printf " Total: %u, %u\n", $total, $total_b printf " WT: %u, %u\n", $wt, $wt_b printf " home: %u, %u\n", $home, $home_b printf " redux: %u, %u\n", $redux, $redux_b printf " relax: %u, %u\n", $relax, $relax_b printf " noref: %u, %u\n", $noref, $noref_b printf " nosubdataref: %u, %u\n", $nosubdataref, $nosubdataref_b printf " nodataref: %u, %u\n", $nodataref, $nodataref_b set $node = $node + 1 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 currently running on workers starpu-tasks-on-worker prints a list of the tasks running on the given worker starpu-print-job prints a StarPU job starpu-print-task prints a StarPU task starpu-print-data prints a StarPU data handle starpu-print-datas prints all StarPU data handles starpu-print-datas-summary prints a summary of data handles starpu-print-request prints a StarPU data request starpu-print-requests prints all StarPU data requests starpu-print-prequests prints all pending StarPU data requests starpu-print-frequests prints all StarPU prefetch data requests starpu-tasks prints a list of the tasks flowing in StarPU starpu-tags prints a list of the tags known to StarPU starpu-memusage prints the memory node usage end starpu-1.1.5/tools/starpu_workers_activity0000755000373600000000000001213612571536665016065 00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010, 2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGNAME=$0 usage() { echo "Offline tool to display the activity of the workers during the execution." echo "" echo " The starpu_fxt_tool utility now generates a file named 'activity.data' which" echo " can be processed by this script to generate a plot named activity.eps" echo "" echo " Typical usage:" echo " ./starpu_fxt_tool -i /tmp/prof_file_foo" echo " $PROGNAME activity.data" echo "" echo "Options:" echo " -h, --help display this help and exit" echo " -v, --version output version information and exit" echo "" echo "Report bugs to " exit 0 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.1.5" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then usage fi if [ ! -f $1 ] ; then echo "Error. File <$1> not found" echo "" usage fi # The input file must be generated by the starpu_fxt_tool command inputfile_with_counters=$1 # We extract the counters out of the input file inputfile=.$inputfile_with_counters.activity inputfile_cnt_ready=.$1.cnt_ready inputfile_cnt_submitted=.$1.cnt_submitted set_profiling_list=.$1.set_profiling_list names=.$1.names grep "^set_profiling" $inputfile_with_counters > $set_profiling_list grep "0$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.disable grep "1$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.enable grep "^name" $inputfile_with_counters > $names grep -v "^cnt" $inputfile_with_counters | grep -v "^set_profiling" | grep -v "^name" > $inputfile grep "^cnt_ready" $inputfile_with_counters > $inputfile_cnt_ready grep "^cnt_submitted" $inputfile_with_counters > $inputfile_cnt_submitted # Count the number of workers in the trace workers=`cut -f1 $inputfile | sort -n | uniq` nworkers=`cut -f1 $inputfile | sort -n | uniq|wc -l` # size of the entire graph width=1.5 heigth=0.40 total_heigth=$(echo "$heigth + ($heigth * $nworkers)"|bc -l) # In case 3 arguments are provided, the 2nd (resp. 3rd) indicates the start # (resp. the end) of the interval to be displayed. if [ $# -ge 3 ]; then starttime=$2 endtime=$3 else #if profiling is explicitely enabled (resp. disabled) at some point, we set the # default start (rest. end) point when we enable (resp. disable) profiling for # the first time. profiling_enable_cnt=`wc -l $set_profiling_list.enable|sed -e "s/\(.*\) .*/\1/"` if [ $profiling_enable_cnt -ge 1 ]; then starttime=`head -1 $set_profiling_list.enable` else starttime=$(cut -f 2 $inputfile |sort -n|head -1) fi # TODO test if last disable > first enable profiling_disable_cnt=$(wc -l $set_profiling_list.disable|sed -e "s/\(.*\) .*/\1/") if [ $profiling_disable_cnt -ge 1 ]; then endtime=`tail -1 $set_profiling_list.disable` else endtime=$(cut -f 2 $inputfile |sort -n|tail -1) fi # The values in the file are in ms, we display seconds starttime=$(echo "$starttime * 0.001 "| bc -l) endtime=$(echo "$endtime * 0.001 "| bc -l) fi echo "START $starttime END $endtime" # Gnuplot header cat > gnuplotcmd << EOF set term postscript eps enhanced color set output "activity.eps" set xrange [$starttime:$endtime] set size $width,$total_heigth set multiplot; set origin 0.0,0.0; set size $width,$heigth; set logscale y plot "$inputfile_cnt_submitted" using (\$2/1000):3 with filledcurves lt rgb "#999999" title "submitted",\ "$inputfile_cnt_ready" using (\$2/1000):3 with filledcurves lt rgb "#000000" title "ready" set nologscale y EOF cnt=0 for worker in $workers do grep "^$worker" $inputfile > .tmp.$worker starty=$(echo "$heigth + ($heigth * $cnt)"|bc -l) cat >> gnuplotcmd << EOF set origin 0.0,$starty; set size $width,$heigth; set key off set yrange [0:100] set ylabel "$(cut -f2- $names |grep "^$worker" | cut -f2)" plot ".tmp.$worker" using (\$2/1000):(100) with filledcurves y1=0.0 lt rgb "#000000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*(\$4+\$5))/\$3) with filledcurves y1=0.0 lt rgb "#ff0000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*\$4)/\$3) with filledcurves y1=0.0 lt rgb "#00ff00" notitle EOF cnt=$(($cnt+1)) done cat >> gnuplotcmd << EOF unset multiplot EOF gnuplot < gnuplotcmd rm gnuplotcmd rm $inputfile rm $inputfile_cnt_ready rm $inputfile_cnt_submitted rm $set_profiling_list rm $set_profiling_list.enable rm $set_profiling_list.disable #rm $names for worker in $workers do rm .tmp.$worker done starpu-1.1.5/tools/starpu_perfmodel_plot.c0000644000373600000000000003623712571536606015711 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2014 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #ifdef STARPU_USE_FXT #include #endif #include #include #include // we need to browse the list associated to history-based models #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #define PROGNAME "starpu_perfmodel_plot" /* display all available models */ static int list = 0; /* what kernel ? */ static char *symbol = NULL; /* which architecture ? (NULL = all)*/ static char *archname = NULL; /* Unless a FxT file is specified, we just display the model */ static int no_fxt_file = 1; static int gflops = 0; #ifdef STARPU_USE_FXT static struct starpu_fxt_codelet_event *dumped_codelets; static struct starpu_fxt_options options; #endif #ifdef STARPU_USE_FXT static int archtype_is_found[STARPU_NARCH_VARIATIONS]; static char data_file_name[256]; #endif static char avg_file_name[256]; static char gnuplot_file_name[256]; 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\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -l display all available models\n"); fprintf(stderr, " -s specify the symbol\n"); fprintf(stderr, " -f draw GFlops instead of time\n"); fprintf(stderr, " -i input FxT files generated by StarPU\n"); fprintf(stderr, " -a specify the architecture (e.g. cpu, cpu:x, cuda, cuda_d, opencl, opencl_d)\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) { #ifdef STARPU_USE_FXT /* Default options */ starpu_fxt_options_init(&options); options.out_paje_path = NULL; options.activity_path = NULL; options.distrib_time_path = NULL; options.dag_path = NULL; options.dumped_codelets = &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) { symbol = argv[++i]; continue; } if (strcmp(argv[i], "-i") == 0) { reading_input_filenames = 1; #ifdef STARPU_USE_FXT options.filenames[options.ninputfiles++] = argv[++i]; no_fxt_file = 0; #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) { list = 1; continue; } if (strcmp(argv[i], "-f") == 0) { gflops = 1; continue; } if (strcmp(argv[i], "-a") == 0) { archname = argv[++i]; 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.filenames[options.ninputfiles++] = argv[i]; #endif continue; } } if (!symbol && !list) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(argv); exit(-1); } } 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 *model, enum starpu_perfmodel_archtype arch, int *first, unsigned nimpl) { char arch_name[256]; starpu_perfmodel_get_arch_name(arch, arch_name, 256, nimpl); struct starpu_perfmodel_per_arch *arch_model = &model->per_arch[arch][nimpl]; if (arch_model->regression.valid || arch_model->regression.nl_valid) fprintf(stderr,"Arch: %s\n", arch_name); #ifdef STARPU_USE_FXT if (!gflops && !no_fxt_file && archtype_is_found[arch] && nimpl == 0) { print_comma(gnuplot_file, first); fprintf(gnuplot_file, "\"< grep -w \\^%d %s\" using 2:3 title \"Profiling %s\"", arch, data_file_name, arch_name); } #endif /* Only display the regression model if we could actually build a model */ if (!gflops && arch_model->regression.valid && !arch_model->regression.nl_valid) { print_comma(gnuplot_file, first); fprintf(stderr, "\tLinear: y = alpha size ^ beta\n"); fprintf(stderr, "\t\talpha = %e\n", arch_model->regression.alpha * 0.001); fprintf(stderr, "\t\tbeta = %e\n", arch_model->regression.beta); fprintf(gnuplot_file, "0.001 * %f * x ** %f title \"Linear Regression %s\"", arch_model->regression.alpha, arch_model->regression.beta, arch_name); } if (!gflops && arch_model->regression.nl_valid) { print_comma(gnuplot_file, first); fprintf(stderr, "\tNon-Linear: y = a size ^b + c\n"); fprintf(stderr, "\t\ta = %e\n", arch_model->regression.a * 0.001); fprintf(stderr, "\t\tb = %e\n", arch_model->regression.b); fprintf(stderr, "\t\tc = %e\n", arch_model->regression.c * 0.001); fprintf(gnuplot_file, "0.001 * %f * x ** %f + 0.001 * %f title \"Non-Linear Regression %s\"", arch_model->regression.a, arch_model->regression.b, arch_model->regression.c, arch_name); } } static void display_history_based_perf_models(FILE *gnuplot_file, struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch1, enum starpu_perfmodel_archtype arch2, int *first) { char *command; FILE *datafile; unsigned arch; struct starpu_perfmodel_history_list *ptr; char arch_name[32]; int col; size_t len; unsigned long last, minimum = 0; len = 10 + strlen(avg_file_name) + 1; command = (char *) malloc(len); datafile = fopen(avg_file_name, "w"); free(command); col = 2; unsigned implid; for (arch = arch1; arch < arch2; arch++) { for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) { struct starpu_perfmodel_per_arch *arch_model = &model->per_arch[arch][implid]; starpu_perfmodel_get_arch_name((enum starpu_perfmodel_archtype) arch, arch_name, 32, implid); //ptrs[arch-arch1][implid] = ptr[arch-arch1][implid] = arch_model->list; if (arch_model->list) { print_comma(gnuplot_file, first); fprintf(gnuplot_file, "\"%s\" using 1:%d:%d with errorlines title \"Average %s\"", avg_file_name, col, col+1, arch_name); col += 2; } } } while (1) { last = minimum; minimum = ULONG_MAX; /* Get the next minimum */ for (arch = arch1; arch < arch2; arch++) for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) { struct starpu_perfmodel_per_arch *arch_model = &model->per_arch[arch][implid]; 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 (arch = arch1; arch < arch2; arch++) { for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) { struct starpu_perfmodel_per_arch *arch_model = &model->per_arch[arch][implid]; for (ptr = arch_model->list; ptr; ptr = ptr->next) { struct starpu_perfmodel_history_entry *entry = ptr->entry; if (entry->size == minimum) { if (gflops) fprintf(datafile, "\t%-15le\t%-15le", entry->flops / (entry->mean * 1000), entry->flops / ((entry->mean + entry->deviation) * 1000) - entry->flops / (entry->mean * 1000) ); else fprintf(datafile, "\t%-15le\t%-15le", 0.001*entry->mean, 0.001*entry->deviation); break; } } if (!ptr && arch_model->list) /* No value for this arch. */ fprintf(datafile, "\t\"\"\t\"\""); } } fprintf(datafile, "\n"); } fprintf(stderr, "\n"); fclose(datafile); } static void display_perf_models(FILE *gnuplot_file, struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch1, enum starpu_perfmodel_archtype arch2, int *first) { unsigned arch; unsigned implid; for (arch = arch1; arch < arch2; arch++) { for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) { display_perf_model(gnuplot_file, model, (enum starpu_perfmodel_archtype) arch, first, implid); } } display_history_based_perf_models(gnuplot_file, model, arch1, arch2, first); } #ifdef STARPU_USE_FXT static void dump_data_file(FILE *data_file) { memset(archtype_is_found, 0, STARPU_NARCH_VARIATIONS*sizeof(int)); int i; for (i = 0; i < options.dumped_codelets_count; i++) { /* Dump only if the symbol matches user's request */ if (strncmp(dumped_codelets[i].symbol, symbol, (FXT_MAX_PARAMS - 4)*sizeof(unsigned long)-1) == 0) { enum starpu_perfmodel_archtype archtype = dumped_codelets[i].archtype; archtype_is_found[archtype] = 1; size_t size = dumped_codelets[i].size; float time = dumped_codelets[i].time; fprintf(data_file, "%d %f %f\n", archtype, (float)size, time); } } } #endif static void display_selected_models(FILE *gnuplot_file, struct starpu_perfmodel *model) { 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", symbol); fprintf(gnuplot_file, "set title \"Model for codelet %s\"\n", symbol); fprintf(gnuplot_file, "set xlabel \"Total data size\"\n"); if (gflops) fprintf(gnuplot_file, "set ylabel \"GFlops\"\n"); else fprintf(gnuplot_file, "set ylabel \"Time (ms)\"\n"); fprintf(gnuplot_file, "\n"); fprintf(gnuplot_file, "set key top left\n"); fprintf(gnuplot_file, "set logscale x\n"); fprintf(gnuplot_file, "set logscale y\n"); fprintf(gnuplot_file, "\n"); /* If no input data is given to gnuplot, we at least need to specify an * arbitrary range. */ if (no_fxt_file) fprintf(gnuplot_file, "set xrange [1:10**9]\n\n"); int first = 1; fprintf(gnuplot_file, "plot\t"); if (archname == NULL) { /* display all architectures */ display_perf_models(gnuplot_file, model, (enum starpu_perfmodel_archtype) 0, (enum starpu_perfmodel_archtype) STARPU_NARCH_VARIATIONS, &first); } else { if (strcmp(archname, "cpu") == 0) { unsigned impl; for (impl = 0; impl < STARPU_MAXIMPLEMENTATIONS; impl++) { display_perf_model(gnuplot_file, model, STARPU_CPU_DEFAULT, &first, impl); } return; } int k; if (sscanf(archname, "cpu:%d", &k) == 1) { /* For combined CPU workers */ if ((k < 1) || (k > STARPU_MAXCPUS)) { fprintf(stderr, "Invalid CPU size\n"); exit(-1); } display_perf_models(gnuplot_file, model, (enum starpu_perfmodel_archtype) (STARPU_CPU_DEFAULT + k - 1), (enum starpu_perfmodel_archtype) (STARPU_CPU_DEFAULT + k), &first); return; } if (strcmp(archname, "cuda") == 0) { display_perf_models(gnuplot_file, model, STARPU_CUDA_DEFAULT, (enum starpu_perfmodel_archtype) (STARPU_CUDA_DEFAULT + STARPU_MAXCUDADEVS), &first); return; } /* There must be a cleaner way ! */ int gpuid; int nmatched; nmatched = sscanf(archname, "cuda_%d", &gpuid); if (nmatched == 1) { int archid = STARPU_CUDA_DEFAULT+ gpuid; if (archid < STARPU_OPENCL_DEFAULT) { display_perf_models(gnuplot_file, model, (enum starpu_perfmodel_archtype) archid, (enum starpu_perfmodel_archtype) (archid + 1), &first); return; } else { fprintf(stderr, "Invalid CUDA device %d (last valid one is %d)\n", gpuid, STARPU_MAXCUDADEVS-1); exit(-1); } } if (strcmp(archname, "opencl") == 0) { display_perf_models(gnuplot_file, model, STARPU_OPENCL_DEFAULT, (enum starpu_perfmodel_archtype) (STARPU_OPENCL_DEFAULT + STARPU_MAXOPENCLDEVS), &first); return; } /* There must be a cleaner way ! */ nmatched = sscanf(archname, "opencl_%d", &gpuid); if (nmatched == 1) { int archid = STARPU_OPENCL_DEFAULT+ gpuid; if (archid < STARPU_NARCH_VARIATIONS) { display_perf_models(gnuplot_file, model, (enum starpu_perfmodel_archtype) archid, (enum starpu_perfmodel_archtype) (archid + 1), &first); return; } else { fprintf(stderr, "Invalid OpenCL device %d (last valid one is %d)\n", gpuid, STARPU_MAXOPENCLDEVS-1); exit(-1); } } fprintf(stderr, "Unknown architecture requested, aborting.\n"); exit(-1); } } int main(int argc, char **argv) { int ret = 0; struct starpu_perfmodel model = {}; #if defined(_WIN32) && !defined(__CYGWIN__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); #endif parse_args(argc, argv); if (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(symbol, &model); if (ret) { _STARPU_DISP("The performance model for the symbol <%s> could not be loaded\n", symbol); } else { /* If some FxT input was specified, we put the points on the graph */ #ifdef STARPU_USE_FXT if (!no_fxt_file) { starpu_fxt_generate_trace(&options); snprintf(data_file_name, 256, "starpu_%s.data", symbol); FILE *data_file = fopen(data_file_name, "w+"); STARPU_ASSERT(data_file); dump_data_file(data_file); fclose(data_file); } #endif snprintf(gnuplot_file_name, 256, "starpu_%s.gp", symbol); snprintf(avg_file_name, 256, "starpu_%s_avg.data", symbol); FILE *gnuplot_file = fopen(gnuplot_file_name, "w+"); STARPU_ASSERT(gnuplot_file); display_selected_models(gnuplot_file, &model); fclose(gnuplot_file); /* Retrieve the current mode of the gnuplot executable */ struct stat sb; ret = stat(gnuplot_file_name, &sb); if (ret) { perror("stat"); STARPU_ABORT(); } /* Make the gnuplot scrit executable for the owner */ ret = chmod(gnuplot_file_name, sb.st_mode|S_IXUSR); if (ret) { perror("chmod"); STARPU_ABORT(); } _STARPU_DISP("Gnuplot file <%s> generated\n", gnuplot_file_name); } } starpu_perfmodel_free_sampling_directories(); return ret; } starpu-1.1.5/tools/starpu_machine_display.10000644000373600000000000000134712571536751015740 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_MACHINE_DISPLAY "1" "September 2015" "starpu_machine_display (StarPU) 1.1.5" "User Commands" .SH NAME starpu_machine_display \- manual page for starpu_machine_display (StarPU) 1.1.5 .SH DESCRIPTION Show the processing units that StarPU can use, and the .IP bandwitdh and affinity measured between the memory nodes. .PP .IP Usage: starpu_machine_display [OPTION] .PP .IP 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\-f\fR, \fB\-\-force\fR force bus sampling and show measures .PP .IP Report bugs to . starpu-1.1.5/tools/starpu_paje_state_stats.10000644000373600000000000000151512571536746016145 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PAJE_STATE_STATS "1" "September 2015" "starpu_paje_state_stats (StarPU) 1.1.5" "User Commands" .SH NAME starpu_paje_state_stats \- manual page for starpu_paje_state_stats (StarPU) 1.1.5 .SH DESCRIPTION Give statistical analysis of the paje trace .PP \&./starpu_paje_state_stats [ options ] paje.trace [paje.trace2 ...] .SH OPTIONS .TP \fB\-r\fR To fix range x1:x2 ("\-1" for infinity) .TP \fB\-n\fR To choose a certain state .TP \fB\-v\fR Print output to command line .TP \fB\-h\fR Show this message .SH EXAMPLES \&./starpu_paje_state_stats example.native.trace .PP \&./starpu_paje_state_stats \fB\-r\fR 100:300 \fB\-n\fR FetchingInput \fB\-v\fR example.native.trace example.simgrid.trace .SH "REPORTING BUGS" Report bugs to starpu-1.1.5/tools/starpu_fxt_stats.c0000644000373600000000000001027312571536606014705 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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(char **argv) { 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, "Reports bugs to <"PACKAGE_BUGREPORT">."); fprintf(stderr, "\n"); } static void 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(argv); 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 (!*fin) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(argv); exit(77); } } 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; parse_args(argc, argv, &fin, &fout); 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, "%d -> %d \t %ld MB\n", src, dst, transfers[src][dst]/(1024*1024)); } } } fprintf(fd_out, "There was %d tasks and %d work stealing\n", njob, nws); return 0; } starpu-1.1.5/tools/starpu_paje_draw_histogram.in0000755000373600000000000000654312571536604017071 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" r_script="$(dirname $(which $0))/starpu_paje_draw_histogram.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 -n chol_model_22 example.native.trace $0 -r 100:300 -n FetchingInput,Overhead -v example.native.trace example.simgrid.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "r:n:vh" opt; do case $opt in r) range="$OPTARG" ;; n) name="$OPTARG" ;; v) verbose=1 ;; h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi # Getting range range1=$(eval echo $range | cut -d: -f1) range2=$(eval echo $range | cut -d: -f2) ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv r_input=$(eval echo "$r_input $file.csv") done ##################################### # Running R file to get actual results Rscript $r_script $range1 $range2 $name $r_input # Directly opening .pdf result if [[ $verbose == 1 ]]; then evince Rplots.pdf fi # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.1.5/tools/tsan/0002755000373600000000000000000012571541161012140 500000000000000starpu-1.1.5/tools/tsan/starpu.suppr0000644000373600000000000000337612571536606014510 00000000000000# Disabled checking race:^active_hook_cnt$ race:^worker_exp_start$ race:^worker_exp_end$ race:^worker_exp_len$ race:^ntasks$ race:^mc_cache_size$ race:^mc_nb$ race:^mc_clean_nb$ race:^data_requests$ race:^prefetch_requests$ race:^idle_requests$ race:^data_requests_npending$ race:^used_size$ race:^hit_cnt$ race:^miss_cnt$ race:^alloc_cache_hit_cnt$ race:^alloc_cnt$ race:^comm_amount$ race:^_starpu_valgrind_print_once$ race:^_starpu_silent$ # don't care about cache hit stats race:^_starpu_msi_cache_hit$ race:^_starpu_msi_cache_miss$ # This is racy, but since we'll always put the same values, this is not a problem. race:^_starpu_codelet_check_deprecated_fields$ # This is racy, but we don't care, it's only a statistic race:^starpu_task_nsubmitted$ race:^starpu_task_nready$ race:^_starpu_bus_update_profiling_info$ # The config.running/pause_depth state is only protected by memory barriers race:^_starpu_machine_is_running$ race:^_starpu_kill_all_workers$ race:^starpu_pause$ race:^_starpu_may_pause$ race:^starpu_resume$ # worker_is_initialized is not actually racy since deinit happens only after main set running to 0 race:^_starpu_opencl_driver_deinit$ race:^_starpu_cuda_driver_deinit$ race:^_starpu_cpu_driver_deinit$ # The integer access is atomic, and we use the sched mutex to avoid missing wake ups race:^_starpu_fifo_empty$ race:^push_task_eager_policy$ # These are just statistics race:^starpu_memory_get_available$ race:^_starpu_profiling$ race:^_starpu_history_based_job_expected_perf$ race:^compute_ntasks_end$ race:^compute_expected_end$ race:^compute_all_performance_predictions$ # There is actually no race with busy_count, see comment race:_starpu_data_unregister # ignore other libraries' races called_from_lib:^libmpi.so$ called_from_lib:^libhwloc*.so$ starpu-1.1.5/tools/starpu_codelet_histo_profile.in0000755000373600000000000000433012571536604017415 00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 0 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then usage fi if [ ! -f $1 ] ; then echo "Error. File <$1> not found" echo "" usage fi # The input file must be generated by the starpu_fxt_tool command inputfile_with_counters=$1 # We extract the counters out of the input file inputfile=.$inputfile_with_counters.activity inputfile_cnt_ready=.$1.cnt_ready inputfile_cnt_submitted=.$1.cnt_submitted set_profiling_list=.$1.set_profiling_list names=.$1.names grep "^set_profiling" $inputfile_with_counters > $set_profiling_list grep "0$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.disable grep "1$" $set_profiling_list | cut -f 2 | sort -n > $set_profiling_list.enable grep "^name" $inputfile_with_counters > $names grep -v "^cnt" $inputfile_with_counters | grep -v "^set_profiling" | grep -v "^name" > $inputfile grep "^cnt_ready" $inputfile_with_counters > $inputfile_cnt_ready grep "^cnt_submitted" $inputfile_with_counters > $inputfile_cnt_submitted # Count the number of workers in the trace workers=`cut -f1 $inputfile | sort -n | uniq` nworkers=`cut -f1 $inputfile | sort -n | uniq|wc -l` # size of the entire graph width=1.5 heigth=0.40 total_heigth=$(echo "$heigth + ($heigth * $nworkers)"|bc -l) # In case 3 arguments are provided, the 2nd (resp. 3rd) indicates the start # (resp. the end) of the interval to be displayed. if [ $# -ge 3 ]; then starttime=$2 endtime=$3 else #if profiling is explicitely enabled (resp. disabled) at some point, we set the # default start (rest. end) point when we enable (resp. disable) profiling for # the first time. profiling_enable_cnt=`wc -l $set_profiling_list.enable|sed -e "s/\(.*\) .*/\1/"` if [ $profiling_enable_cnt -ge 1 ]; then starttime=`head -1 $set_profiling_list.enable` else starttime=$(cut -f 2 $inputfile |sort -n|head -1) fi # TODO test if last disable > first enable profiling_disable_cnt=$(wc -l $set_profiling_list.disable|sed -e "s/\(.*\) .*/\1/") if [ $profiling_disable_cnt -ge 1 ]; then endtime=`tail -1 $set_profiling_list.disable` else endtime=$(cut -f 2 $inputfile |sort -n|tail -1) fi # The values in the file are in ms, we display seconds starttime=$(echo "$starttime * 0.001 "| bc -l) endtime=$(echo "$endtime * 0.001 "| bc -l) fi echo "START $starttime END $endtime" # Gnuplot header cat > gnuplotcmd << EOF set term postscript eps enhanced color set output "activity.eps" set xrange [$starttime:$endtime] set size $width,$total_heigth set multiplot; set origin 0.0,0.0; set size $width,$heigth; set logscale y plot "$inputfile_cnt_submitted" using (\$2/1000):3 with filledcurves lt rgb "#999999" title "submitted",\ "$inputfile_cnt_ready" using (\$2/1000):3 with filledcurves lt rgb "#000000" title "ready" set nologscale y EOF cnt=0 for worker in $workers do grep "^$worker" $inputfile > .tmp.$worker starty=$(echo "$heigth + ($heigth * $cnt)"|bc -l) cat >> gnuplotcmd << EOF set origin 0.0,$starty; set size $width,$heigth; set key off set yrange [0:100] set ylabel "$(cut -f2- $names |grep "^$worker" | cut -f2)" plot ".tmp.$worker" using (\$2/1000):(100) with filledcurves y1=0.0 lt rgb "#000000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*(\$4+\$5))/\$3) with filledcurves y1=0.0 lt rgb "#ff0000" notitle,\ ".tmp.$worker" using (\$2/1000):((100*\$4)/\$3) with filledcurves y1=0.0 lt rgb "#00ff00" notitle EOF cnt=$(($cnt+1)) done cat >> gnuplotcmd << EOF unset multiplot EOF gnuplot < gnuplotcmd rm gnuplotcmd rm $inputfile rm $inputfile_cnt_ready rm $inputfile_cnt_submitted rm $set_profiling_list rm $set_profiling_list.enable rm $set_profiling_list.disable #rm $names for worker in $workers do rm .tmp.$worker done starpu-1.1.5/tools/starpu_paje_state_stats.in0000755000373600000000000000661612571536606016420 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" outputfile="starpu_paje_state_stats.csv" r_script="$(dirname $(which $0))/starpu_paje_state_stats.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 example.native.trace $0 -r 100:300 -n FetchingInput -v example.native.trace example.simgrid.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "r:n:vh" opt; do case $opt in r) range="$OPTARG" ;; n) name="$OPTARG" ;; v) verbose=1 ;; h) help_script exit 4 ;; \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi # Getting range range1=$(eval echo $range | cut -d: -f1) range2=$(eval echo $range | cut -d: -f2) ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace if grep -q start_profiling endSorted.trace then echo Using start_profiling/stop_profiling trace selection. sed -ne '/start_profiling/,/stop_profiling/p' < endSorted.trace > endSorted2.trace else cp endSorted.trace endSorted2.trace fi cat start.trace endSorted2.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv r_input=$(eval echo "$r_input $file.csv") done ##################################### # Running R file to get actual results Rscript $r_script $range1 $range2 $name $outputfile $r_input # If verbose then write results to stdout if [[ $verbose == 1 ]]; then column -s, -t $outputfile fi # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.1.5/tools/starpu_perfmodel_plot.10000644000373600000000000000170712571536750015621 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PERFMODEL_PLOT "1" "September 2015" "starpu_perfmodel_plot (StarPU) 1.1.5" "User Commands" .SH NAME starpu_perfmodel_plot \- manual page for starpu_perfmodel_plot (StarPU) 1.1.5 .SH SYNOPSIS .B starpu_perfmodel_plot [ \fIoptions \fR] .SH DESCRIPTION Draw a graph corresponding to the execution time of a given perfmodel .PP One must specify a symbol with the \fB\-s\fR option or use \fB\-l\fR Options: .TP \fB\-l\fR display all available models .TP \fB\-s\fR specify the symbol .TP \fB\-f\fR draw GFlops instead of time .TP \fB\-i\fR input FxT files generated by StarPU .TP \fB\-a\fR specify the architecture (e.g. cpu, cpu:x, cuda, cuda_d, opencl, opencl_d) .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.1.5/tools/starpu_codelet_profile0000755000373600000000000000430012571536665015606 00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2008, 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 " exit 1 } if [ "$1" = "-v" ] || [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.1.5" 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.1.5/tools/starpu_calibrate_bus.c0000644000373600000000000000361212571536605015463 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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: " PROGNAME " [OPTION]\n\ \n\ Options:\n\ -h, --help display this help and exit\n\ -v, --version output version information and exit\n\ \n\ Report bugs to <" PACKAGE_BUGREPORT ">.\n"); } 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.1.5/tools/starpu_lp2paje.c0000644000373600000000000001024312571536604014216 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013 Université de Bordeaux * Copyright (C) 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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, t2; int foo; double bar; if (argc != 1) { if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) { fprintf(stderr, PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n"); 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, "Reports bugs to <"PACKAGE_BUGREPORT">."); fprintf(stderr, "\n"); exit(EXIT_SUCCESS); } scanf("Suboptimal solution\n"); 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(scanf("nw %d\n", &nw) == 1); 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++) { 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.1.5/tools/starpu_workers_activity.10000644000373600000000000000150012571536746016212 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_WORKERS_ACTIVITY "1" "September 2015" "starpu_workers_activity (StarPU) 1.1.5" "User Commands" .SH NAME starpu_workers_activity \- manual page for starpu_workers_activity (StarPU) 1.1.5 .SH DESCRIPTION Offline tool to display the activity of the workers during the execution. .IP The starpu_fxt_tool utility now generates a file named 'activity.data' which can be processed by this script to generate a plot named activity.eps .IP Typical usage: .IP \&./starpu_fxt_tool \fB\-i\fR /tmp/prof_file_foo \&./starpu_workers_activity activity.data .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to starpu-1.1.5/tools/dev/0002755000373600000000000000000012571541161011751 500000000000000starpu-1.1.5/tools/dev/rename.sh0000755000373600000000000000145312571536605013507 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. find . -type f -not -name rename.sed -not -path "*svn*"|xargs sed -i -f $(dirname $0)/rename.sed starpu-1.1.5/tools/dev/rename.sed0000644000373600000000000002423512571536605013650 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.1.5/tools/Makefile.am0000644000373600000000000002011612571536604013153 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/tools/ -I$(top_srcdir)/mpi/ -I$(top_builddir)/src -I$(top_srcdir)/src 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/42 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/mirage.affinity \ perfmodels/sampling/bus/mirage.bandwidth \ perfmodels/sampling/bus/mirage.config \ perfmodels/sampling/bus/mirage.latency \ perfmodels/sampling/bus/mirage.platform.xml dist_pkgdata_perfmodels_sampling_codelets_DATA = \ perfmodels/sampling/codelets/42/chol_model_11.attila \ perfmodels/sampling/codelets/42/chol_model_21.attila \ perfmodels/sampling/codelets/42/chol_model_22.attila \ perfmodels/sampling/codelets/42/cl_update.attila \ perfmodels/sampling/codelets/42/save_cl_bottom.attila \ perfmodels/sampling/codelets/42/save_cl_top.attila \ perfmodels/sampling/codelets/42/starpu_sgemm_gemm.attila \ perfmodels/sampling/codelets/42/starpu_dgemm_gemm.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_11.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_12.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_21.attila \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_22.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_11.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_12.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_21.attila \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_22.attila \ perfmodels/sampling/codelets/42/chol_model_11.mirage \ perfmodels/sampling/codelets/42/chol_model_21.mirage \ perfmodels/sampling/codelets/42/chol_model_22.mirage \ perfmodels/sampling/codelets/42/cl_update.mirage \ perfmodels/sampling/codelets/42/save_cl_bottom.mirage \ perfmodels/sampling/codelets/42/save_cl_top.mirage \ perfmodels/sampling/codelets/42/starpu_sgemm_gemm.mirage \ perfmodels/sampling/codelets/42/starpu_dgemm_gemm.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_11.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_12.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_21.mirage \ perfmodels/sampling/codelets/42/starpu_slu_lu_model_22.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_11.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_12.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_21.mirage \ perfmodels/sampling/codelets/42/starpu_dlu_lu_model_22.mirage EXTRA_DIST = \ dev/rename.sed \ dev/rename.sh \ mvsc/starpu_clean.bat \ mvsc/starpu_open.bat \ mvsc/starpu_exec.bat \ mvsc/starpu_var.bat \ mvsc/starpu.sln \ mvsc/starpu/starpu.vcxproj \ perfmodels/README \ valgrind/libc.suppr \ valgrind/hwloc.suppr \ valgrind/libnuma.suppr \ valgrind/openmpi.suppr \ valgrind/pthread.suppr \ valgrind/starpu.suppr \ tsan/starpu.suppr CLEANFILES = *.gcno *.gcda *.linkinfo ##################################### # What to install and what to check # ##################################### STARPU_TOOLS = TESTS = $(STARPU_TOOLS) if STARPU_HAVE_WINDOWS check_PROGRAMS = $(STARPU_TOOLS) else check_PROGRAMS = $(LOADER) $(STARPU_TOOLS) endif if !STARPU_HAVE_WINDOWS ## test loader program LOADER = loader loader_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) -I$(top_builddir)/src/ LOADER_BIN = $(abs_top_builddir)/tools/$(LOADER) loader_SOURCES = ../tests/loader.c if STARPU_HAVE_AM111 TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" LOG_COMPILER = $(LOADER_BIN) else TESTS_ENVIRONMENT = top_builddir="$(abs_top_builddir)" top_srcdir="$(abs_top_srcdir)" $(LOADER_BIN) endif endif if STARPU_USE_FXT bin_PROGRAMS += \ starpu_fxt_tool \ starpu_fxt_stats STARPU_TOOLS += \ starpu_fxt_tool \ starpu_fxt_stats 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) endif bin_PROGRAMS += \ starpu_perfmodel_display \ starpu_perfmodel_plot \ starpu_calibrate_bus \ starpu_machine_display \ starpu_lp2paje starpu_perfmodel_plot_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(FXT_CFLAGS) if STARPU_LONG_CHECK STARPU_TOOLS += \ starpu_calibrate_bus endif STARPU_TOOLS += \ starpu_machine_display if !STARPU_HAVE_WINDOWS STARPU_TOOLS += \ starpu_perfmodel_display \ starpu_perfmodel_plot endif dist_bin_SCRIPTS += \ starpu_workers_activity \ starpu_codelet_histo_profile \ starpu_codelet_profile \ starpu_paje_draw_histogram \ starpu_paje_state_stats if STARPU_HAVE_WINDOWS STARPU_MVSC_dir = $(bindir) nobase_STARPU_MVSC__DATA = \ mvsc/starpu_clean.bat \ mvsc/starpu_open.bat \ mvsc/starpu_exec.bat \ mvsc/starpu_var.bat \ mvsc/starpu.sln \ mvsc/starpu/starpu.vcxproj endif if STARPU_HAVE_HELP2MAN starpu_calibrate_bus.1: starpu_calibrate_bus$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_machine_display.1: starpu_machine_display$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_perfmodel_display.1: starpu_perfmodel_display$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_perfmodel_plot.1: starpu_perfmodel_plot$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_lp2paje.1: starpu_lp2paje$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_workers_activity.1: starpu_workers_activity chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_codelet_profile.1: starpu_codelet_profile chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_codelet_histo_profile.1: starpu_codelet_histo_profile chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_paje_draw_histogram.1: starpu_paje_draw_histogram chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< starpu_paje_state_stats.1: starpu_paje_state_stats chmod +x $< help2man --no-discard-stderr -N --output=$@ ./$< if STARPU_USE_FXT starpu_fxt_tool.1: starpu_fxt_tool$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< starpu_fxt_stats.1: starpu_fxt_stats$(EXEEXT) help2man --no-discard-stderr -N --output=$@ ./$< endif dist_man1_MANS =\ starpu_calibrate_bus.1 \ starpu_machine_display.1 \ starpu_perfmodel_display.1 \ starpu_perfmodel_plot.1 \ starpu_lp2paje.1 \ starpu_workers_activity.1 \ starpu_codelet_profile.1 \ starpu_codelet_histo_profile.1 \ starpu_paje_draw_histogram.1 \ starpu_paje_state_stats.1 if STARPU_USE_FXT dist_man1_MANS +=\ starpu_fxt_tool.1 \ starpu_fxt_stats.1 endif clean-local: $(RM) $(dist_man1_MANS) endif 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 starpu-1.1.5/tools/starpu_paje_sort.in0000755000373600000000000000454212571536606015045 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for 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 ##################################### # 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 > $file done # Cleanup: delete temporary files rm -f start.trace rm -f end.trace rm -f endSorted.trace rm -f endSorted2.trace starpu-1.1.5/tools/valgrind/0002755000373600000000000000000012571541161013001 500000000000000starpu-1.1.5/tools/valgrind/libc.suppr0000644000373600000000000000000012571536607014722 00000000000000starpu-1.1.5/tools/valgrind/libnuma.suppr0000644000373600000000000000023312571536607015450 00000000000000{ libnuma error Memcheck:Cond ... fun:numa_node_size64 ... } { libnuma error Memcheck:Value8 ... fun:numa_node_size64 ... } starpu-1.1.5/tools/valgrind/starpu.suppr0000644000373600000000000000276112571536607015347 00000000000000{ don't care about cache hit stats Helgrind:Race fun:_starpu_msi_cache_hit ... } { don't care about cache miss stats Helgrind:Race fun:_starpu_msi_cache_miss ... } { known race, but not problematic in practice, see comment in _starpu_tag_clear Helgrind:LockOrder ... fun:_starpu_tag_free fun:_starpu_htbl_clear_tags ... fun:_starpu_tag_clear fun:starpu_shutdown ... } { There is actually no race on current_mode, because the mode can not change unexpectedly, until _starpu_notify_data_dependencies() is called further down. Valgrind can not know about such software rwlock. Helgrind:Race fun:_starpu_release_data_on_node fun:_starpu_push_task_output ... } { We do not care about races on profiling statistics Helgrind:Race fun:_starpu_worker_get_status fun:_starpu_worker_reset_profiling_info_with_lock ... } { This is racy, but since we'll always put the same values, this is not a problem. Helgrind:Race fun:_starpu_codelet_check_deprecated_fields ... } { This is racy, but we don't care, it's only a statistic Helgrind:Race fun:starpu_task_nsubmitted ... } { This is racy, but we don't care, it's only a statistic Helgrind:Race fun:starpu_task_nready ... } { This is racy, but we don't care, it's only a statistic Helgrind:Race fun:_starpu_bus_update_profiling_info ... } { fscanf error Memcheck:Cond ... fun:fscanf fun:_starpu_load_bus_performance_files ... } starpu-1.1.5/tools/valgrind/pthread.suppr0000644000373600000000000000046112571536607015453 00000000000000{ pthread_create Memcheck:Leak ... fun:pthread_create@@GLIBC_2.2.5 ... } { name Memcheck:Leak ... fun:pthread_cancel_init ... } { Helgrind 3.9 wrongly compares to-be-destroyed mutex with init value Helgrind:Race fun:my_memcmp fun:pthread_mutex_destroy ... } starpu-1.1.5/tools/valgrind/hwloc.suppr0000644000373600000000000000075512571536607015146 00000000000000{ zlib doesn't cleanup Memcheck:Cond fun:inflateReset2 fun:inflateInit2_ } { hwloc cannot free the global parser (xmlCleanupParser) because other threads may be using it Memcheck:Leak ... fun:xmlInitParser } { hwloc cannot free the global xml dict RMutex because it cannot call xmlCleanupParser Memcheck:Leak fun:malloc fun:xmlNewRMutex ... fun:xmlDictCreate } { libtool leaves memory behind Memcheck:Leak ... fun:hwloc_components_init } starpu-1.1.5/tools/valgrind/openmpi.suppr0000644000373600000000000000516112571536607015475 00000000000000{ 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 } { suppr6 Memcheck:Leak ... fun:mca_pml_base_open } { suppr7 Memcheck:Leak ... fun:orte_init } { suppr8 Memcheck:Leak ... fun:orte_ess_base_app_setup } { suppr9 Memcheck:Leak ... fun:opal_paffinity_base_open } { suppr10 Memcheck:Leak ... fun:ompi_mpi_finalize } { suppr11 Memcheck:Leak ... fun:mca_base_components_open } { suppr12 Memcheck:Param writev(vector[...]) ... fun:PMPI_Init_thread } { suppr13 Memcheck:Param writev(vector[...]) ... fun:PMPI_Init_thread } { suppr14 Memcheck:Param sched_setaffinity(mask) ... fun:PMPI_Init_thread } { suppr15 Memcheck:Leak fun:malloc fun:ompi_free_list_grow ... fun:opal_progress fun:ompi_request_default_test fun:PMPI_Test } { suppr16 Memcheck:Leak fun:malloc fun:ompi_ddt_set_args fun:PMPI_Type_vector } { suppr17 Memcheck:Leak fun:malloc fun:ompi_ddt_optimize_short.constprop.0 fun:ompi_ddt_commit fun:PMPI_Type_commit } { suppr18 Memcheck:Leak fun:calloc fun:ompi_ddt_create fun:ompi_ddt_create_vector fun:PMPI_Type_vector } { suppr19 Memcheck:Leak fun:malloc fun:ompi_ddt_create fun:ompi_ddt_create_vector fun:PMPI_Type_vector } { suppr20 Memcheck:Leak fun:malloc fun:ompi_free_list_grow ... fun:PMPI_Isend } { suppr21 Memcheck:Leak ... fun:hwloc_topology_set_xmlbuffer fun:opal_hwloc_unpack fun:opal_dss_unpack_buffer } { suppr22 Memcheck:Leak ... fun:hwloc_topology_set_xmlbuffer fun:opal_hwloc_unpack } { suppr23 Memcheck:Leak ... fun:hwloc_topology_load fun:opal_hwloc_unpack } { suppr24 Memcheck:Leak fun:malloc ... fun:xmlParseElement } { suppr25 Memcheck:Leak match-leak-kinds: indirect ... fun:ompi_datatype_commit fun:PMPI_Type_commit } { suppr26 Memcheck:Leak match-leak-kinds: definite ... fun:ompi_datatype_create_vector fun:PMPI_Type_vector } { suppr27 Memcheck:Leak match-leak-kinds: indirect ... fun:ompi_datatype_create_vector fun:PMPI_Type_vector } { suppr28 Memcheck:Leak match-leak-kinds: indirect fun:malloc fun:ompi_datatype_set_args fun:PMPI_Type_vector } starpu-1.1.5/tools/starpu_codelet_histo_profile0000755000373600000000000000432312571536665017021 00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2013 Université de Bordeaux # Copyright (C) 2010, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.1.5" 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 #include #include #include #include #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #define PROGNAME "starpu_perfmodel_display" /* display all available models */ static int plist = 0; /* display directory */ static int pdirectory = 0; /* what kernel ? */ static char *psymbol = NULL; /* what parameter should be displayed ? (NULL = all) */ static char *pparameter = NULL; /* which architecture ? (NULL = all)*/ static char *parch = NULL; /* should we display a specific footprint ? */ static unsigned pdisplay_specific_footprint; static uint32_t pspecific_footprint; static void usage() { fprintf(stderr, "Display a given perfmodel\n\n"); fprintf(stderr, "Usage: %s [ options ]\n", PROGNAME); fprintf(stderr, "\n"); fprintf(stderr, "One must specify either -l or -s\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " -l display all available models\n"); fprintf(stderr, " -s specify the symbol\n"); fprintf(stderr, " -p specify the parameter (e.g. a, b, c, mean, stddev)\n"); fprintf(stderr, " -a specify the architecture (e.g. cpu, cpu:k, cuda)\n"); fprintf(stderr, " -f display the history-based model for the specified footprint\n"); fprintf(stderr, " -d display the directory storing performance models\n"); fprintf(stderr, " -h, --help display this help and exit\n"); fprintf(stderr, " -v, --version output version information and exit\n\n"); fprintf(stderr, "Reports bugs to <"PACKAGE_BUGREPORT">."); fprintf(stderr, "\n"); } static void parse_args(int argc, char **argv) { int c; static struct option long_options[] = { {"arch", required_argument, NULL, 'a'}, {"footprint", required_argument, NULL, 'f'}, {"help", no_argument, NULL, 'h'}, /* XXX Would be cleaner to set a flag */ {"list", no_argument, NULL, 'l'}, {"dir", no_argument, NULL, 'd'}, {"parameter", required_argument, NULL, 'p'}, {"symbol", required_argument, NULL, 's'}, {"version", no_argument, NULL, 'v'}, {0, 0, 0, 0} }; int option_index; while ((c = getopt_long(argc, argv, "dls:p:a:f:h", long_options, &option_index)) != -1) { switch (c) { case 'l': /* list all models */ plist = 1; break; case 's': /* symbol */ psymbol = optarg; break; case 'p': /* parameter (eg. a, b, c, mean, stddev) */ pparameter = optarg; break; case 'a': /* architecture (cpu, cuda) */ parch = optarg; break; case 'f': /* footprint */ pdisplay_specific_footprint = 1; sscanf(optarg, "%08x", &pspecific_footprint); break; case 'd': /* directory */ pdirectory = 1; break; case 'h': usage(); exit(EXIT_SUCCESS); case 'v': fputs(PROGNAME " (" PACKAGE_NAME ") " PACKAGE_VERSION "\n", stderr); exit(EXIT_SUCCESS); case '?': default: fprintf(stderr, "Unrecognized option: -%c\n", optopt); } } if (!psymbol && !plist && !pdirectory) { fprintf(stderr, "Incorrect usage, aborting\n"); usage(); exit(-1); } } int main(int argc, char **argv) { #if defined(_WIN32) && !defined(__CYGWIN__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); #endif parse_args(argc, argv); if (plist) { starpu_perfmodel_list(stdout); } else if (pdirectory) { starpu_perfmodel_directory(stdout); } else { struct starpu_perfmodel model = {}; int ret = starpu_perfmodel_load_symbol(psymbol, &model); if (ret == 1) { fprintf(stderr, "The performance model for the symbol <%s> could not be loaded\n", psymbol); return 1; } uint32_t *footprint = NULL; if (pdisplay_specific_footprint == 1) { footprint = &pspecific_footprint; } starpu_perfmodel_print_all(&model, parch, pparameter, footprint, stdout); } starpu_perfmodel_free_sampling_directories(); return 0; } starpu-1.1.5/tools/starpu_perfmodel_display.10000644000373600000000000000174512571536750016312 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_PERFMODEL_DISPLAY "1" "September 2015" "starpu_perfmodel_display (StarPU) 1.1.5" "User Commands" .SH NAME starpu_perfmodel_display \- manual page for starpu_perfmodel_display (StarPU) 1.1.5 .SH SYNOPSIS .B starpu_perfmodel_display [ \fIoptions \fR] .SH DESCRIPTION Display a given perfmodel .PP One must specify either \fB\-l\fR or \fB\-s\fR Options: .TP \fB\-l\fR display all available models .TP \fB\-s\fR specify the symbol .TP \fB\-p\fR specify the parameter (e.g. a, b, c, mean, stddev) .TP \fB\-a\fR specify the architecture (e.g. cpu, cpu:k, cuda) .TP \fB\-f\fR display the history\-based model for the specified footprint .TP \fB\-d\fR display the directory storing performance models .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .PP Reports bugs to . starpu-1.1.5/tools/starpu_paje_state_stats0000755000373600000000000000661112571536665016013 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" outputfile="starpu_paje_state_stats.csv" r_script="$(dirname $(which $0))/starpu_paje_state_stats.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 example.native.trace $0 -r 100:300 -n FetchingInput -v example.native.trace example.simgrid.trace Report bugs to EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.1.5" 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.1.5/tools/mvsc/0002755000373600000000000000000012571541161012143 500000000000000starpu-1.1.5/tools/mvsc/starpu_clean.bat0000644000373600000000000000157212571536604015244 00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013 Centre National de la Recherche Scientifique REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MVSC StarPU Cleaning ECHO. ECHO MVSC 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.1.5/tools/mvsc/starpu_exec.bat0000644000373600000000000000245312571536604015105 00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013 Centre National de la Recherche Scientifique REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MVSC StarPU Execution ECHO. ECHO MVSC 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 10.0\VC\vcvarsall.bat" x86 cl %1 %STARPU_CFLAGS% %STARPU_LDFLAGS% set PATH=starpu;c:\MinGW\bin;%PATH% .\%~n1.exe set PATH=%STARPU_OLDPATH% GOTO end :invalidparam ECHO. ECHO Syntax error. You need to give the name of a StarPU application EXIT /B 2 GOTO end :end starpu-1.1.5/tools/mvsc/starpu_open.bat0000644000373600000000000000274612571536604015127 00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013 Centre National de la Recherche Scientifique REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MVSC StarPU Execution ECHO. ECHO MVSC 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.1.5/tools/mvsc/starpu/0002755000373600000000000000000012571541161013461 500000000000000starpu-1.1.5/tools/mvsc/starpu/starpu.vcxproj0000755000373600000000000001025512571536604016346 00000000000000 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.1;%(AdditionalIncludeDirectories) Console true $(STARPU_PATH)\lib;%(AdditionalLibraryDirectories) libstarpu-1.1.lib;%(AdditionalDependencies) Level3 Use MaxSpeed true true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) Console true true true starpu-1.1.5/tools/mvsc/starpu_var.bat0000644000373600000000000000227612571536666014764 00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013 Centre National de la Recherche Scientifique REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MVSC StarPU Environment ECHO. ECHO MVSC 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.1 set STARPU_LDFLAGS=/link %STARPU_PATH%\lib\libstarpu-1.1.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.1.5/tools/mvsc/starpu_var.bat.in0000644000373600000000000000240212571536604015350 00000000000000@ECHO OFF REM StarPU --- Runtime system for heterogeneous multicore architectures. REM REM Copyright (C) 2013 Centre National de la Recherche Scientifique REM REM StarPU is free software; you can redistribute it and/or modify REM it under the terms of the GNU Lesser General Public License as published by REM the Free Software Foundation; either version 2.1 of the License, or (at REM your option) any later version. REM REM StarPU is distributed in the hope that it will be useful, but REM WITHOUT ANY WARRANTY; without even the implied warranty of REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. REM REM See the GNU Lesser General Public License in COPYING.LGPL for more details. TITLE MVSC StarPU Environment ECHO. ECHO MVSC StarPU Environment IF NOT EXIST %STARPU_PATH%\AUTHORS GOTO starpunotfound ECHO. ECHO Setting environment from %STARPU_PATH% set STARPU_LIBDIR=%STARPU_PATH%/lib set STARPU_INCLUDEDIR=%STARPU_PATH%/include set STARPU_CFLAGS=/I%STARPU_INCLUDEDIR%\starpu\@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ set STARPU_LDFLAGS=/link %STARPU_PATH%\lib\libstarpu-@STARPU_EFFECTIVE_VERSION@.lib GOTO end :starpunotfound ECHO. ECHO You need to set the variable STARPU_PATH to a valid StarPU installation directory exit /B 1 GOTO end :end starpu-1.1.5/tools/mvsc/starpu.sln0000755000373600000000000000157212571536604014133 00000000000000 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.1.5/tools/starpu_calibrate_bus.10000644000373600000000000000105712571536750015403 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_CALIBRATE_BUS "1" "September 2015" "starpu_calibrate_bus (StarPU) 1.1.5" "User Commands" .SH NAME starpu_calibrate_bus \- manual page for starpu_calibrate_bus (StarPU) 1.1.5 .SH SYNOPSIS .B starpu_calibrate_bus [\fIOPTION\fR] .SH DESCRIPTION Force a bus calibration. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to . starpu-1.1.5/tools/starpu_paje_summary.in0000755000373600000000000000544012571536606015551 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" outputfile="summary.html" analysis_script="$(dirname $(which $0))/starpu_paje_summary.Rmd" analysis_input="" # Command line arguments inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace Options: -h Show this message Examples: $0 example.native.trace $0 example.native.trace example.simgrid.trace Report bugs to <@PACKAGE_BUGREPORT@> EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (@PACKAGE_NAME@) @PACKAGE_VERSION@" exit 0 fi if [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "" ] ; then help_script exit 0 fi while getopts "h" opt; do case $opt in \?) echo "Invalid option: -$OPTARG" help_script exit 3 ;; esac done # Reading files that need to be analyzed shift $((OPTIND - 1)) inputfiles=$@ # Error if there is no input files specified if [[ $# < 1 ]]; then echo "Error!" help_script exit 2 fi ##################################### # Transforming input files into .csv for file in $inputfiles; do if [ ! -s $file ] then echo "Error: file $file does not exist!" exit 5 fi # Sorting traces grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\|9\)\>\)\)' $file > start.trace grep -e '^\(\(%\)\|\(\(0\|1\|2\|3\|4\|5\|6\|7\|9\|18\|19\)\>\)\)' -v $file > end.trace sort -s -V --key=2,2 end.trace > endSorted.trace cat start.trace endSorted.trace > outputSorted.trace # Transferring to .csv pj_dump -n outputSorted.trace > $file.csv perl -i -ne 'print if /^State/' $file.csv done analysis_input=`echo \"$inputfiles".csv\"" | sed 's/ */.csv", "/g'` ##################################### # Running analysis file to get actual results Rscript -e "library(knitr); input_traces = c($analysis_input) ; outputhtml='$outputfile';\ outputRmd = gsub('.html\$','.Rmd',outputhtml);\ knit('$analysis_script',output=outputRmd); knitr::knit2html(outputRmd)" # Cleanup: delete temporary files rm -f outputSorted.trace rm -f start.trace rm -f end.trace rm -f endSorted.trace starpu-1.1.5/tools/starpu_lp2paje.10000644000373600000000000000065312571536750014142 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_LP2PAJE "1" "September 2015" "starpu_lp2paje (StarPU) 1.1.5" "User Commands" .SH NAME starpu_lp2paje \- manual page for starpu_lp2paje (StarPU) 1.1.5 .SH SYNOPSIS .B lp_solve \fIfile.lp | starpu_lp2paje > paje.trace\fR .SH DESCRIPTION Convert schedule optimized by lp into the Paje format .PP Reports bugs to . starpu-1.1.5/tools/starpu_paje_draw_histogram0000755000373600000000000000653612571536665016475 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2014 Université Joseph Fourier # Copyright (C) 2014-2015 Université Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # Script for giving statistical analysis of the paje trace set -e # fail fast # File names basename="$PWD" r_script="$(dirname $(which $0))/starpu_paje_draw_histogram.R" r_input="" # Command line arguments range="0:-1" name="All" verbose=0 inputfiles="" help_script() { cat << EOF Give statistical analysis of the paje trace $0 [ options ] paje.trace [paje.trace2 ...] Options: -r To fix range x1:x2 ("-1" for infinity) -n To choose a certain state -v Print output to command line -h Show this message Examples: $0 -n chol_model_22 example.native.trace $0 -r 100:300 -n FetchingInput,Overhead -v example.native.trace example.simgrid.trace Report bugs to EOF } if [ "$1" = "--version" ] ; then echo "$PROGNAME (StarPU) 1.1.5" 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.1.5/tools/starpu_codelet_profile.10000644000373600000000000000115512571536746015747 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_CODELET_PROFILE "1" "September 2015" "starpu_codelet_profile (StarPU) 1.1.5" "User Commands" .SH NAME starpu_codelet_profile \- manual page for starpu_codelet_profile (StarPU) 1.1.5 .SH SYNOPSIS .B starpu_codelet_profile \fIdistrib.data codelet_name\fR .SH DESCRIPTION Offline tool to draw codelet profile over a traced execution .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to starpu-1.1.5/AUTHORS0000644000373600000000000000176312571536572011042 00000000000000Simon Archipoff Cédric Augonnet William Braik Jérôme Clet-Ortega Nicolas Collin Ludovic Courtès Yann Courtois Jean-Marie Couteyen Nathalie Furmento David Gómez Sylvain Henry Mehdi Juhoor Xavier Lacoste Benoît Lizé Antoine Lucas Nguyen Quôc-Dinh Cyril Roelandt Anthony Roy Luka Stanisic Ludovic Stordeur François Tessier Samuel Thibault Pierre-André Wacrenier Andra Hugo starpu-1.1.5/Makefile.in0000644000373600000000000015000612571536631012026 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @USE_MPI_TRUE@am__append_1 = mpi @BUILD_EXAMPLES_TRUE@am__append_2 = examples @BUILD_SOCL_TRUE@am__append_3 = socl @BUILD_GCC_PLUGIN_TRUE@am__append_4 = gcc-plugin @BUILD_STARPUFFT_TRUE@am__append_5 = starpufft @STARPU_BUILD_SC_HYPERVISOR_TRUE@am__append_6 = sc_hypervisor DIST_COMMON = $(srcdir)/starpu-top/extradist $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(top_srcdir)/src/common/config.h.in \ $(top_srcdir)/include/starpu_config.h.in \ $(top_srcdir)/gcc-plugin/include/starpu-gcc/config.h.in \ $(top_srcdir)/starpu-top/config.h.in \ $(top_srcdir)/tests/regression/regression.sh.in \ $(top_srcdir)/tests/regression/profiles.in \ $(top_srcdir)/tests/regression/profiles.build.only.in \ $(top_srcdir)/socl/vendors/socl.icd.in \ $(top_srcdir)/socl/vendors/install/socl.icd.in \ $(srcdir)/libstarpu.pc.in $(srcdir)/starpu-1.0.pc.in \ $(srcdir)/starpu-1.1.pc.in \ $(top_srcdir)/starpu-top/StarPU-Top.pro.in \ $(top_srcdir)/starpu-top/StarPU-Top-qwt-embed.pri.in \ $(top_srcdir)/starpu-top/StarPU-Top-qwt-system.pri.in \ $(top_srcdir)/tools/mvsc/starpu_var.bat.in $(dist_man1_MANS) \ $(noinst_HEADERS) $(versinclude_HEADERS) 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/missing build-aux/ltmain.sh \ $(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 subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = tests/regression/regression.sh \ tests/regression/profiles tests/regression/profiles.build.only \ socl/vendors/socl.icd socl/vendors/install/socl.icd \ libstarpu.pc starpu-1.0.pc starpu-1.1.pc \ starpu-top/StarPU-Top.pro starpu-top/StarPU-Top-qwt-embed.pri \ starpu-top/StarPU-Top-qwt-system.pri tools/mvsc/starpu_var.bat CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(txtdir)" "$(DESTDIR)$(versincludedir)" \ "$(DESTDIR)$(versincludedir)" NROFF = nroff MANS = $(dist_man1_MANS) DATA = $(pkgconfig_DATA) $(txt_DATA) HEADERS = $(nodist_versinclude_HEADERS) $(noinst_HEADERS) \ $(versinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = src tools tests doc mpi examples socl gcc-plugin \ starpufft sc_hypervisor DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 CLEANFILES = *.gcno *.gcda *.linkinfo SUBDIRS = src tools tests doc $(am__append_1) $(am__append_2) \ $(am__append_3) $(am__append_4) $(am__append_5) \ $(am__append_6) pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpu.pc starpu-1.0.pc starpu-1.1.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu.h \ include/starpu_bitmap.h \ include/starpu_data_filters.h \ include/starpu_data_interfaces.h \ include/starpu_worker.h \ include/starpu_task.h \ include/starpu_task_bundle.h \ include/starpu_task_list.h \ include/starpu_task_util.h \ include/starpu_data.h \ include/starpu_perfmodel.h \ include/starpu_util.h \ include/starpu_fxt.h \ include/starpu_cuda.h \ include/starpu_opencl.h \ include/starpu_expert.h \ include/starpu_profiling.h \ include/starpu_bound.h \ include/starpu_scheduler.h \ include/starpu_sched_ctx.h \ include/starpu_sched_ctx_hypervisor.h \ include/starpu_top.h \ include/starpu_deprecated_api.h \ include/starpu_hash.h \ include/starpu_rand.h \ include/starpu_cublas.h \ include/starpu_driver.h \ include/starpu_stdlib.h \ include/starpu_thread.h \ include/starpu_thread_util.h \ include/starpu_simgrid_wrap.h \ include/starpu_mod.f90 nodist_versinclude_HEADERS = \ include/starpu_config.h noinst_HEADERS = \ include/pthread_win32/pthread.h \ include/pthread_win32/semaphore.h @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@dist_man1_MANS = \ @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@ starpu-top/starpu_top.1 @STARPU_HAVE_WINDOWS_FALSE@txtdir = ${docdir} @STARPU_HAVE_WINDOWS_TRUE@txtdir = ${prefix} txt_DATA = AUTHORS COPYING.LGPL README STARPU-REVISION EXTRA_DIST = AUTHORS COPYING.LGPL README STARPU-VERSION \ STARPU-REVISION build-aux/svn2cl.xsl starpu-top/extradist \ starpu-top/configurationmanager.h starpu-top/taskmanager.cpp \ starpu-top/aboutdialog.cpp starpu-top/aboutdialog.h \ starpu-top/widgetwindowsmanager.cpp \ starpu-top/widgetwindowsmanager.h \ starpu-top/abstractwidgetwindow.cpp \ starpu-top/communicationthread.h \ starpu-top/configurationmanager.cpp \ starpu-top/starpu_top_types.h starpu-top/mainwindow.ui \ starpu-top/mainwindow.cpp starpu-top/sessionsetupmanager.cpp \ starpu-top/resources.qrc starpu-top/images \ starpu-top/images/connect.png starpu-top/images/debugon.png \ starpu-top/images/help.png starpu-top/images/starpu_top.png \ starpu-top/images/widget.png starpu-top/images/lock.png \ starpu-top/images/about.png starpu-top/images/add.png \ starpu-top/images/preferences.png \ starpu-top/images/outside.png starpu-top/images/inside.png \ starpu-top/images/quit.png starpu-top/images/remove.png \ starpu-top/images/play.png starpu-top/images/windows.png \ starpu-top/images/debugoff.png \ starpu-top/abstractwidgetwindow.h \ starpu-top/interactivewidget.h starpu-top/main.cpp \ starpu-top/debugconsole.h starpu-top/TODO.txt \ starpu-top/StarPU-Top-qwt-embed.pri starpu-top/qledindicator \ starpu-top/qledindicator/qledindicator.cpp \ starpu-top/qledindicator/qledindicator.h \ starpu-top/communicationthread.cpp starpu-top/debugconsole.ui \ starpu-top/dataaggregatorwidget.cpp starpu-top/datawidget.cpp \ starpu-top/datawidget.h starpu-top/debugconsole.cpp \ starpu-top/ganttwidget.h starpu-top/mainwindow.h \ starpu-top/ganttwidget.cpp starpu-top/qwt \ starpu-top/qwt/qwt_spline.cpp \ starpu-top/qwt/qwt_double_range.h \ starpu-top/qwt/qwt_plot_curve.cpp starpu-top/qwt/qwt_math.h \ starpu-top/qwt/qwt_scale_draw.cpp starpu-top/qwt/qwt_slider.h \ starpu-top/qwt/qwt_interval.h starpu-top/qwt/qwt_thermo.h \ starpu-top/qwt/qwt_text_label.h \ starpu-top/qwt/qwt_series_data.h \ starpu-top/qwt/qwt_plot_curve.h starpu-top/qwt/qwt_knob.h \ starpu-top/qwt/qwt_plot_seriesitem.h \ starpu-top/qwt/qwt_painter.h starpu-top/qwt/qwt_dial.cpp \ starpu-top/qwt/qwt_scale_map.cpp starpu-top/qwt/qwt_global.h \ starpu-top/qwt/qwt_double_range.cpp \ starpu-top/qwt/qwt_point_polar.h \ starpu-top/qwt/qwt_painter.cpp \ starpu-top/qwt/qwt_abstract_scale.cpp \ starpu-top/qwt/qwt_plot_dict.cpp \ starpu-top/qwt/qwt_series_data.cpp starpu-top/qwt/qwt_wheel.h \ starpu-top/qwt/qwt_plot_seriesitem.cpp \ starpu-top/qwt/qwt_abstract_scale_draw.h \ starpu-top/qwt/qwt_symbol.h starpu-top/qwt/qwt_text_engine.cpp \ starpu-top/qwt/qwt_plot_layout.cpp \ starpu-top/qwt/qwt_round_scale_draw.cpp \ starpu-top/qwt/qwt_plot.cpp starpu-top/qwt/qwt_clipper.cpp \ starpu-top/qwt/qwt_clipper.h starpu-top/qwt/qwt_point_3d.cpp \ starpu-top/qwt/qwt_legend.cpp \ starpu-top/qwt/qwt_scale_widget.h \ starpu-top/qwt/qwt_interval.cpp \ starpu-top/qwt/qwt_scale_draw.h starpu-top/qwt/qwt_plot_dict.h \ starpu-top/qwt/qwt_text.cpp \ starpu-top/qwt/qwt_scale_widget.cpp \ starpu-top/qwt/qwt_legend_item.cpp \ starpu-top/qwt/qwt_abstract_scale.h \ starpu-top/qwt/qwt_spline.h starpu-top/qwt/qwt_plot_canvas.h \ starpu-top/qwt/qwt_color_map.cpp \ starpu-top/qwt/qwt_dial_needle.h \ starpu-top/qwt/qwt_scale_map.h \ starpu-top/qwt/qwt_legend_item.h \ starpu-top/qwt/qwt_legend_itemmanager.h \ starpu-top/qwt/qwt_curve_fitter.h \ starpu-top/qwt/qwt_dyngrid_layout.cpp \ starpu-top/qwt/qwt_color_map.h starpu-top/qwt/qwt_scale_div.h \ starpu-top/qwt/qwt_plot_xml.cpp \ starpu-top/qwt/qwt_round_scale_draw.h \ starpu-top/qwt/qwt_text_engine.h starpu-top/qwt/qwt_dial.h \ starpu-top/qwt/qwt_dyngrid_layout.h \ starpu-top/qwt/qwt_plot_item.cpp \ starpu-top/qwt/qwt_curve_fitter.cpp \ starpu-top/qwt/qwt_dial_needle.cpp \ starpu-top/qwt/qwt_plot_item.h \ starpu-top/qwt/qwt_plot_axis.cpp starpu-top/qwt/qwt_slider.cpp \ starpu-top/qwt/qwt_text_label.cpp \ starpu-top/qwt/qwt_abstract_slider.h \ starpu-top/qwt/qwt_math.cpp \ starpu-top/qwt/qwt_abstract_slider.cpp \ starpu-top/qwt/qwt_plot_canvas.cpp \ starpu-top/qwt/qwt_thermo.cpp starpu-top/qwt/qwt_point_3d.h \ starpu-top/qwt/qwt_abstract_scale_draw.cpp \ starpu-top/qwt/qwt_plot_layout.h starpu-top/qwt/qwt_symbol.cpp \ starpu-top/qwt/qwt_plot.h starpu-top/qwt/qwt_text.h \ starpu-top/qwt/qwt_wheel.cpp \ starpu-top/qwt/qwt_point_polar.cpp \ starpu-top/qwt/qwt_scale_engine.h \ starpu-top/qwt/qwt_scale_engine.cpp \ starpu-top/qwt/qwt_scale_div.cpp starpu-top/qwt/qwt_knob.cpp \ starpu-top/qwt/qwt_legend.h starpu-top/taskmanager.h \ starpu-top/preferencesdialog.cpp \ starpu-top/communicationmanager.h starpu-top/aboutdialog.ui \ starpu-top/StarPU-Top-qwt-system.pri \ starpu-top/StarPU-Top.pro.user \ starpu-top/communicationmanager.cpp \ starpu-top/interactivewidget.cpp \ starpu-top/preferencesdialog.ui \ starpu-top/sessionsetupmanager.h \ starpu-top/StarPU-Top.pro.user.1.3 \ starpu-top/StarPU-Top-common.pri \ starpu-top/dataaggregatorwidget.h \ starpu-top/preferencesdialog.h starpu-top/StarPU-Top.pro.in DISTCLEANFILES = STARPU-REVISION # Cyclomatic complexity reports. # The pmccabe tool, see . PMCCABE = pmccabe VC_URL = "https://gforge.inria.fr/scm/viewvc.php/trunk/%FILENAME%?view=markup&root=starpu" all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/starpu-top/extradist $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/starpu-top/extradist: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): src/common/config.h: src/common/stamp-h1 @test -f $@ || rm -f src/common/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/common/stamp-h1 src/common/stamp-h1: $(top_srcdir)/src/common/config.h.in $(top_builddir)/config.status @rm -f src/common/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/common/config.h $(top_srcdir)/src/common/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f src/common/stamp-h1 touch $@ include/starpu_config.h: include/stamp-h2 @test -f $@ || rm -f include/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) include/stamp-h2 include/stamp-h2: $(top_srcdir)/include/starpu_config.h.in $(top_builddir)/config.status @rm -f include/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status include/starpu_config.h gcc-plugin/include/starpu-gcc/config.h: gcc-plugin/include/starpu-gcc/stamp-h3 @test -f $@ || rm -f gcc-plugin/include/starpu-gcc/stamp-h3 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) gcc-plugin/include/starpu-gcc/stamp-h3 gcc-plugin/include/starpu-gcc/stamp-h3: $(top_srcdir)/gcc-plugin/include/starpu-gcc/config.h.in $(top_builddir)/config.status @rm -f gcc-plugin/include/starpu-gcc/stamp-h3 cd $(top_builddir) && $(SHELL) ./config.status gcc-plugin/include/starpu-gcc/config.h starpu-top/config.h: starpu-top/stamp-h4 @test -f $@ || rm -f starpu-top/stamp-h4 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) starpu-top/stamp-h4 starpu-top/stamp-h4: $(top_srcdir)/starpu-top/config.h.in $(top_builddir)/config.status @rm -f starpu-top/stamp-h4 cd $(top_builddir) && $(SHELL) ./config.status starpu-top/config.h distclean-hdr: -rm -f src/common/config.h src/common/stamp-h1 include/starpu_config.h include/stamp-h2 gcc-plugin/include/starpu-gcc/config.h gcc-plugin/include/starpu-gcc/stamp-h3 starpu-top/config.h starpu-top/stamp-h4 tests/regression/regression.sh: $(top_builddir)/config.status $(top_srcdir)/tests/regression/regression.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/profiles: $(top_builddir)/config.status $(top_srcdir)/tests/regression/profiles.in cd $(top_builddir) && $(SHELL) ./config.status $@ tests/regression/profiles.build.only: $(top_builddir)/config.status $(top_srcdir)/tests/regression/profiles.build.only.in cd $(top_builddir) && $(SHELL) ./config.status $@ socl/vendors/socl.icd: $(top_builddir)/config.status $(top_srcdir)/socl/vendors/socl.icd.in cd $(top_builddir) && $(SHELL) ./config.status $@ socl/vendors/install/socl.icd: $(top_builddir)/config.status $(top_srcdir)/socl/vendors/install/socl.icd.in cd $(top_builddir) && $(SHELL) ./config.status $@ libstarpu.pc: $(top_builddir)/config.status $(srcdir)/libstarpu.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-1.0.pc: $(top_builddir)/config.status $(srcdir)/starpu-1.0.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-1.1.pc: $(top_builddir)/config.status $(srcdir)/starpu-1.1.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-top/StarPU-Top.pro: $(top_builddir)/config.status $(top_srcdir)/starpu-top/StarPU-Top.pro.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-top/StarPU-Top-qwt-embed.pri: $(top_builddir)/config.status $(top_srcdir)/starpu-top/StarPU-Top-qwt-embed.pri.in cd $(top_builddir) && $(SHELL) ./config.status $@ starpu-top/StarPU-Top-qwt-system.pri: $(top_builddir)/config.status $(top_srcdir)/starpu-top/StarPU-Top-qwt-system.pri.in cd $(top_builddir) && $(SHELL) ./config.status $@ tools/mvsc/starpu_var.bat: $(top_builddir)/config.status $(top_srcdir)/tools/mvsc/starpu_var.bat.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-man1: $(dist_man1_MANS) @$(NORMAL_INSTALL) @list1='$(dist_man1_MANS)'; \ list2=''; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(dist_man1_MANS)'; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-txtDATA: $(txt_DATA) @$(NORMAL_INSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(txtdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(txtdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(txtdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(txtdir)" || exit $$?; \ done uninstall-txtDATA: @$(NORMAL_UNINSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(txtdir)'; $(am__uninstall_files_from_dir) install-nodist_versincludeHEADERS: $(nodist_versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-nodist_versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) install-versincludeHEADERS: $(versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives 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 distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_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 \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(MANS) $(DATA) $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(txtdir)" "$(DESTDIR)$(versincludedir)" "$(DESTDIR)$(versincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @BUILD_STARPU_TOP_FALSE@clean-local: @BUILD_STARPU_TOP_FALSE@install-exec-local: @BUILD_STARPU_TOP_FALSE@uninstall-local: clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-nodist_versincludeHEADERS \ install-pkgconfigDATA install-txtDATA \ install-versincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-local uninstall-man \ uninstall-nodist_versincludeHEADERS uninstall-pkgconfigDATA \ uninstall-txtDATA uninstall-versincludeHEADERS uninstall-man: uninstall-man1 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool clean-local cscope cscopelist-am ctags ctags-am \ dist dist-all dist-bzip2 dist-gzip dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-nodist_versincludeHEADERS install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-strip install-txtDATA install-versincludeHEADERS \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-local \ uninstall-man uninstall-man1 \ uninstall-nodist_versincludeHEADERS uninstall-pkgconfigDATA \ uninstall-txtDATA uninstall-versincludeHEADERS 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) ; \ @STARPU_DEVEL_TRUE@ then \ @STARPU_DEVEL_TRUE@ echo "Please do not use getenv, use starpu_getenv instead, which catches unsafe uses"; \ @STARPU_DEVEL_TRUE@ false ; \ @STARPU_DEVEL_TRUE@ fi @BUILD_STARPU_TOP_TRUE@all-local: starpu-top/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@starpu-top/starpu_top$(EXEEXT): @BUILD_STARPU_TOP_TRUE@ cd starpu-top ; $(QMAKE) ; $(MAKE) @BUILD_STARPU_TOP_TRUE@clean-local: @BUILD_STARPU_TOP_TRUE@ cd starpu-top ; $(QMAKE) ; $(MAKE) clean ; $(RM) Makefile @BUILD_STARPU_TOP_TRUE@ $(RM) starpu-top/starpu_top.1 starpu-top/starpu_top$(EXEEXT) # TODO: resources @BUILD_STARPU_TOP_TRUE@install-exec-local: @BUILD_STARPU_TOP_TRUE@ $(MKDIR_P) $(DESTDIR)$(bindir) @BUILD_STARPU_TOP_TRUE@ -$(INSTALL_STRIP_PROGRAM) starpu-top/starpu_top$(EXEEXT) $(DESTDIR)$(bindir) @BUILD_STARPU_TOP_TRUE@uninstall-local: @BUILD_STARPU_TOP_TRUE@ $(RM) $(DESTDIR)$(bindir)/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@ $(RM) starpu-top/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@ $(RM) starpu-top/Makefile @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@starpu-top/starpu_top.1: starpu-top/starpu_top$(EXEEXT) @BUILD_STARPU_TOP_TRUE@@STARPU_HAVE_HELP2MAN_TRUE@ help2man --no-discard-stderr -N --output=$@ starpu-top/starpu_top$(EXEEXT) showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET ctags-local: $(CTAGS) -R -I LIST_TYPE # 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.1.5/libstarpu.pc.in0000644000373600000000000000237712571536554012732 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010, 2011, 2013-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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: -L${libdir} -lstarpu-@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_LDFLAGS@ @STARPU_OPENCL_LDFLAGS@ @STARPU_SC_HYPERVISOR@ Libs.private: @LDFLAGS@ @LIBS@ Requires: @HWLOC_REQUIRES@ starpu-1.1.5/TODO0000644000373600000000000000057312571536554010460 00000000000000 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.1.5/COPYING.LGPL0000644000373600000000000006363712571536554011572 00000000000000 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.1.5/README0000644000373600000000000001220312571536600010631 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2013, 2014, 2015 CNRS # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. ++=================++ || I. Introduction || ++=================++ +--------------------- | I.a. What is StarPU? StarPU is a runtime system that offers support for heterogeneous multicore machines. While many efforts are devoted to design efficient computation kernels for those architectures (e.g. to implement BLAS kernels on GPUs), StarPU not only takes care of offloading such kernels (and implementing data coherency across the machine), but it also makes sure the kernels are executed as efficiently as possible. +------------------------ | I.b. What StarPU is not StarPU is not a new language, and it does not extend existing languages either. StarPU does not help to write computation kernels. +--------------------------------- | I.c. (How) Could StarPU help me? While StarPU will not make it easier to write computation kernels, it does simplify their actual offloading as StarPU handle most low level aspects transparently. Obviously, it is crucial to have efficient kernels, but it must be noted that the way those kernels are mapped and scheduled onto the computational resources also affect the overall performance to a great extent. StarPU is especially helpful when considering multiple heterogeneous processing resources: statically mapping and synchronizing tasks in such a heterogeneous environment is already very difficult, making it in a portable way is virtually impossible. On the other hand, the scheduling capabilities of StarPU makes it possible to easily exploit all processors at the same time while taking advantage of their specificities in a portable fashion. ++==================++ || II. Requirements || ++==================++ * make * gcc (version >= 4.1) * if CUDA support is enabled * CUDA (version >= 2.2) * CUBLAS (version >= 2.2) * if OpenCL support is enabled * AMD SDK >= 2.3 if AMD driver is used * CUDA >= 3.2 if NVIDIA driver is used * extra requirements for the svn version (we usually use the Debian testing versions) * autoconf (version >= 2.60) * automake * makeinfo * libtool (version >= 2) * Remark: It is strongly recommanded that you also install the hwloc library before installing StarPU. This permits StarPU to actually map the processing units according to the machine topology. For more details on hwloc, see http://www.open-mpi.org/projects/hwloc/ . * To build the StarPU-Top tool the following packages (along with their development files) are also required: * libqt4-dev >= 4.7 * libqt4-network * libqt4-opengl * libqt4-sql * qt4-qmake ++=====================++ || III. Getting StarPU || ++=====================++ StarPU is available on https://gforge.inria.fr/projects/starpu/. The project's SVN repository can be checked out through anonymous access with the following command(s). $ svn checkout svn://scm.gforge.inria.fr/svn/starpu/trunk $ svn checkout --username anonsvn https://scm.gforge.inria.fr/svn/starpu/trunk The password is 'anonsvn' ++=============================++ || IV. Building and Installing || ++=============================++ +--------------------------- | IV.a. For svn version only $ ./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. 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 ++============++ || VI. Trying || ++============++ Some examples ready to run are installed into $prefix/lib/starpu/{examples,mpi} ++==============++ || VII. Upgrade || ++==============++ To upgrade your source code from older version (there were quite a few renamings), use the tools/dev/rename.sh script ++===============++ || VIII. Contact || ++===============++ For any questions regarding StarPU, please contact the starpu-devel mailing-list at starpu-devel@lists.gforge.inria.fr . starpu-1.1.5/sc_hypervisor/0002755000373600000000000000000012571541166012737 500000000000000starpu-1.1.5/sc_hypervisor/Makefile.in0000644000373600000000000006326212571536633014736 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 Institut National de Recherche en Informatique et Automatique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(versinclude_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(versincludedir)" HEADERS = $(versinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src examples versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = include/sc_hypervisor.h \ include/sc_hypervisor_config.h \ include/sc_hypervisor_monitoring.h \ include/sc_hypervisor_policy.h \ include/sc_hypervisor_lp.h all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sc_hypervisor/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign sc_hypervisor/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-versincludeHEADERS: $(versinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(versincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(versincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(versincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(versincludedir)" || exit $$?; \ done uninstall-versincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(versinclude_HEADERS)'; test -n "$(versincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(versincludedir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(versincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-versincludeHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-versincludeHEADERS .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-versincludeHEADERS installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-versincludeHEADERS showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.1.5/sc_hypervisor/Makefile.am0000644000373600000000000000206312571536600014707 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 Institut National de Recherche en Informatique et Automatique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS = src examples versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = include/sc_hypervisor.h \ include/sc_hypervisor_config.h \ include/sc_hypervisor_monitoring.h \ include/sc_hypervisor_policy.h \ include/sc_hypervisor_lp.h showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET starpu-1.1.5/sc_hypervisor/src/0002755000373600000000000000000012571541166013526 500000000000000starpu-1.1.5/sc_hypervisor/src/sc_hypervisor.c0000644000373600000000000012263012571536600016510 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include 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; 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 }; static void _load_hypervisor_policy(struct sc_hypervisor_policy *policy) { STARPU_ASSERT(policy); hypervisor.policy.name = policy->name; hypervisor.policy.size_ctxs = policy->size_ctxs; hypervisor.policy.resize_ctxs = policy->resize_ctxs; hypervisor.policy.handle_poped_task = policy->handle_poped_task; hypervisor.policy.handle_pushed_task = policy->handle_pushed_task; hypervisor.policy.handle_idle_cycle = policy->handle_idle_cycle; hypervisor.policy.handle_idle_end = policy->handle_idle_end; hypervisor.policy.handle_post_exec_hook = policy->handle_post_exec_hook; hypervisor.policy.handle_submitted_job = policy->handle_submitted_job; hypervisor.policy.end_ctx = policy->end_ctx; } static struct sc_hypervisor_policy *_find_hypervisor_policy_from_name(const char *policy_name) { if (!policy_name) return NULL; unsigned i; for (i = 0; i < sizeof(predefined_policies)/sizeof(predefined_policies[0]); i++) { struct sc_hypervisor_policy *p; p = predefined_policies[i]; if (p->name) { if (strcmp(policy_name, p->name) == 0) { /* we found a policy with the requested name */ return p; } } } fprintf(stderr, "Warning: hypervisor policy \"%s\" was not found, try \"help\" to get a list\n", policy_name); /* nothing was found */ return NULL; } static void display_sched_help_message(void) { const char* policy_name = getenv("SC_HYPERVISOR_POLICY"); if (policy_name && (strcmp(policy_name, "help") == 0)) { fprintf(stderr, "SC_HYPERVISOR_POLICY can be either of\n"); /* display the description of all predefined policies */ unsigned i; for (i = 0; i < sizeof(predefined_policies)/sizeof(predefined_policies[0]); i++) { struct sc_hypervisor_policy *p = predefined_policies[i]; if (p->name) { fprintf(stderr, "%s\n", p->name); } } } } static struct sc_hypervisor_policy *_select_hypervisor_policy(struct sc_hypervisor_policy* hypervisor_policy) { struct sc_hypervisor_policy *selected_policy = NULL; if(hypervisor_policy && hypervisor_policy->custom) return hypervisor_policy; /* we look if the application specified the name of a policy to load */ const char *policy_name; if (hypervisor_policy && hypervisor_policy->name) { policy_name = hypervisor_policy->name; } else { policy_name = getenv("SC_HYPERVISOR_POLICY"); } if (policy_name) selected_policy = _find_hypervisor_policy_from_name(policy_name); /* Perhaps there was no policy that matched the name */ if (selected_policy) return selected_policy; /* If no policy was specified, we use the idle policy as a default */ return &idle_policy; } /* initializez the performance counters that starpu will use to retrive hints for resizing */ void* sc_hypervisor_init(struct sc_hypervisor_policy *hypervisor_policy) { /* Perhaps we have to display some help */ display_sched_help_message(); hypervisor.min_tasks = 0; hypervisor.nsched_ctxs = 0; char* vel_gap = getenv("SC_HYPERVISOR_MAX_SPEED_GAP"); hypervisor.max_speed_gap = vel_gap ? atof(vel_gap) : SC_SPEED_MAX_GAP_DEFAULT; char* crit = getenv("SC_HYPERVISOR_TRIGGER_RESIZE"); hypervisor.resize_criteria = !crit ? SC_IDLE : strcmp(crit,"idle") == 0 ? SC_IDLE : (strcmp(crit,"speed") == 0 ? SC_SPEED : SC_NOTHING); starpu_pthread_mutex_init(&act_hypervisor_mutex, NULL); hypervisor.start_executing_time = starpu_timing_now(); int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { hypervisor.resize[i] = 0; hypervisor.allow_remove[i] = 1; hypervisor.configurations[i] = NULL; hypervisor.sr = NULL; hypervisor.check_min_tasks[i] = 1; hypervisor.sched_ctxs[i] = STARPU_NMAX_SCHED_CTXS; hypervisor.sched_ctx_w[i].sched_ctx = STARPU_NMAX_SCHED_CTXS; hypervisor.sched_ctx_w[i].config = NULL; hypervisor.sched_ctx_w[i].total_flops = 0.0; hypervisor.sched_ctx_w[i].submitted_flops = 0.0; hypervisor.sched_ctx_w[i].remaining_flops = 0.0; hypervisor.sched_ctx_w[i].start_time = 0.0; hypervisor.sched_ctx_w[i].real_start_time = 0.0; hypervisor.sched_ctx_w[i].hyp_react_start_time = 0.0; hypervisor.sched_ctx_w[i].resize_ack.receiver_sched_ctx = -1; hypervisor.sched_ctx_w[i].resize_ack.moved_workers = NULL; hypervisor.sched_ctx_w[i].resize_ack.nmoved_workers = 0; hypervisor.sched_ctx_w[i].resize_ack.acked_workers = NULL; starpu_pthread_mutex_init(&hypervisor.sched_ctx_w[i].mutex, NULL); hypervisor.optimal_v[i] = 0.0; hypervisor.sched_ctx_w[i].ref_speed[0] = -1.0; hypervisor.sched_ctx_w[i].ref_speed[1] = -1.0; hypervisor.sched_ctx_w[i].total_flops_available = 0; hypervisor.sched_ctx_w[i].to_be_sized = 0; 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; } } 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() { if(!getenv("SC_HYPERVISOR_STOP_PRINT")) { 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); } /* the hypervisor is in charge only of the contexts registered to it*/ void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops) { starpu_pthread_mutex_lock(&act_hypervisor_mutex); hypervisor.configurations[sched_ctx] = NULL; hypervisor.resize_requests[sched_ctx] = NULL; starpu_pthread_mutex_init(&hypervisor.conf_mut[sched_ctx], NULL); starpu_pthread_mutex_init(&hypervisor.resize_mut[sched_ctx], NULL); _add_config(sched_ctx); hypervisor.sched_ctx_w[sched_ctx].sched_ctx = sched_ctx; hypervisor.sched_ctxs[hypervisor.nsched_ctxs++] = sched_ctx; hypervisor.sched_ctx_w[sched_ctx].total_flops = total_flops; hypervisor.sched_ctx_w[sched_ctx].remaining_flops = total_flops; hypervisor.resize[sched_ctx] = 1; hypervisor.sched_ctx_w[sched_ctx].hyp_react_start_time = starpu_timing_now(); 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) { if(hypervisor.policy.end_ctx) hypervisor.policy.end_ctx(sched_ctx); starpu_pthread_mutex_lock(&act_hypervisor_mutex); 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); } 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; if(workers->init_iterator) 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; if(workers->init_iterator) 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; if(workers->init_iterator) 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; } 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; _set_elapsed_flops_per_sched_ctx(sender_sched_ctx, 0.0); int i; for(i = 0; i < STARPU_NMAXWORKERS; 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; } } 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; _set_elapsed_flops_per_sched_ctx(receiver_sched_ctx, 0.0); int i; for(i = 0; i < STARPU_NMAXWORKERS; 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; } } } /* 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; printf("resize ctx %d with %d workers", sender_sched_ctx, nworkers_to_move); for(j = 0; j < nworkers_to_move; j++) printf(" %d", workers_to_move[j]); printf("\n"); starpu_trace_user_event(1); 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; printf("remove now from ctx %d:", sender_sched_ctx); for(j = 0; j < nworkers_to_move; j++) printf(" %d", workers_to_move[j]); printf("\n"); 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; printf("add to ctx %d:", sched_ctx); for(j = 0; j < nworkers_to_add; j++) printf(" %d", workers_to_add[j]); printf("\n"); 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; printf("remove explicitley now from ctx %d:", sched_ctx); for(j = 0; j < nworkers_to_remove; j++) printf(" %d", workers_to_remove[j]); printf("\n"); starpu_sched_ctx_remove_workers(workers_to_remove, nworkers_to_remove, sched_ctx); _reset_resize_sample_info(sched_ctx, STARPU_NMAX_SCHED_CTXS); } else { printf("try to remove from ctx %d: ", sched_ctx); unsigned j; for(j = 0; j < nworkers_to_remove; j++) printf(" %d", workers_to_remove[j]); printf("\n"); 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); starpu_pthread_mutex_unlock(&sc_w->mutex); 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; } void sc_hypervisor_update_resize_interval(unsigned *sched_ctxs, int nsched_ctxs) { unsigned sched_ctx; int total_max_nworkers = 0; int max_cpus = starpu_cpu_worker_get_count(); double max_workers_idle_time[nsched_ctxs]; unsigned configured = 0; int i; for(i = 0; i < nsched_ctxs; i++) { 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; if(workers->init_iterator) 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 = (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 = hypervisor.sched_ctx_w[sched_ctx].nready_tasks - 1; if(config->max_nworkers < 0) config->max_nworkers = 0; if(config->max_nworkers > max_cpus) config->max_nworkers = max_cpus; printf("%d: ready tasks %d idle for long %lf norm_idle_time %lf elapsed_time %lf norm_exec_time %lf nworker %d max %d \n", sched_ctx, nready_tasks, max_workers_idle_time[i], norm_idle_time, elapsed_time, norm_exec_time, workers->nworkers, config->max_nworkers); total_max_nworkers += config->max_nworkers; configured = 1; } /*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_cpus) { int diff = max_cpus - 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(); if(hypervisor.sched_ctx_w[sched_ctx].total_flops != 0.0 && hypervisor.sched_ctx_w[sched_ctx].real_start_time == 0.0) hypervisor.sched_ctx_w[sched_ctx].real_start_time = 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); } /* 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.resize[sched_ctx]) { 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->idle_start_time[worker] = starpu_timing_now(); if(hypervisor.policy.handle_idle_cycle) { 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) { sc_w->hyp_react_start_time = starpu_timing_now(); hypervisor.policy.handle_idle_cycle(sched_ctx, worker); } } } 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.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.resize[sched_ctx]) hypervisor.sched_ctx_w[sched_ctx].current_idle_time[worker] = 0.0; struct sc_hypervisor_wrapper *sc_w = &hypervisor.sched_ctx_w[sched_ctx]; 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 */ sc_w->idle_start_time[worker] = 0.0; } if(hypervisor.policy.handle_idle_end) hypervisor.policy.handle_idle_end(sched_ctx, worker); } /* 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(); if(hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker] != 0.0) { double current_time = starpu_timing_now(); hypervisor.sched_ctx_w[sched_ctx].exec_time[worker] += (current_time - hypervisor.sched_ctx_w[sched_ctx].exec_start_time[worker]) / 1000000.0; /* in seconds */ 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(&act_hypervisor_mutex); hypervisor.sched_ctx_w[sched_ctx].remaining_flops -= flops; if(_sc_hypervisor_use_lazy_resize()) _ack_resize_completed(sched_ctx, worker); starpu_pthread_mutex_unlock(&act_hypervisor_mutex); if(hypervisor.resize[sched_ctx]) { if(hypervisor.policy.handle_poped_task) { 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) { hypervisor.sched_ctx_w[sched_ctx].hyp_react_start_time = starpu_timing_now(); hypervisor.policy.handle_poped_task(sched_ctx, worker, 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) { starpu_pthread_mutex_lock(&act_hypervisor_mutex); hypervisor.sched_ctx_w[task->sched_ctx].submitted_flops += task->flops; starpu_pthread_mutex_unlock(&act_hypervisor_mutex); 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) { starpu_pthread_mutex_lock(&act_hypervisor_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(&act_hypervisor_mutex); } void sc_hypervisor_update_diff_elapsed_flops(unsigned sched_ctx, double diff_elapsed_flops) { int workerid = starpu_worker_get_id(); if(workerid != -1) { starpu_pthread_mutex_lock(&act_hypervisor_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(&act_hypervisor_mutex); } } starpu-1.1.5/sc_hypervisor/src/Makefile.in0000644000373600000000000012473512571536633015530 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/build-aux/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libsc_hypervisor_la_DEPENDENCIES = \ $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la am_libsc_hypervisor_la_OBJECTS = sc_hypervisor.lo sc_config.lo \ policy_tools.lo speed.lo task_pool.lo lp_tools.lo \ lp_programs.lo dichotomy.lo idle_policy.lo \ app_driven_policy.lo gflops_rate_policy.lo feft_lp_policy.lo \ teft_lp_policy.lo ispeed_policy.lo ispeed_lp_policy.lo \ throughput_lp_policy.lo libsc_hypervisor_la_OBJECTS = $(am_libsc_hypervisor_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libsc_hypervisor_la_SOURCES) DIST_SOURCES = $(libsc_hypervisor_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/sc_hypervisor/include/ -I$(top_srcdir)/sc_hypervisor/src AM_LDFLAGS = $(STARPU_CUDA_LDFLAGS) $(STARPU_OPENCL_LDFLAGS) 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 noinst_HEADERS = sc_hypervisor_intern.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sc_hypervisor/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign sc_hypervisor/src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libsc_hypervisor.la: $(libsc_hypervisor_la_OBJECTS) $(libsc_hypervisor_la_DEPENDENCIES) $(EXTRA_libsc_hypervisor_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libsc_hypervisor_la_OBJECTS) $(libsc_hypervisor_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/app_driven_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dichotomy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feft_lp_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gflops_rate_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idle_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ispeed_lp_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ispeed_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_programs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/policy_tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sc_config.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sc_hypervisor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/speed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_pool.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/teft_lp_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throughput_lp_policy.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< policy_tools.lo: policies_utils/policy_tools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT policy_tools.lo -MD -MP -MF $(DEPDIR)/policy_tools.Tpo -c -o policy_tools.lo `test -f 'policies_utils/policy_tools.c' || echo '$(srcdir)/'`policies_utils/policy_tools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/policy_tools.Tpo $(DEPDIR)/policy_tools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/policy_tools.c' object='policy_tools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o policy_tools.lo `test -f 'policies_utils/policy_tools.c' || echo '$(srcdir)/'`policies_utils/policy_tools.c speed.lo: policies_utils/speed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT speed.lo -MD -MP -MF $(DEPDIR)/speed.Tpo -c -o speed.lo `test -f 'policies_utils/speed.c' || echo '$(srcdir)/'`policies_utils/speed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/speed.Tpo $(DEPDIR)/speed.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/speed.c' object='speed.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o speed.lo `test -f 'policies_utils/speed.c' || echo '$(srcdir)/'`policies_utils/speed.c task_pool.lo: policies_utils/task_pool.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_pool.lo -MD -MP -MF $(DEPDIR)/task_pool.Tpo -c -o task_pool.lo `test -f 'policies_utils/task_pool.c' || echo '$(srcdir)/'`policies_utils/task_pool.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_pool.Tpo $(DEPDIR)/task_pool.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/task_pool.c' object='task_pool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_pool.lo `test -f 'policies_utils/task_pool.c' || echo '$(srcdir)/'`policies_utils/task_pool.c lp_tools.lo: policies_utils/lp_tools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_tools.lo -MD -MP -MF $(DEPDIR)/lp_tools.Tpo -c -o lp_tools.lo `test -f 'policies_utils/lp_tools.c' || echo '$(srcdir)/'`policies_utils/lp_tools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_tools.Tpo $(DEPDIR)/lp_tools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/lp_tools.c' object='lp_tools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_tools.lo `test -f 'policies_utils/lp_tools.c' || echo '$(srcdir)/'`policies_utils/lp_tools.c lp_programs.lo: policies_utils/lp_programs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lp_programs.lo -MD -MP -MF $(DEPDIR)/lp_programs.Tpo -c -o lp_programs.lo `test -f 'policies_utils/lp_programs.c' || echo '$(srcdir)/'`policies_utils/lp_programs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lp_programs.Tpo $(DEPDIR)/lp_programs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/lp_programs.c' object='lp_programs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lp_programs.lo `test -f 'policies_utils/lp_programs.c' || echo '$(srcdir)/'`policies_utils/lp_programs.c dichotomy.lo: policies_utils/dichotomy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dichotomy.lo -MD -MP -MF $(DEPDIR)/dichotomy.Tpo -c -o dichotomy.lo `test -f 'policies_utils/dichotomy.c' || echo '$(srcdir)/'`policies_utils/dichotomy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dichotomy.Tpo $(DEPDIR)/dichotomy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='policies_utils/dichotomy.c' object='dichotomy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dichotomy.lo `test -f 'policies_utils/dichotomy.c' || echo '$(srcdir)/'`policies_utils/dichotomy.c idle_policy.lo: hypervisor_policies/idle_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT idle_policy.lo -MD -MP -MF $(DEPDIR)/idle_policy.Tpo -c -o idle_policy.lo `test -f 'hypervisor_policies/idle_policy.c' || echo '$(srcdir)/'`hypervisor_policies/idle_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/idle_policy.Tpo $(DEPDIR)/idle_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/idle_policy.c' object='idle_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o idle_policy.lo `test -f 'hypervisor_policies/idle_policy.c' || echo '$(srcdir)/'`hypervisor_policies/idle_policy.c app_driven_policy.lo: hypervisor_policies/app_driven_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT app_driven_policy.lo -MD -MP -MF $(DEPDIR)/app_driven_policy.Tpo -c -o app_driven_policy.lo `test -f 'hypervisor_policies/app_driven_policy.c' || echo '$(srcdir)/'`hypervisor_policies/app_driven_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/app_driven_policy.Tpo $(DEPDIR)/app_driven_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/app_driven_policy.c' object='app_driven_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o app_driven_policy.lo `test -f 'hypervisor_policies/app_driven_policy.c' || echo '$(srcdir)/'`hypervisor_policies/app_driven_policy.c gflops_rate_policy.lo: hypervisor_policies/gflops_rate_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gflops_rate_policy.lo -MD -MP -MF $(DEPDIR)/gflops_rate_policy.Tpo -c -o gflops_rate_policy.lo `test -f 'hypervisor_policies/gflops_rate_policy.c' || echo '$(srcdir)/'`hypervisor_policies/gflops_rate_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gflops_rate_policy.Tpo $(DEPDIR)/gflops_rate_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/gflops_rate_policy.c' object='gflops_rate_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gflops_rate_policy.lo `test -f 'hypervisor_policies/gflops_rate_policy.c' || echo '$(srcdir)/'`hypervisor_policies/gflops_rate_policy.c feft_lp_policy.lo: hypervisor_policies/feft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feft_lp_policy.lo -MD -MP -MF $(DEPDIR)/feft_lp_policy.Tpo -c -o feft_lp_policy.lo `test -f 'hypervisor_policies/feft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/feft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/feft_lp_policy.Tpo $(DEPDIR)/feft_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/feft_lp_policy.c' object='feft_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feft_lp_policy.lo `test -f 'hypervisor_policies/feft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/feft_lp_policy.c teft_lp_policy.lo: hypervisor_policies/teft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT teft_lp_policy.lo -MD -MP -MF $(DEPDIR)/teft_lp_policy.Tpo -c -o teft_lp_policy.lo `test -f 'hypervisor_policies/teft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/teft_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/teft_lp_policy.Tpo $(DEPDIR)/teft_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/teft_lp_policy.c' object='teft_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o teft_lp_policy.lo `test -f 'hypervisor_policies/teft_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/teft_lp_policy.c ispeed_policy.lo: hypervisor_policies/ispeed_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ispeed_policy.lo -MD -MP -MF $(DEPDIR)/ispeed_policy.Tpo -c -o ispeed_policy.lo `test -f 'hypervisor_policies/ispeed_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ispeed_policy.Tpo $(DEPDIR)/ispeed_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/ispeed_policy.c' object='ispeed_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ispeed_policy.lo `test -f 'hypervisor_policies/ispeed_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_policy.c ispeed_lp_policy.lo: hypervisor_policies/ispeed_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ispeed_lp_policy.lo -MD -MP -MF $(DEPDIR)/ispeed_lp_policy.Tpo -c -o ispeed_lp_policy.lo `test -f 'hypervisor_policies/ispeed_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ispeed_lp_policy.Tpo $(DEPDIR)/ispeed_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/ispeed_lp_policy.c' object='ispeed_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ispeed_lp_policy.lo `test -f 'hypervisor_policies/ispeed_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/ispeed_lp_policy.c throughput_lp_policy.lo: hypervisor_policies/throughput_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT throughput_lp_policy.lo -MD -MP -MF $(DEPDIR)/throughput_lp_policy.Tpo -c -o throughput_lp_policy.lo `test -f 'hypervisor_policies/throughput_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/throughput_lp_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/throughput_lp_policy.Tpo $(DEPDIR)/throughput_lp_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hypervisor_policies/throughput_lp_policy.c' object='throughput_lp_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o throughput_lp_policy.lo `test -f 'hypervisor_policies/throughput_lp_policy.c' || echo '$(srcdir)/'`hypervisor_policies/throughput_lp_policy.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.1.5/sc_hypervisor/src/policies_utils/0002755000373600000000000000000012571541166016555 500000000000000starpu-1.1.5/sc_hypervisor/src/policies_utils/lp_tools.c0000644000373600000000000004754412571536601020506 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include "sc_hypervisor_intern.h" #include double sc_hypervisor_lp_get_nworkers_per_ctx(int nsched_ctxs, int ntypes_of_workers, double res[nsched_ctxs][ntypes_of_workers], int total_nw[ntypes_of_workers], struct types_of_workers *tw) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); #ifdef STARPU_HAVE_GLPK_H double v[nsched_ctxs][ntypes_of_workers]; double flops[nsched_ctxs]; sc_hypervisor_update_resize_interval(sched_ctxs, nsched_ctxs); 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); 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(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; printf("%d: flops %lf remaining flops %lf ready flops %lf nready_tasks %d\n", sched_ctxs[i], flops[i], sc_w->remaining_flops/1000000000, ready_flops/1000000000, nready_tasks); } 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]); if(config->max_nworkers != 0) { 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++; } } 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; } } /* 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(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]; return sc_hypervisor_lp_get_nworkers_per_ctx(nsched_ctxs, nw, res, total_nw, tw) * 1000.0; } 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[nw] = 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; if(workers->init_iterator) 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())); } } /* 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.1.5/sc_hypervisor/src/policies_utils/task_pool.c0000644000373600000000000000534712571536601020641 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" void sc_hypervisor_policy_add_task_to_pool(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools, size_t data_size) { struct sc_hypervisor_policy_task_pool *tp = NULL; for (tp = *task_pools; tp; tp = tp->next) { if (tp && tp->cl == cl && tp->footprint == footprint && tp->sched_ctx_id == sched_ctx) break; } if (!tp) { tp = (struct sc_hypervisor_policy_task_pool *) malloc(sizeof(struct sc_hypervisor_policy_task_pool)); tp->cl = cl; tp->footprint = footprint; tp->sched_ctx_id = sched_ctx; tp->n = 0; tp->next = *task_pools; tp->data_size = data_size; *task_pools = tp; } /* One more task of this kind */ tp->n++; } void sc_hypervisor_policy_remove_task_from_pool(struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools) { /* count the tasks of the same type */ struct sc_hypervisor_policy_task_pool *tp = NULL; for (tp = *task_pools; tp; tp = tp->next) { if (tp && tp->cl == task->cl && tp->footprint == footprint && tp->sched_ctx_id == task->sched_ctx) break; } if (tp) { if(tp->n > 1) tp->n--; else { if(tp == *task_pools) { struct sc_hypervisor_policy_task_pool *next_tp = NULL; if((*task_pools)->next) next_tp = (*task_pools)->next; free(tp); tp = NULL; if(next_tp) *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.1.5/sc_hypervisor/src/policies_utils/dichotomy.c0000644000373600000000000000600512571536601020635 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include /* executes the function lp_estimated_distrib_func over the interval [tmin, tmax] until it finds the lowest value that still has solutions */ unsigned sc_hypervisor_lp_execute_dichotomy(int ns, int nw, double w_in_s[ns][nw], unsigned solve_lp_integer, void *specific_data, double tmin, double tmax, double smallest_tmax, double (*lp_estimated_distrib_func)(int ns, int nw, double draft_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specifc_data)) { double res = 1.0; unsigned has_sol = 0; double old_tmax = 0.0; unsigned found_sol = 0; struct timeval start_time; struct timeval end_time; int nd = 0; gettimeofday(&start_time, NULL); /* we fix tmax and we do not treat it as an unknown we just vary by dichotomy its values*/ while(tmax > 1.0) { /* 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 */ res = lp_estimated_distrib_func(ns, nw, w_in_s, solve_lp_integer, tmax, specific_data); if(res != 0.0) { has_sol = 1; found_sol = 1; } else has_sol = 0; /* if we have a solution with this tmax try a smaller value bigger than the old min */ if(has_sol) { if(old_tmax != 0.0 && (old_tmax - tmax) < 0.5) break; old_tmax = tmax; } else /*else try a bigger one but smaller than the old tmax */ { tmin = tmax; if(old_tmax != 0.0) tmax = old_tmax; } if(tmin == tmax) break; tmax = sc_hypervisor_lp_find_tmax(tmin, tmax); if(tmax < smallest_tmax) { tmax = old_tmax; tmin = smallest_tmax; tmax = sc_hypervisor_lp_find_tmax(tmin, tmax); } nd++; } 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.1.5/sc_hypervisor/src/policies_utils/lp_programs.c0000644000373600000000000004315012571536601021165 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * GNU Linear Programming Kit backend */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_lp.h" #ifdef STARPU_HAVE_GLPK_H double sc_hypervisor_lp_simulate_distrib_tasks(int ns, int nw, int nt, double w_in_s[ns][nw], double tasks[nw][nt], double times[nw][nt], unsigned is_integer, double tmax, unsigned *in_sched_ctxs, struct sc_hypervisor_policy_task_pool *tmp_task_pools) { struct sc_hypervisor_policy_task_pool * tp; int t, w, s; glp_prob *lp; lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_name(lp, "total execution time"); { int ne = nt * nw /* worker execution time */ + nw * ns + nw * (nt + ns) + 1; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; /* Variables: number of tasks i assigned to worker j, and tmax */ glp_add_cols(lp, nw*nt+ns*nw); #define colnum(w, t) ((t)*nw+(w)+1) for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) glp_set_obj_coef(lp, nw*nt+s*nw+w+1, 1.); for (w = 0; w < nw; w++) for (t = 0; t < nt; t++) { char name[32]; snprintf(name, sizeof(name), "w%dt%dn", w, t); glp_set_col_name(lp, colnum(w, t), name); /* if (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])) 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++; 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; 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 in tmax = %lf\n", tmax); 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 (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("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"); 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); for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctxs[s]); 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(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(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); } n++; } } /*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++; // if(last_vmax == -1.0) { /*sum(all gpus) = 3*/ if(w == 0) glp_set_row_bnds(lp, ns+w+1, GLP_UP, 0, total_nw[0]); /*sum(all cpus) = 9*/ if(w == 1) glp_set_row_bnds(lp, ns+w+1, GLP_UP, 0, total_nw[1]); } /* else */ /* { */ /* /\*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); printf("vmax = %lf \n", vmax); 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); printf("%d/%d: res %lf flops = %lf v = %lf\n", w,s, res[s][w], flops[s], v[s][w]); 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.1.5/sc_hypervisor/src/policies_utils/policy_tools.c0000644000373600000000000004320712571536601021362 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_intern.h" #include "sc_hypervisor_lp.h" static int _compute_priority(unsigned sched_ctx) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctx); int total_priority = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int worker; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) 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; if(workers->init_iterator) 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; if(workers->init_iterator) 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, tp = task_pools; tp; t++, tp = tp->next) { int worker = workers == NULL ? w : workers[w]; enum starpu_perfmodel_archtype arch = starpu_worker_get_perf_archtype(worker); 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(0, starpu_worker_get_memory_node(worker)); transfer_time += (tp->data_size / transfer_speed) / 1000. ; double latency = starpu_transfer_latency(0, starpu_worker_get_memory_node(worker)); transfer_time += latency/1000.; } 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), 0); transfer_time += (tp->data_size / transfer_speed) / 1000. ; double latency = starpu_transfer_latency(starpu_worker_get_memory_node(worker), 0); 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) { printf("w%d/ctx%d: current idle %lf max_idle %lf\n", worker, sched_ctx, sc_w->idle_time[worker], config->max_idle[worker]); if(sc_w->idle_time[worker] > config->max_idle[worker]) { // sc_w->current_idle_time[worker] = 0.0; return 1; } } return 0; } /* check if there is a big speed gap between the contexts */ unsigned sc_hypervisor_check_speed_gap_btw_ctxs(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int ns = sc_hypervisor_get_nsched_ctxs(); int *workers = NULL; int nworkers = starpu_worker_get_count(); 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(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); 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]*v[w]; } _set_optimal_v(i, optimal_v[i]); } has_opt_v = 1; } } /* 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); if(ctx_v != -1.0 && ((ctx_v < 0.8*optimal_v[i]) || ctx_v > 1.2*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_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(); } else return 0; } starpu-1.1.5/sc_hypervisor/src/policies_utils/speed.c0000644000373600000000000001656612571536601017753 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" #include "sc_hypervisor_intern.h" #include double sc_hypervisor_get_ctx_speed(struct sc_hypervisor_wrapper* sc_w) { struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); double sample = config->ispeed_ctx_sample; double total_elapsed_flops = sc_hypervisor_get_total_elapsed_flops_per_sched_ctx(sc_w); double total_flops = sc_w->total_flops; char *start_sample_prc_char = getenv("SC_HYPERVISOR_START_RESIZE"); double start_sample_prc = start_sample_prc_char ? atof(start_sample_prc_char) : 0.0; double start_sample = start_sample_prc > 0.0 ? (start_sample_prc / 100) * total_flops : sample; double redim_sample = elapsed_flops == total_elapsed_flops ? (start_sample > 0.0 ? start_sample : sample) : sample; double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - sc_w->start_time) / 1000000.0; /* in seconds */ unsigned can_compute_speed = 0; char *speed_sample_criteria = getenv("SC_HYPERVISOR_SAMPLE_CRITERIA"); if(speed_sample_criteria && (strcmp(speed_sample_criteria, "time") == 0)) can_compute_speed = elapsed_time > config->time_sample; else can_compute_speed = elapsed_flops >= redim_sample; if(can_compute_speed) { return (elapsed_flops/1000000000.0)/elapsed_time;/* in Gflops/s */ } return -1.0; } double sc_hypervisor_get_speed_per_worker(struct sc_hypervisor_wrapper *sc_w, unsigned worker) { if(!starpu_sched_ctx_contains_worker(worker, sc_w->sched_ctx)) return -1.0; double elapsed_flops = sc_w->elapsed_flops[worker] / 1000000000.0; /*in gflops */ struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sc_w->sched_ctx); double sample = config->ispeed_w_sample[worker] / 1000000000.0; /*in gflops */ double ctx_elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); double ctx_sample = config->ispeed_ctx_sample; if(ctx_elapsed_flops > ctx_sample && elapsed_flops == 0.0) return 0.00000000000001; if( elapsed_flops > sample) { double curr_time = starpu_timing_now(); double elapsed_time = (curr_time - sc_w->start_time) / 1000000.0; /* in seconds */ elapsed_time -= sc_w->idle_time[worker]; sc_w->idle_time[worker] = 0.0; /* 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(0, starpu_worker_get_memory_node(worker)); *\/ */ /* /\* elapsed_time += (elapsed_data_used / transfer_speed) / 1000000 ; *\/ */ /* /\* } *\/ */ /* double latency = starpu_transfer_latency(0, 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; if(workers->init_iterator) 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]) { 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; } starpu-1.1.5/sc_hypervisor/src/sc_hypervisor_intern.h0000644000373600000000000000664712571536601020106 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "uthash.h" #define SC_SPEED_MAX_GAP_DEFAULT 50 #define SC_HYPERVISOR_DEFAULT_CPU_SPEED 5.0 #define SC_HYPERVISOR_DEFAULT_CUDA_SPEED 100.0 struct size_request { int *workers; int nworkers; unsigned *sched_ctxs; int nsched_ctxs; }; /* Entry in the resize request hash table. */ struct resize_request_entry { /* Key: the tag of tasks concerned by this resize request. */ uint32_t task_tag; /* Value: identifier of the scheduling context needing to be resized. * The value doesn't matter since the hash table is used only to test * membership of a task tag. */ unsigned sched_ctx; /* Bookkeeping. */ UT_hash_handle hh; }; /* structure to indicate when the moving of workers was actually done (moved workers can be seen in the new ctx ) */ struct resize_ack { /* receiver context */ int receiver_sched_ctx; /* list of workers required to be moved */ int *moved_workers; /* number of workers required to be moved */ int nmoved_workers; /* list of workers that actually got in the receiver ctx */ int *acked_workers; }; struct configuration_entry { /* Key: the tag of tasks concerned by this configuration. */ uint32_t task_tag; /* Value: configuration of the scheduling context. */ struct sc_hypervisor_policy_config *configuration; /* Bookkeeping. */ UT_hash_handle hh; }; struct sc_hypervisor { struct sc_hypervisor_wrapper sched_ctx_w[STARPU_NMAX_SCHED_CTXS]; unsigned sched_ctxs[STARPU_NMAX_SCHED_CTXS]; unsigned nsched_ctxs; unsigned resize[STARPU_NMAX_SCHED_CTXS]; unsigned allow_remove[STARPU_NMAX_SCHED_CTXS]; int min_tasks; struct sc_hypervisor_policy policy; struct configuration_entry *configurations[STARPU_NMAX_SCHED_CTXS]; /* Set of pending resize requests for any context/tag pair. */ struct resize_request_entry *resize_requests[STARPU_NMAX_SCHED_CTXS]; starpu_pthread_mutex_t conf_mut[STARPU_NMAX_SCHED_CTXS]; starpu_pthread_mutex_t resize_mut[STARPU_NMAX_SCHED_CTXS]; struct size_request *sr; int check_min_tasks[STARPU_NMAX_SCHED_CTXS]; /* time when the hypervisor started */ double start_executing_time; /* max speed diff btw ctx before triggering resizing */ double max_speed_gap; /* criteria to trigger resizing */ unsigned resize_criteria; /* value of the speed to compare the speed of the context to */ double optimal_v[STARPU_NMAX_SCHED_CTXS]; }; struct sc_hypervisor_adjustment { int workerids[STARPU_NMAXWORKERS]; int nworkers; }; struct sc_hypervisor hypervisor; void _add_config(unsigned sched_ctx); void _remove_config(unsigned sched_ctx); double _get_max_speed_gap(); double _get_optimal_v(unsigned sched_ctx); void _set_optimal_v(unsigned sched_ctx, double optimal_v); int _sc_hypervisor_use_lazy_resize(void); void _sc_hypervisor_allow_compute_idle(unsigned sched_ctx, int worker, unsigned allow); starpu-1.1.5/sc_hypervisor/src/sc_config.c0000644000373600000000000001543512571536600015547 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static struct sc_hypervisor_policy_config* _create_config(void) { struct sc_hypervisor_policy_config *config = (struct sc_hypervisor_policy_config *)malloc(sizeof(struct sc_hypervisor_policy_config)); config->min_nworkers = -1; config->max_nworkers = -1; config->new_workers_max_idle = -1.0; config->ispeed_ctx_sample = 0.0; config->time_sample = 0.5; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { config->granularity = -1; config->priority[i] = -1; config->fixed_workers[i] = -1; config->max_idle[i] = -1.0; config->min_working[i] = -1.0; config->ispeed_w_sample[i] = 0.0; } return config; } static void _update_config(struct sc_hypervisor_policy_config *old, struct sc_hypervisor_policy_config* new) { old->min_nworkers = new->min_nworkers != -1 ? new->min_nworkers : old->min_nworkers ; old->max_nworkers = new->max_nworkers != -1 ? new->max_nworkers : old->max_nworkers ; old->new_workers_max_idle = new->new_workers_max_idle != -1.0 ? new->new_workers_max_idle : old->new_workers_max_idle; old->granularity = new->granularity != -1 ? new->granularity : old->granularity; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { old->priority[i] = new->priority[i] != -1 ? new->priority[i] : old->priority[i]; old->fixed_workers[i] = new->fixed_workers[i] != -1 ? new->fixed_workers[i] : old->fixed_workers[i]; old->max_idle[i] = new->max_idle[i] != -1.0 ? new->max_idle[i] : old->max_idle[i]; old->min_working[i] = new->min_working[i] != -1.0 ? new->min_working[i] : old->min_working[i]; } } void sc_hypervisor_set_config(unsigned sched_ctx, void *config) { if(hypervisor.sched_ctx_w[sched_ctx].config != NULL && config != NULL) { _update_config(hypervisor.sched_ctx_w[sched_ctx].config, config); } else { hypervisor.sched_ctx_w[sched_ctx].config = config; } return; } void _add_config(unsigned sched_ctx) { struct sc_hypervisor_policy_config *config = _create_config(); config->min_nworkers = 0; config->max_nworkers = starpu_worker_get_count(); config->new_workers_max_idle = MAX_IDLE_TIME; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) { config->granularity = 1; config->priority[i] = 0; config->fixed_workers[i] = 0; config->max_idle[i] = MAX_IDLE_TIME; config->min_working[i] = MIN_WORKING_TIME; } sc_hypervisor_set_config(sched_ctx, config); } void _remove_config(unsigned sched_ctx) { sc_hypervisor_set_config(sched_ctx, NULL); } struct sc_hypervisor_policy_config* sc_hypervisor_get_config(unsigned sched_ctx) { return hypervisor.sched_ctx_w[sched_ctx].config; } static struct sc_hypervisor_policy_config* _ctl(unsigned sched_ctx, va_list varg_list, unsigned later) { struct sc_hypervisor_policy_config *config = NULL; if(later) config = _create_config(); else config = sc_hypervisor_get_config(sched_ctx); assert(config != NULL); int arg_type; int i; int *workerids; int nworkers; while ((arg_type = va_arg(varg_list, int)) != SC_HYPERVISOR_NULL) { switch(arg_type) { case SC_HYPERVISOR_MAX_IDLE: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); double max_idle = va_arg(varg_list, double); for(i = 0; i < nworkers; i++) config->max_idle[workerids[i]] = max_idle; break; case SC_HYPERVISOR_MIN_WORKING: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); double min_working = va_arg(varg_list, double); for(i = 0; i < nworkers; i++) config->min_working[workerids[i]] = min_working; break; case SC_HYPERVISOR_PRIORITY: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); int priority = va_arg(varg_list, int); for(i = 0; i < nworkers; i++) config->priority[workerids[i]] = priority; break; case SC_HYPERVISOR_MIN_WORKERS: config->min_nworkers = va_arg(varg_list, unsigned); break; case SC_HYPERVISOR_MAX_WORKERS: config->max_nworkers = va_arg(varg_list, unsigned); break; case SC_HYPERVISOR_GRANULARITY: config->granularity = va_arg(varg_list, unsigned); break; case SC_HYPERVISOR_FIXED_WORKERS: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); for(i = 0; i < nworkers; i++) config->fixed_workers[workerids[i]] = 1; break; case SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE: config->new_workers_max_idle = va_arg(varg_list, double); break; case SC_HYPERVISOR_ISPEED_W_SAMPLE: workerids = va_arg(varg_list, int*); nworkers = va_arg(varg_list, int); double sample = va_arg(varg_list, double); for(i = 0; i < nworkers; i++) config->ispeed_w_sample[workerids[i]] = sample; break; case SC_HYPERVISOR_ISPEED_CTX_SAMPLE: config->ispeed_ctx_sample = va_arg(varg_list, double); break; case SC_HYPERVISOR_TIME_SAMPLE: config->time_sample = va_arg(varg_list, double); break; /* not important for the strateg, needed just to jump these args in the iteration of the args */ case SC_HYPERVISOR_TIME_TO_APPLY: va_arg(varg_list, int); break; case SC_HYPERVISOR_MIN_TASKS: va_arg(varg_list, int); break; } } va_end(varg_list); return later ? config : NULL; } void sc_hypervisor_ctl(unsigned sched_ctx, ...) { va_list varg_list; va_start(varg_list, sched_ctx); int arg_type; int stop = 0; int task_tag = -1; while ((arg_type = va_arg(varg_list, int)) != SC_HYPERVISOR_NULL) { switch(arg_type) { case SC_HYPERVISOR_TIME_TO_APPLY: task_tag = va_arg(varg_list, int); stop = 1; break; case SC_HYPERVISOR_MIN_TASKS: hypervisor.min_tasks = va_arg(varg_list, int); hypervisor.check_min_tasks[sched_ctx] = 1; break; } if(stop) break; } va_end(varg_list); va_start(varg_list, sched_ctx); /* if config not null => save hypervisor configuration and consider it later */ struct sc_hypervisor_policy_config *config = _ctl(sched_ctx, varg_list, (task_tag > 0)); if(config != NULL) { struct configuration_entry *entry; entry = malloc(sizeof *entry); STARPU_ASSERT(entry != NULL); entry->task_tag = task_tag; entry->configuration = config; starpu_pthread_mutex_lock(&hypervisor.conf_mut[sched_ctx]); HASH_ADD_INT(hypervisor.configurations[sched_ctx], task_tag, entry); starpu_pthread_mutex_unlock(&hypervisor.conf_mut[sched_ctx]); } return; } starpu-1.1.5/sc_hypervisor/src/Makefile.am0000644000373600000000000000344312571536601015502 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011, 2012 INRIA # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/libstarpu-@STARPU_EFFECTIVE_VERSION@.la AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/sc_hypervisor/include/ -I$(top_srcdir)/sc_hypervisor/src AM_LDFLAGS = $(STARPU_CUDA_LDFLAGS) $(STARPU_OPENCL_LDFLAGS) 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 noinst_HEADERS = sc_hypervisor_intern.h showcheck: -cat /dev/null starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/0002755000373600000000000000000012571541166017627 500000000000000starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/gflops_rate_policy.c0000644000373600000000000003000612571536600023571 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" static double _get_total_elapsed_flops_per_sched_ctx(unsigned sched_ctx) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); double ret_val = 0.0; int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) ret_val += sc_w->total_elapsed_flops[i]; return ret_val; } double _get_exp_end(unsigned sched_ctx) { struct sc_hypervisor_wrapper *sc_w = sc_hypervisor_get_wrapper(sched_ctx); double elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); if( elapsed_flops >= 1.0) { double curr_time = starpu_timing_now(); double elapsed_time = curr_time - sc_w->start_time; double exp_end = (elapsed_time * sc_w->remaining_flops / elapsed_flops) + curr_time; return exp_end; } return -1.0; } /* computes the instructions left to be executed out of the total instructions to execute */ double _get_flops_left_pct(unsigned sched_ctx) { struct sc_hypervisor_wrapper *wrapper = sc_hypervisor_get_wrapper(sched_ctx); double total_elapsed_flops = _get_total_elapsed_flops_per_sched_ctx(sched_ctx); if(wrapper->total_flops == total_elapsed_flops || total_elapsed_flops > wrapper->total_flops) return 0.0; return (wrapper->total_flops - total_elapsed_flops)/wrapper->total_flops; } /* select the workers needed to be moved in order to force the sender and the receiver context to finish simultaneously */ static int* _get_workers_to_move(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *nworkers) { struct sc_hypervisor_wrapper* sender_sc_w = sc_hypervisor_get_wrapper(sender_sched_ctx); struct sc_hypervisor_wrapper* receiver_sc_w = sc_hypervisor_get_wrapper(receiver_sched_ctx); int *workers = NULL; double v_receiver = sc_hypervisor_get_ctx_speed(receiver_sc_w); double receiver_remainig_flops = receiver_sc_w->remaining_flops; double sender_exp_end = _get_exp_end(sender_sched_ctx); double sender_v_cpu = sc_hypervisor_get_speed_per_worker_type(sender_sc_w, STARPU_CPU_WORKER); double v_for_rctx = (receiver_remainig_flops/(sender_exp_end - starpu_timing_now())) - v_receiver; int nworkers_needed = v_for_rctx/sender_v_cpu; /* printf("%d->%d: v_rec %lf v %lf v_cpu %lf w_needed %d \n", sender_sched_ctx, receiver_sched_ctx, */ /* v_receiver, v_for_rctx, sender_v_cpu, nworkers_needed); */ if(nworkers_needed > 0) { struct sc_hypervisor_policy_config *sender_config = sc_hypervisor_get_config(sender_sched_ctx); int potential_moving_cpus = sc_hypervisor_get_movable_nworkers(sender_config, sender_sched_ctx, STARPU_CPU_WORKER); int potential_moving_gpus = sc_hypervisor_get_movable_nworkers(sender_config, sender_sched_ctx, STARPU_CUDA_WORKER); int sender_nworkers = (int)starpu_sched_ctx_get_nworkers(sender_sched_ctx); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(receiver_sched_ctx); int nworkers_ctx = (int)starpu_sched_ctx_get_nworkers(receiver_sched_ctx); if(nworkers_needed < (potential_moving_cpus + 5 * potential_moving_gpus)) { if((sender_nworkers - nworkers_needed) >= sender_config->min_nworkers) { if((nworkers_ctx + nworkers_needed) > config->max_nworkers) nworkers_needed = nworkers_ctx > config->max_nworkers ? 0 : (config->max_nworkers - nworkers_ctx); if(nworkers_needed > 0) { int ngpus = nworkers_needed / 5; int *gpus; gpus = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &ngpus, STARPU_CUDA_WORKER); int ncpus = nworkers_needed - ngpus; int *cpus; cpus = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &ncpus, STARPU_CPU_WORKER); workers = (int*)malloc(nworkers_needed*sizeof(int)); int i; printf("%d: gpus: ", nworkers_needed); for(i = 0; i < ngpus; i++) { workers[(*nworkers)++] = gpus[i]; printf("%d ", gpus[i]); } printf(" cpus:"); for(i = 0; i < ncpus; i++) { workers[(*nworkers)++] = cpus[i]; printf("%d ", cpus[i]); } printf("\n"); free(gpus); free(cpus); } } } else { /*if the needed number of workers is to big we only move the number of workers corresponding to the granularity set by the user */ int nworkers_to_move = sc_hypervisor_compute_nworkers_to_move(sender_sched_ctx); if(sender_nworkers - nworkers_to_move >= sender_config->min_nworkers) { int nshared_workers = (int)starpu_sched_ctx_get_nshared_workers(sender_sched_ctx, receiver_sched_ctx); if((nworkers_ctx + nworkers_to_move - nshared_workers) > config->max_nworkers) nworkers_to_move = nworkers_ctx > config->max_nworkers ? 0 : (config->max_nworkers - nworkers_ctx + nshared_workers); if(nworkers_to_move > 0) { workers = sc_hypervisor_get_idlest_workers(sender_sched_ctx, &nworkers_to_move, STARPU_ANY_WORKER); *nworkers = nworkers_to_move; } } } } return workers; } static unsigned _gflops_rate_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize) { int ret = 1; if(force_resize) starpu_pthread_mutex_lock(&act_hypervisor_mutex); else ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { int nworkers_to_move = 0; int *workers_to_move = _get_workers_to_move(sender_sched_ctx, receiver_sched_ctx, &nworkers_to_move); if(nworkers_to_move > 0) { sc_hypervisor_move_workers(sender_sched_ctx, receiver_sched_ctx, workers_to_move, nworkers_to_move, 0); struct sc_hypervisor_policy_config *new_config = sc_hypervisor_get_config(receiver_sched_ctx); int i; for(i = 0; i < nworkers_to_move; i++) new_config->max_idle[workers_to_move[i]] = new_config->max_idle[workers_to_move[i]] !=MAX_IDLE_TIME ? new_config->max_idle[workers_to_move[i]] : new_config->new_workers_max_idle; free(workers_to_move); } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); return 1; } return 0; } static int _find_fastest_sched_ctx() { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); double first_exp_end = _get_exp_end(sched_ctxs[0]); int fastest_sched_ctx = first_exp_end == -1.0 ? -1 : (int)sched_ctxs[0]; double curr_exp_end = 0.0; int i; for(i = 1; i < nsched_ctxs; i++) { curr_exp_end = _get_exp_end(sched_ctxs[i]); if((curr_exp_end < first_exp_end || first_exp_end == -1.0) && curr_exp_end != -1.0) { first_exp_end = curr_exp_end; fastest_sched_ctx = sched_ctxs[i]; } } return fastest_sched_ctx; } static int _find_slowest_sched_ctx() { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int slowest_sched_ctx = -1; double curr_exp_end = 0.0; double last_exp_end = -1.0; int i; for(i = 0; i < nsched_ctxs; i++) { curr_exp_end = _get_exp_end(sched_ctxs[i]); /*if it hasn't started bc of no ressources give it priority */ if(curr_exp_end == -1.0) return sched_ctxs[i]; if( curr_exp_end > last_exp_end) { slowest_sched_ctx = sched_ctxs[i]; last_exp_end = curr_exp_end; } } return slowest_sched_ctx; } static int _find_slowest_available_sched_ctx(unsigned sched_ctx) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int slowest_sched_ctx = -1; double curr_exp_end = 0.0; double last_exp_end = -1.0; int i; for(i = 0; i < nsched_ctxs; i++) { if(sched_ctxs[i] != sched_ctx) { curr_exp_end = _get_exp_end(sched_ctxs[i]); /*if it hasn't started bc of no ressources give it priority */ if(curr_exp_end == -1.0) return sched_ctxs[i]; if(last_exp_end < curr_exp_end) { slowest_sched_ctx = sched_ctxs[i]; last_exp_end = curr_exp_end; } } } return slowest_sched_ctx; } static void gflops_rate_resize(unsigned sched_ctx) { _get_exp_end(sched_ctx); double flops_left_pct = _get_flops_left_pct(sched_ctx); /* if the context finished all the instructions it had to execute we move all the resources to the slowest context */ if(flops_left_pct == 0.0f) { int slowest_sched_ctx = _find_slowest_available_sched_ctx(sched_ctx); if(slowest_sched_ctx != -1) { double slowest_flops_left_pct = _get_flops_left_pct(slowest_sched_ctx); if(slowest_flops_left_pct != 0.0f) { struct sc_hypervisor_policy_config* config = sc_hypervisor_get_config(sched_ctx); config->min_nworkers = 0; config->max_nworkers = 0; printf("ctx %d finished & gives away the res to %d; slow_left %lf\n", sched_ctx, slowest_sched_ctx, slowest_flops_left_pct); sc_hypervisor_policy_resize(sched_ctx, slowest_sched_ctx, 1, 1); sc_hypervisor_stop_resize(slowest_sched_ctx); } } } int fastest_sched_ctx = _find_fastest_sched_ctx(); int slowest_sched_ctx = _find_slowest_sched_ctx(); if(fastest_sched_ctx != -1 && slowest_sched_ctx != -1 && fastest_sched_ctx != slowest_sched_ctx) { double fastest_exp_end = _get_exp_end(fastest_sched_ctx); double slowest_exp_end = _get_exp_end(slowest_sched_ctx); if((slowest_exp_end == -1.0 && fastest_exp_end != -1.0) || ((fastest_exp_end + (fastest_exp_end*0.5)) < slowest_exp_end )) { double fast_flops_left_pct = _get_flops_left_pct(fastest_sched_ctx); if(fast_flops_left_pct < 0.8) { struct sc_hypervisor_wrapper *sc_w = sc_hypervisor_get_wrapper(slowest_sched_ctx); double elapsed_flops = sc_hypervisor_get_elapsed_flops_per_sched_ctx(sc_w); if((elapsed_flops/sc_w->total_flops) > 0.1) _gflops_rate_resize(fastest_sched_ctx, slowest_sched_ctx, 0); } } } } static void gflops_rate_handle_poped_task(unsigned sched_ctx, __attribute__((unused)) int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { gflops_rate_resize(sched_ctx); } struct sc_hypervisor_policy gflops_rate_policy = { .size_ctxs = NULL, .resize_ctxs = NULL, .handle_poped_task = gflops_rate_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "gflops_rate" }; starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/idle_policy.c0000644000373600000000000000317612571536600022211 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" unsigned worker_belong_to_other_sched_ctx(unsigned sched_ctx, int worker) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int i; for(i = 0; i < nsched_ctxs; i++) if(sched_ctxs[i] != sched_ctx && starpu_sched_ctx_contains_worker(worker, sched_ctxs[i])) return 1; return 0; } void idle_handle_idle_cycle(unsigned sched_ctx, int worker) { if(sc_hypervisor_criteria_fulfilled(sched_ctx, worker)) { if(worker_belong_to_other_sched_ctx(sched_ctx, worker)) sc_hypervisor_remove_workers_from_sched_ctx(&worker, 1, sched_ctx, 1); else sc_hypervisor_policy_resize_to_unknown_receiver(sched_ctx, 0); } } struct sc_hypervisor_policy idle_policy = { .size_ctxs = NULL, .handle_poped_task = NULL, .handle_pushed_task = NULL, .handle_idle_cycle = idle_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "idle" }; starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/throughput_lp_policy.c0000644000373600000000000002267212571536600024202 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include static double _glp_resolve(int ns, int nw, double speed[ns][nw], double w_in_s[ns][nw], unsigned integer); static unsigned _compute_max_speed(int ns, int nw, double w_in_s[ns][nw], unsigned *in_sched_ctxs, int *workers) { double speed[ns][nw]; unsigned *sched_ctxs = in_sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : in_sched_ctxs; int w,s; struct sc_hypervisor_wrapper* sc_w = NULL; for(s = 0; s < ns; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); for(w = 0; w < nw; w++) { w_in_s[s][w] = 0.0; int worker = workers == NULL ? w : workers[w]; enum starpu_worker_archtype arch = starpu_worker_get_type(worker); speed[s][w] = sc_hypervisor_get_speed(sc_w, arch); } } struct timeval start_time; struct timeval end_time; gettimeofday(&start_time, NULL); double res = _glp_resolve(ns, nw, speed, w_in_s, 1); gettimeofday(&end_time, NULL); long diff_s = end_time.tv_sec - start_time.tv_sec; long diff_us = end_time.tv_usec - start_time.tv_usec; __attribute__((unused)) float timing = (float)(diff_s*1000000 + diff_us)/1000; if(res > 0.0) return 1; return 0; } /* * GNU Linear Programming Kit backend */ #ifdef STARPU_HAVE_GLPK_H #include static double _glp_resolve(int ns, int nw, double speed[ns][nw], double w_in_s[ns][nw], unsigned integer) { int w = 0, s = 0; glp_prob *lp; lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MAX); glp_set_obj_name(lp, "total speed"); { int ne = 2 * ns * nw /* worker execution time */ + 1 + 1 ; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; /* Variables: x[s][w] the acknwoledgment that the worker w belongs to the context s */ glp_add_cols(lp, nw*ns + 1); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { char name[32]; snprintf(name, sizeof(name), "w%ds%dn", w, s); glp_set_col_name(lp, s*nw+w+1, name); if (integer) { glp_set_col_kind(lp, s*nw+w+1, GLP_IV); glp_set_col_bnds(lp, s*nw+w+1, GLP_DB, 0, 1); } else glp_set_col_bnds(lp, s*nw+w+1, GLP_DB, 0.0, 1.0); } /* vmax should be positif */ /* Z = vmax structural variable, x[s][w] are auxiliar variables */ glp_set_col_name(lp, nw*ns+1, "vmax"); glp_set_col_bnds(lp, nw*ns+1, GLP_LO, 0.0, 0.0); glp_set_obj_coef(lp, nw*ns+1, 1.); int curr_row_idx = 0; /* Total worker speed */ glp_add_rows(lp, 1); /*sum(x[s][w]*speed[s][w]) >= vmax */ char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "worker %s", name); glp_set_row_name(lp, curr_row_idx + 1, title); for(s = 0; s < ns; s++) { for (w = 0; w < nw; w++) { /* x[s][w] */ ia[n] = curr_row_idx + 1; ja[n] = s*nw+w+1; ar[n] = speed[s][w]; n++; } } /* vmax */ ia[n] = curr_row_idx + 1; ja[n] = nw*ns+1; ar[n] = (-1); n++; glp_set_row_bnds(lp, curr_row_idx + 1, GLP_LO, 0.0, 0.0); curr_row_idx += 1 ; /* sum(x[s][w]) = 1 */ glp_add_rows(lp, nw); for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "w%x", w); glp_set_row_name(lp, curr_row_idx+w+1, title); for(s = 0; s < ns; s++) { ia[n] = curr_row_idx+w+1; ja[n] = s*nw+w+1; ar[n] = 1; n++; } if(integer) glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1, 1); else glp_set_row_bnds(lp, curr_row_idx+w+1, GLP_FX, 1.0, 1.0); } if(n != ne) printf("ns= %d nw = %d n = %d ne = %d\n", ns, nw, n, ne); STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); } glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; int ret = glp_simplex(lp, &parm); if (ret) { glp_delete_prob(lp); lp = NULL; return 0.0; } if (integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; glp_intopt(lp, &iocp); int stat = glp_mip_status(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); lp = NULL; return 0.0; } } int stat = glp_get_prim_stat(lp); /* if we don't have a solution return */ if(stat == GLP_NOFEAS) { glp_delete_prob(lp); lp = NULL; printf("No sol!!!\n"); return 0.0; } double res = glp_get_obj_val(lp); for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) { if (integer) w_in_s[s][w] = (double)glp_mip_col_val(lp, s*nw+w+1); else w_in_s[s][w] = glp_get_col_prim(lp, s*nw+w+1); } glp_delete_prob(lp); return res; } static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; int nw = workers == NULL ? (int)starpu_worker_get_count() : nworkers; /* Number of different workers */ sched_ctxs = sched_ctxs == NULL ? sc_hypervisor_get_sched_ctxs() : sched_ctxs; double w_in_s[ns][nw]; unsigned found_sol = _compute_max_speed(ns, nw, w_in_s, sched_ctxs, workers); /* if we did find at least one solution redistribute the resources */ if(found_sol) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nw); int w, s; double nworkers_per_ctx[ns][tw->nw]; int nworkers_per_ctx_rounded[ns][tw->nw]; for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { nworkers_per_ctx[s][w] = 0.0; nworkers_per_ctx_rounded[s][w] = 0; } } for(s = 0; s < ns; s++) { for(w = 0; w < nw; w++) { enum starpu_worker_archtype arch = starpu_worker_get_type(w); int idx = sc_hypervisor_get_index_for_arch(STARPU_CUDA_WORKER, tw); nworkers_per_ctx[s][idx] += w_in_s[s][w]; if(arch == STARPU_CUDA_WORKER) { if(w_in_s[s][w] >= 0.3) nworkers_per_ctx_rounded[s][idx]++; } else { int idx = sc_hypervisor_get_index_for_arch(STARPU_CPU_WORKER, tw); nworkers_per_ctx[s][idx] += w_in_s[s][w]; if(w_in_s[s][w] > 0.5) nworkers_per_ctx_rounded[s][idx]++; } } } /* for(s = 0; s < ns; s++) */ /* printf("%d: cpus = %lf gpus = %lf cpus_round = %d gpus_round = %d\n", s, nworkers[s][1], nworkers[s][0], */ /* nworkers_rounded[s][1], nworkers_rounded[s][0]); */ sc_hypervisor_lp_redistribute_resources_in_ctxs(ns, tw->nw, nworkers_per_ctx_rounded, nworkers_per_ctx, sched_ctxs, tw); } } 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()) { _try_resizing(NULL, -1, NULL, -1); } } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void throughput_lp_handle_idle_cycle(unsigned sched_ctx, int worker) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_IDLE) { if(sc_hypervisor_check_idle(sched_ctx, worker)) { _try_resizing(NULL, -1, NULL, -1); // sc_hypervisor_move_workers(sched_ctx, 3 - sched_ctx, &worker, 1, 1); } } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void throughput_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void throughput_lp_end_ctx(__attribute__((unused))unsigned sched_ctx) { /* struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); */ /* int worker; */ /* for(worker = 0; worker < 12; worker++) */ /* printf("%d/%d: speed %lf\n", worker, sched_ctx, sc_w->ref_speed[worker]); */ return; } struct sc_hypervisor_policy throughput_lp_policy = { .size_ctxs = NULL, .resize_ctxs = throughput_lp_resize_ctxs, .handle_poped_task = throughput_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = throughput_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = throughput_lp_end_ctx, .custom = 0, .name = "throughput_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/feft_lp_policy.c0000644000373600000000000001547712571536600022722 00000000000000 /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include int resize_no = 0; #ifdef STARPU_HAVE_GLPK_H static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { /* for vite */ printf("resize_no = %d\n", resize_no); starpu_trace_user_event(resize_no++); int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; 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); 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(vmax != 0.0) { int nworkers_per_ctx_rounded[nsched_ctxs][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_share_remaining_resources(ns, curr_sched_ctxs, curr_nworkers, workers); } } static void feft_lp_handle_poped_task(__attribute__((unused))unsigned sched_ctx, __attribute__((unused))int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))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_check_speed_gap_btw_ctxs()) { _try_resizing(NULL, -1, NULL, -1); } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } } static void feft_lp_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; 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_type[ns][nw]; int total_nw[nw]; sc_hypervisor_group_workers_by_type(tw, total_nw); 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; } double vmax = sc_hypervisor_lp_get_nworkers_per_ctx(ns, nw, nworkers_per_type, total_nw, tw); if(vmax != 0.0) { // printf("********size\n"); /* int i; */ /* for( i = 0; i < nsched_ctxs; i++) */ /* { */ /* printf("ctx %d/worker type %d: n = %lf \n", i, 0, nworkers_per_type[i][0]); */ /* #ifdef STARPU_USE_CUDA */ /* int ncuda = starpu_worker_get_count_by_type(STARPU_CUDA_WORKER); */ /* if(ncuda != 0) */ /* printf("ctx %d/worker type %d: n = %lf \n", i, 1, nworkers_per_type[i][1]); */ /* #endif */ /* } */ int nworkers_per_type_rounded[ns][nw]; sc_hypervisor_lp_round_double_to_int(ns, nw, nworkers_per_type, nworkers_per_type_rounded); /* for( i = 0; i < nsched_ctxs; i++) */ /* { */ /* printf("ctx %d/worker type %d: n = %d \n", i, 0, nworkers_per_type_rounded[i][0]); */ /* #ifdef STARPU_USE_CUDA */ /* int ncuda = starpu_worker_get_count_by_type(STARPU_CUDA_WORKER); */ /* if(ncuda != 0) */ /* printf("ctx %d/worker type %d: n = %d \n", i, 1, nworkers_per_type_rounded[i][1]); */ /* #endif */ /* } */ unsigned has_workers = 0; int s; for(s = 0; s < ns; s++) { int nworkers_ctx = sc_hypervisor_get_nworkers_ctx(curr_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, nw, nworkers_per_type_rounded, nworkers_per_type, curr_sched_ctxs, tw); else sc_hypervisor_lp_distribute_resources_in_ctxs(sched_ctxs, ns, nw, nworkers_per_type_rounded, nworkers_per_type, workers, curr_nworkers, tw); } printf("finished size ctxs\n"); starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } 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) { if(sc_hypervisor_check_idle(sched_ctx, worker)) _try_resizing(NULL, -1, NULL, -1); 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; } } _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } struct sc_hypervisor_policy feft_lp_policy = { .size_ctxs = feft_lp_size_ctxs, .resize_ctxs = feft_lp_resize_ctxs, .handle_poped_task = feft_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = feft_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "feft_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/teft_lp_policy.c0000644000373600000000000002430012571536600022721 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include static struct sc_hypervisor_policy_task_pool *task_pools = NULL; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; struct teft_lp_data { int nt; double **tasks; unsigned *in_sched_ctxs; int *workers; struct sc_hypervisor_policy_task_pool *tmp_task_pools; unsigned size_ctxs; }; static double _compute_workers_distrib(int ns, int nw, double final_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specific_data) { struct teft_lp_data *sd = (struct teft_lp_data *)specific_data; int nt = sd->nt; double **final_tasks = sd->tasks; unsigned *in_sched_ctxs = sd->in_sched_ctxs; int *workers = sd->workers; struct sc_hypervisor_policy_task_pool *tmp_task_pools = sd->tmp_task_pools; unsigned size_ctxs = sd->size_ctxs; if(tmp_task_pools == NULL) return 0.0; double w_in_s[ns][nw]; double tasks[nw][nt]; double times[nw][nt]; /* times in ms */ sc_hypervisor_get_tasks_times(nw, nt, times, workers, size_ctxs, task_pools); double res = 0.0; #ifdef STARPU_HAVE_GLPK_H res = sc_hypervisor_lp_simulate_distrib_tasks(ns, nw, nt, w_in_s, tasks, times, is_integer, tmax, in_sched_ctxs, tmp_task_pools); #endif //STARPU_HAVE_GLPK_H if(res != 0.0) { int s, w, t; for(s = 0; s < ns; s++) for(w = 0; w < nw; w++) final_w_in_s[s][w] = w_in_s[s][w]; for(w = 0; w < nw; w++) for(t = 0; t < nt; t++) final_tasks[w][t] = tasks[w][t]; } return res; } static void _size_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ns = sched_ctxs == NULL ? sc_hypervisor_get_nsched_ctxs() : nsched_ctxs; int nw = workers == NULL ? (int)starpu_worker_get_count() : nworkers; /* Number of different workers */ int nt = 0; /* Number of different kinds of tasks */ starpu_pthread_mutex_lock(&mutex); 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 = smallest_tmax; unsigned found_sol = sc_hypervisor_lp_execute_dichotomy(ns, nw, w_in_s, 1, (void*)&specific_data, tmin, tmax, smallest_tmax, _compute_workers_distrib); 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, 1, tw); } for(i = 0; i < nw; i++) free(tasks[i]); free(tasks); } static void size_if_required() { int nsched_ctxs, nworkers; unsigned *sched_ctxs; int *workers; unsigned has_req = sc_hypervisor_get_size_req(&sched_ctxs, &nsched_ctxs, &workers, &nworkers); if(has_req) { struct sc_hypervisor_wrapper* sc_w = NULL; unsigned ready_to_size = 1; int s; starpu_pthread_mutex_lock(&act_hypervisor_mutex); for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); // if(sc_w->submitted_flops < sc_w->total_flops) if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) ready_to_size = 0; } if(ready_to_size) { _size_ctxs(sched_ctxs, nsched_ctxs, workers, nworkers); sc_hypervisor_free_size_req(); } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void teft_lp_handle_submitted_job(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size) { /* count the tasks of the same type */ starpu_pthread_mutex_lock(&mutex); sc_hypervisor_policy_add_task_to_pool(cl, sched_ctx, footprint, &task_pools, data_size); starpu_pthread_mutex_unlock(&mutex); size_if_required(); } static void _try_resizing(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { starpu_trace_user_event(2); 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; 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 = 0.0; double tmax = possible_tmax * ns; double tmin = smallest_tmax; unsigned found_sol = sc_hypervisor_lp_execute_dichotomy(ns, nw, w_in_s, 1, (void*)&specific_data, tmin, tmax, smallest_tmax, _compute_workers_distrib); // starpu_pthread_mutex_unlock(&mutex); /* if we did find at least one solution redistribute the resources */ if(found_sol) { struct types_of_workers *tw = sc_hypervisor_get_types_of_workers(workers, nw); sc_hypervisor_lp_place_resources_in_ctx(ns, nw, w_in_s, sched_ctxs, workers, 0, tw); } struct sc_hypervisor_policy_task_pool *next = NULL; struct sc_hypervisor_policy_task_pool *tmp_tp = tmp_task_pools; while(tmp_task_pools) { next = tmp_tp->next; free(tmp_tp); tmp_tp = next; tmp_task_pools = next; } for(i = 0; i < nw; i++) free(tasks_per_worker[i]); free(tasks_per_worker); } static void teft_lp_handle_poped_task(unsigned sched_ctx, __attribute__((unused))int worker, struct starpu_task *task, uint32_t footprint) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) { starpu_pthread_mutex_unlock(&act_hypervisor_mutex); return; } unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_SPEED) { if(sc_hypervisor_check_speed_gap_btw_ctxs()) { _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) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) { starpu_pthread_mutex_unlock(&act_hypervisor_mutex); return; } 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); } return; } static void teft_lp_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { sc_hypervisor_save_size_req(sched_ctxs, nsched_ctxs, workers, nworkers); } static void teft_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { struct sc_hypervisor_wrapper* sc_w = NULL; int s = 0; for(s = 0; s < nsched_ctxs; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); if((sc_w->submitted_flops + (0.1*sc_w->total_flops)) < sc_w->total_flops) { starpu_pthread_mutex_unlock(&act_hypervisor_mutex); return; } } _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } struct sc_hypervisor_policy teft_lp_policy = { .size_ctxs = teft_lp_size_ctxs, .resize_ctxs = teft_lp_resize_ctxs, .handle_poped_task = teft_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = teft_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = teft_lp_handle_submitted_job, .end_ctx = NULL, .custom = 0, .name = "teft_lp" }; starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/ispeed_policy.c0000644000373600000000000001431212571536600022537 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sc_hypervisor_policy.h" static unsigned _get_fastest_sched_ctx(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); int fastest_sched_ctx = STARPU_NMAX_SCHED_CTXS; double curr_speed = 0.0; double biggest_speed = 0.0; int i; for(i = 0; i < nsched_ctxs; i++) { curr_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(sched_ctxs[i])); if( curr_speed > biggest_speed) { fastest_sched_ctx = sched_ctxs[i]; biggest_speed = curr_speed; } } return fastest_sched_ctx; } static unsigned _get_slowest_sched_ctx(void) { unsigned *sched_ctxs = sc_hypervisor_get_sched_ctxs(); int nsched_ctxs = sc_hypervisor_get_nsched_ctxs(); double smallest_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(sched_ctxs[0])); unsigned slowest_sched_ctx = smallest_speed == -1.0 ? STARPU_NMAX_SCHED_CTXS : sched_ctxs[0]; double curr_speed = 0.0; int i; for(i = 1; i < nsched_ctxs; i++) { curr_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(sched_ctxs[i])); if((curr_speed < smallest_speed || smallest_speed == 0.0) && curr_speed != -1.0) { smallest_speed = curr_speed; slowest_sched_ctx = sched_ctxs[i]; } } return slowest_sched_ctx; } /* get first nworkers with the highest idle time in the context */ static int* _get_slowest_workers(unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch) { struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); struct sc_hypervisor_policy_config *config = sc_hypervisor_get_config(sched_ctx); int *curr_workers = (int*)malloc((*nworkers) * sizeof(int)); int i; for(i = 0; i < *nworkers; i++) curr_workers[i] = -1; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx); int index; int worker; int considered = 0; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); for(index = 0; index < *nworkers; index++) { while(workers->has_next(workers, &it)) { considered = 0; worker = workers->get_next(workers, &it); enum starpu_worker_archtype curr_arch = starpu_worker_get_type(worker); if(arch == STARPU_ANY_WORKER || curr_arch == arch) { if(!config->fixed_workers[worker]) { for(i = 0; i < index; i++) { if(curr_workers[i] == worker) { considered = 1; break; } } if(!considered) { double worker_speed = sc_hypervisor_get_speed_per_worker(sc_w, worker); if(worker_speed != -1.0) { /* the first iteration*/ if(curr_workers[index] < 0) curr_workers[index] = worker; /* small priority worker is the first to leave the ctx*/ else if(config->priority[worker] < config->priority[curr_workers[index]]) curr_workers[index] = worker; /* if we don't consider priorities check for the workers with the biggest idle time */ else if(config->priority[worker] == config->priority[curr_workers[index]]) { double curr_worker_speed = sc_hypervisor_get_speed_per_worker(sc_w, curr_workers[index]); // printf("speed[%d] = %lf speed[%d] = %lf\n", worker, worker_speed, curr_workers[index], curr_worker_speed); if(worker_speed < curr_worker_speed && curr_worker_speed != -1.0) { curr_workers[index] = worker; } } } } } } } if(curr_workers[index] < 0) { *nworkers = index; break; } } return curr_workers; } static void ispeed_handle_poped_task(unsigned sched_ctx, int worker, __attribute__((unused))struct starpu_task *task, __attribute__((unused))uint32_t footprint) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { if(sc_hypervisor_criteria_fulfilled(sched_ctx, worker)) { unsigned fastest_sched_ctx = _get_fastest_sched_ctx(); unsigned slowest_sched_ctx = _get_slowest_sched_ctx(); if(fastest_sched_ctx != STARPU_NMAX_SCHED_CTXS && slowest_sched_ctx != STARPU_NMAX_SCHED_CTXS && fastest_sched_ctx != slowest_sched_ctx) { int nworkers_to_move = sc_hypervisor_compute_nworkers_to_move(fastest_sched_ctx); if(nworkers_to_move > 0) { int *workers_to_move = _get_slowest_workers(fastest_sched_ctx, &nworkers_to_move, STARPU_ANY_WORKER); if(nworkers_to_move > 0) { double new_speed = 0.0; int i; for(i = 0; i < nworkers_to_move; i++) new_speed += sc_hypervisor_get_speed_per_worker(sc_hypervisor_get_wrapper(fastest_sched_ctx), workers_to_move[i]); double fastest_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(fastest_sched_ctx)); double slowest_speed = sc_hypervisor_get_ctx_speed(sc_hypervisor_get_wrapper(slowest_sched_ctx)); // printf("fast_speed(%d) %lf slow_speed(%d) %lf new speed(%d) %lf \n", fastest_sched_ctx, fastest_speed, slowest_sched_ctx, // slowest_speed, workers_to_move[0], new_speed); if(fastest_speed != -1.0 && slowest_speed != -1.0 && (slowest_speed + new_speed) <= (fastest_speed - new_speed)) { sc_hypervisor_move_workers(fastest_sched_ctx, slowest_sched_ctx, workers_to_move, nworkers_to_move, 0); } } free(workers_to_move); } } } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } struct sc_hypervisor_policy ispeed_policy = { .size_ctxs = NULL, .handle_poped_task = ispeed_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "ispeed" }; starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/app_driven_policy.c0000644000373600000000000000223012571536600023411 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static void app_driven_handle_post_exec_hook(unsigned sched_ctx, __attribute__((unused)) int task_tag) { sc_hypervisor_policy_resize_to_unknown_receiver(sched_ctx, 1); } struct sc_hypervisor_policy app_driven_policy = { .size_ctxs = NULL, .handle_poped_task = NULL, .handle_pushed_task = NULL, .handle_idle_cycle = NULL, .handle_idle_end = NULL, .handle_post_exec_hook = app_driven_handle_post_exec_hook, .handle_submitted_job = NULL, .end_ctx = NULL, .custom = 0, .name = "app_driven" }; starpu-1.1.5/sc_hypervisor/src/hypervisor_policies/ispeed_lp_policy.c0000644000373600000000000001771512571536600023244 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sc_hypervisor_lp.h" #include "sc_hypervisor_policy.h" #include #include struct ispeed_lp_data { double **speed; double *flops; double **flops_on_w; int *workers; }; #ifdef STARPU_HAVE_GLPK_H static double _compute_workers_distrib(int ns, int nw, double final_w_in_s[ns][nw], unsigned is_integer, double tmax, void *specific_data) { struct ispeed_lp_data *sd = (struct ispeed_lp_data *)specific_data; double **speed = sd->speed; double *flops = sd->flops; double **final_flops_on_w = sd->flops_on_w; return sc_hypervisor_lp_simulate_distrib_flops_on_sample(ns, nw, final_w_in_s, is_integer, tmax, speed, flops, final_flops_on_w); } static unsigned _compute_flops_distribution_over_ctxs(int ns, int nw, double w_in_s[ns][nw], double **flops_on_w, unsigned *sched_ctxs, int *workers) { double *flops = (double*)malloc(ns*sizeof(double)); double **speed = (double **)malloc(ns*sizeof(double*)); int i; for(i = 0; i < ns; i++) speed[i] = (double*)malloc(nw*sizeof(double)); int w,s; struct sc_hypervisor_wrapper* sc_w = NULL; for(s = 0; s < ns; s++) { sc_w = sc_hypervisor_get_wrapper(sched_ctxs[s]); for(w = 0; w < nw; w++) { w_in_s[s][w] = 0.0; int worker = workers == NULL ? w : workers[w]; speed[s][w] = sc_hypervisor_get_speed_per_worker(sc_w, worker); if(speed[s][w] == -1.0) { enum starpu_worker_archtype arch = starpu_worker_get_type(worker); speed[s][w] = sc_hypervisor_get_speed(sc_w, arch); if(arch == STARPU_CUDA_WORKER) { unsigned worker_in_ctx = starpu_sched_ctx_contains_worker(worker, sc_w->sched_ctx); if(!worker_in_ctx) { double transfer_speed = starpu_transfer_bandwidth(0, 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) { starpu_trace_user_event(2); 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[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)); unsigned found_sol = _compute_flops_distribution_over_ctxs(ns, nw, w_in_s, flops_on_w, curr_sched_ctxs, workers); /* 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); } 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()) { _try_resizing(NULL, -1, NULL, -1); } } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void ispeed_lp_handle_idle_cycle(unsigned sched_ctx, int worker) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { unsigned criteria = sc_hypervisor_get_resize_criteria(); if(criteria != SC_NOTHING && criteria == SC_IDLE) { if(sc_hypervisor_check_idle(sched_ctx, worker)) { _try_resizing(NULL, -1, NULL, -1); } } starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void ispeed_lp_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers) { int ret = starpu_pthread_mutex_trylock(&act_hypervisor_mutex); if(ret != EBUSY) { _try_resizing(sched_ctxs, nsched_ctxs, workers, nworkers); starpu_pthread_mutex_unlock(&act_hypervisor_mutex); } } static void ispeed_lp_end_ctx(__attribute__((unused))unsigned sched_ctx) { /* struct sc_hypervisor_wrapper* sc_w = sc_hypervisor_get_wrapper(sched_ctx); */ /* int worker; */ /* for(worker = 0; worker < 12; worker++) */ /* printf("%d/%d: speed %lf\n", worker, sched_ctx, sc_w->ref_speed[worker]); */ return; } struct sc_hypervisor_policy ispeed_lp_policy = { .size_ctxs = NULL, .resize_ctxs = ispeed_lp_resize_ctxs, .handle_poped_task = ispeed_lp_handle_poped_task, .handle_pushed_task = NULL, .handle_idle_cycle = ispeed_lp_handle_idle_cycle, .handle_idle_end = NULL, .handle_post_exec_hook = NULL, .handle_submitted_job = NULL, .end_ctx = ispeed_lp_end_ctx, .custom = 0, .name = "ispeed_lp" }; #endif /* STARPU_HAVE_GLPK_H */ starpu-1.1.5/sc_hypervisor/examples/0002755000373600000000000000000012571541166014555 500000000000000starpu-1.1.5/sc_hypervisor/examples/lp_test/0002755000373600000000000000000012571541166016227 500000000000000starpu-1.1.5/sc_hypervisor/examples/lp_test/lp_test.c0000644000373600000000000001071112571536600017760 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) unsigned val[2]; pthread_mutex_t mut[2]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { unsigned sched_ctx = *((unsigned *) cl_arg); int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; pthread_mutex_unlock(&mut[sched_ctx - 1]); } } struct starpu_codelet cl = {0}; void* submit_tasks_thread(void *arg) { unsigned sched_ctx = *((unsigned*)arg); starpu_sched_ctx_set_context(&sched_ctx); struct starpu_task *task[NTASKS]; int i; for(i = 0; i < NTASKS; i++) { task[i] = starpu_task_create(); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; task[i]->cl = &cl; task[i]->cl_arg = &sched_ctx; task[i]->cl_arg_size = sizeof(unsigned); task[i]->flops = NINCR*1000000000.0; int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(NULL, 0, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(NULL, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "feft_lp"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); double flops1 = NTASKS*NINCR*1000000000.0; double flops2 = NTASKS*NINCR*1000000000.0; /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, flops1); sc_hypervisor_register_ctx(sched_ctx2, flops2); /* lp strategy allows sizing the contexts because we know the total number of flops to be executed */ sc_hypervisor_size_ctxs(NULL, -1, NULL, -1); starpu_pthread_t tid[2]; val[0] = 0; val[1] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %d executed %d counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %d executed %d counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); return 0; } starpu-1.1.5/sc_hypervisor/examples/lp_test/lp_resize_test.c0000644000373600000000000001101612571536600021340 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) unsigned val[2]; pthread_mutex_t mut[2]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { unsigned sched_ctx = *((unsigned *) cl_arg); int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[sched_ctx - 1]); val[sched_ctx - 1]++; pthread_mutex_unlock(&mut[sched_ctx - 1]); } } struct starpu_codelet cl = {0}; void* submit_tasks_thread(void *arg) { unsigned sched_ctx = *((unsigned*)arg); starpu_sched_ctx_set_context(&sched_ctx); struct starpu_task *task[NTASKS]; int i; for(i = 0; i < NTASKS; i++) { task[i] = starpu_task_create(); cl.cpu_funcs[0] = cpu_func; cl.nbuffers = 0; task[i]->cl = &cl; task[i]->cl_arg = &sched_ctx; task[i]->cl_arg_size = sizeof(unsigned); task[i]->flops = NINCR*1000000000.0; int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); if(i == NTASKS/2) sc_hypervisor_resize_ctxs(NULL, -1, NULL, -1); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(NULL, 0, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(NULL, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "feft_lp"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); double flops1 = NTASKS*NINCR*1000000000.0; double flops2 = NTASKS*NINCR*1000000000.0; /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, flops1); sc_hypervisor_register_ctx(sched_ctx2, flops2); /* lp strategy allows sizing the contexts because we know the total number of flops to be executed */ sc_hypervisor_size_ctxs(NULL, -1, NULL, -1); starpu_pthread_t tid[2]; val[0] = 0; val[1] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %d executed %d counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %d executed %d counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); return 0; } starpu-1.1.5/sc_hypervisor/examples/Makefile.in0000644000373600000000000012616712571536633016560 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 Institut National de Recherche en Informatique et Automatique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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) \ $(am__EXEEXT_1) @NO_BLAS_LIB_FALSE@am__append_1 = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit subdir = sc_hypervisor/examples DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/build-aux/depcomp $(am__noinst_HEADERS_DIST) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @NO_BLAS_LIB_FALSE@am__EXEEXT_1 = cholesky/cholesky_implicit$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_app_driven_test_app_driven_test_OBJECTS = \ app_driven_test.$(OBJEXT) app_driven_test_app_driven_test_OBJECTS = \ $(am_app_driven_test_app_driven_test_OBJECTS) app_driven_test_app_driven_test_DEPENDENCIES = \ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp am__cholesky_cholesky_implicit_SOURCES_DIST = \ cholesky/cholesky_implicit.c cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c sched_ctx_utils/sched_ctx_utils.c \ $(top_srcdir)/examples/common/blas.c @NO_BLAS_LIB_FALSE@am_cholesky_cholesky_implicit_OBJECTS = \ @NO_BLAS_LIB_FALSE@ cholesky_implicit.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_models.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ cholesky_kernels.$(OBJEXT) \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils.$(OBJEXT) blas.$(OBJEXT) cholesky_cholesky_implicit_OBJECTS = \ $(am_cholesky_cholesky_implicit_OBJECTS) am__DEPENDENCIES_1 = @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_DEPENDENCIES = $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ @NO_BLAS_LIB_FALSE@ $(am__DEPENDENCIES_1) lp_test_lp_resize_test_SOURCES = lp_test/lp_resize_test.c lp_test_lp_resize_test_OBJECTS = lp_resize_test.$(OBJEXT) lp_test_lp_resize_test_LDADD = $(LDADD) lp_test_lp_test_SOURCES = lp_test/lp_test.c lp_test_lp_test_OBJECTS = lp_test.$(OBJEXT) lp_test_lp_test_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(app_driven_test_app_driven_test_SOURCES) \ $(cholesky_cholesky_implicit_SOURCES) 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) \ 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 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ @LIBS@ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/examples -I$(top_builddir)/include -I$(top_srcdir)/sc_hypervisor/include -I$(top_srcdir)/sc_hypervisor/examples AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(STARPU_GLPK_LDFLAGS) @NO_BLAS_LIB_FALSE@noinst_HEADERS = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky.h \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.h @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_SOURCES = \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_implicit.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_models.c \ @NO_BLAS_LIB_FALSE@ cholesky/cholesky_kernels.c \ @NO_BLAS_LIB_FALSE@ sched_ctx_utils/sched_ctx_utils.c \ @NO_BLAS_LIB_FALSE@ $(top_srcdir)/examples/common/blas.c @NO_BLAS_LIB_FALSE@cholesky_cholesky_implicit_LDADD = \ @NO_BLAS_LIB_FALSE@ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la \ @NO_BLAS_LIB_FALSE@ $(STARPU_BLAS_LDFLAGS) app_driven_test_app_driven_test_SOURCES = \ app_driven_test/app_driven_test.c app_driven_test_app_driven_test_LDADD = \ $(top_builddir)/sc_hypervisor/src/libsc_hypervisor.la all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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) lp_test/$(am__dirstamp): @$(MKDIR_P) lp_test @: > lp_test/$(am__dirstamp) lp_test/lp_resize_test$(EXEEXT): $(lp_test_lp_resize_test_OBJECTS) $(lp_test_lp_resize_test_DEPENDENCIES) $(EXTRA_lp_test_lp_resize_test_DEPENDENCIES) lp_test/$(am__dirstamp) @rm -f lp_test/lp_resize_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lp_test_lp_resize_test_OBJECTS) $(lp_test_lp_resize_test_LDADD) $(LIBS) lp_test/lp_test$(EXEEXT): $(lp_test_lp_test_OBJECTS) $(lp_test_lp_test_DEPENDENCIES) $(EXTRA_lp_test_lp_test_DEPENDENCIES) lp_test/$(am__dirstamp) @rm -f lp_test/lp_test$(EXEEXT) $(AM_V_CCLD)$(LINK) $(lp_test_lp_test_OBJECTS) $(lp_test_lp_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/app_driven_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blas.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cholesky_models.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_resize_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lp_test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched_ctx_utils.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< app_driven_test.o: app_driven_test/app_driven_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT app_driven_test.o -MD -MP -MF $(DEPDIR)/app_driven_test.Tpo -c -o app_driven_test.o `test -f 'app_driven_test/app_driven_test.c' || echo '$(srcdir)/'`app_driven_test/app_driven_test.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/app_driven_test.Tpo $(DEPDIR)/app_driven_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='app_driven_test/app_driven_test.c' object='app_driven_test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o app_driven_test.o `test -f 'app_driven_test/app_driven_test.c' || echo '$(srcdir)/'`app_driven_test/app_driven_test.c app_driven_test.obj: app_driven_test/app_driven_test.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT app_driven_test.obj -MD -MP -MF $(DEPDIR)/app_driven_test.Tpo -c -o app_driven_test.obj `if test -f 'app_driven_test/app_driven_test.c'; then $(CYGPATH_W) 'app_driven_test/app_driven_test.c'; else $(CYGPATH_W) '$(srcdir)/app_driven_test/app_driven_test.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/app_driven_test.Tpo $(DEPDIR)/app_driven_test.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='app_driven_test/app_driven_test.c' object='app_driven_test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o app_driven_test.obj `if test -f 'app_driven_test/app_driven_test.c'; then $(CYGPATH_W) 'app_driven_test/app_driven_test.c'; else $(CYGPATH_W) '$(srcdir)/app_driven_test/app_driven_test.c'; fi` cholesky_implicit.o: cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_implicit.o -MD -MP -MF $(DEPDIR)/cholesky_implicit.Tpo -c -o cholesky_implicit.o `test -f 'cholesky/cholesky_implicit.c' || echo '$(srcdir)/'`cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_implicit.Tpo $(DEPDIR)/cholesky_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_implicit.c' object='cholesky_implicit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_implicit.o `test -f 'cholesky/cholesky_implicit.c' || echo '$(srcdir)/'`cholesky/cholesky_implicit.c cholesky_implicit.obj: cholesky/cholesky_implicit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_implicit.obj -MD -MP -MF $(DEPDIR)/cholesky_implicit.Tpo -c -o cholesky_implicit.obj `if test -f 'cholesky/cholesky_implicit.c'; then $(CYGPATH_W) 'cholesky/cholesky_implicit.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_implicit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_implicit.Tpo $(DEPDIR)/cholesky_implicit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_implicit.c' object='cholesky_implicit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_implicit.obj `if test -f 'cholesky/cholesky_implicit.c'; then $(CYGPATH_W) 'cholesky/cholesky_implicit.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_implicit.c'; fi` cholesky_models.o: cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_models.o -MD -MP -MF $(DEPDIR)/cholesky_models.Tpo -c -o cholesky_models.o `test -f 'cholesky/cholesky_models.c' || echo '$(srcdir)/'`cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_models.Tpo $(DEPDIR)/cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_models.c' object='cholesky_models.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_models.o `test -f 'cholesky/cholesky_models.c' || echo '$(srcdir)/'`cholesky/cholesky_models.c cholesky_models.obj: cholesky/cholesky_models.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_models.obj -MD -MP -MF $(DEPDIR)/cholesky_models.Tpo -c -o cholesky_models.obj `if test -f 'cholesky/cholesky_models.c'; then $(CYGPATH_W) 'cholesky/cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_models.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_models.Tpo $(DEPDIR)/cholesky_models.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_models.c' object='cholesky_models.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_models.obj `if test -f 'cholesky/cholesky_models.c'; then $(CYGPATH_W) 'cholesky/cholesky_models.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_models.c'; fi` cholesky_kernels.o: cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_kernels.o -MD -MP -MF $(DEPDIR)/cholesky_kernels.Tpo -c -o cholesky_kernels.o `test -f 'cholesky/cholesky_kernels.c' || echo '$(srcdir)/'`cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_kernels.Tpo $(DEPDIR)/cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_kernels.c' object='cholesky_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_kernels.o `test -f 'cholesky/cholesky_kernels.c' || echo '$(srcdir)/'`cholesky/cholesky_kernels.c cholesky_kernels.obj: cholesky/cholesky_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cholesky_kernels.obj -MD -MP -MF $(DEPDIR)/cholesky_kernels.Tpo -c -o cholesky_kernels.obj `if test -f 'cholesky/cholesky_kernels.c'; then $(CYGPATH_W) 'cholesky/cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cholesky_kernels.Tpo $(DEPDIR)/cholesky_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cholesky/cholesky_kernels.c' object='cholesky_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cholesky_kernels.obj `if test -f 'cholesky/cholesky_kernels.c'; then $(CYGPATH_W) 'cholesky/cholesky_kernels.c'; else $(CYGPATH_W) '$(srcdir)/cholesky/cholesky_kernels.c'; fi` sched_ctx_utils.o: sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_utils.o -MD -MP -MF $(DEPDIR)/sched_ctx_utils.Tpo -c -o sched_ctx_utils.o `test -f 'sched_ctx_utils/sched_ctx_utils.c' || echo '$(srcdir)/'`sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_utils.Tpo $(DEPDIR)/sched_ctx_utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx_utils/sched_ctx_utils.c' object='sched_ctx_utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_utils.o `test -f 'sched_ctx_utils/sched_ctx_utils.c' || echo '$(srcdir)/'`sched_ctx_utils/sched_ctx_utils.c sched_ctx_utils.obj: sched_ctx_utils/sched_ctx_utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sched_ctx_utils.obj -MD -MP -MF $(DEPDIR)/sched_ctx_utils.Tpo -c -o sched_ctx_utils.obj `if test -f 'sched_ctx_utils/sched_ctx_utils.c'; then $(CYGPATH_W) 'sched_ctx_utils/sched_ctx_utils.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx_utils/sched_ctx_utils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sched_ctx_utils.Tpo $(DEPDIR)/sched_ctx_utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_ctx_utils/sched_ctx_utils.c' object='sched_ctx_utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sched_ctx_utils.obj `if test -f 'sched_ctx_utils/sched_ctx_utils.c'; then $(CYGPATH_W) 'sched_ctx_utils/sched_ctx_utils.c'; else $(CYGPATH_W) '$(srcdir)/sched_ctx_utils/sched_ctx_utils.c'; fi` blas.o: $(top_srcdir)/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 '$(top_srcdir)/examples/common/blas.c' || echo '$(srcdir)/'`$(top_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='$(top_srcdir)/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 '$(top_srcdir)/examples/common/blas.c' || echo '$(srcdir)/'`$(top_srcdir)/examples/common/blas.c blas.obj: $(top_srcdir)/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 '$(top_srcdir)/examples/common/blas.c'; then $(CYGPATH_W) '$(top_srcdir)/examples/common/blas.c'; else $(CYGPATH_W) '$(srcdir)/$(top_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='$(top_srcdir)/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 '$(top_srcdir)/examples/common/blas.c'; then $(CYGPATH_W) '$(top_srcdir)/examples/common/blas.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/examples/common/blas.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 lp_test/.libs lp_test/_libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f app_driven_test/$(am__dirstamp) -rm -f cholesky/$(am__dirstamp) -rm -f lp_test/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am 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 # 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.1.5/sc_hypervisor/examples/cholesky/0002755000373600000000000000000012571541166016376 500000000000000starpu-1.1.5/sc_hypervisor/examples/cholesky/cholesky_kernels.c0000644000373600000000000001416612571536600022031 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "cholesky.h" //#include "../common/blas.h" #ifdef STARPU_USE_CUDA #include #ifdef STARPU_HAVE_MAGMA #include "magma.h" #include "magma_lapack.h" #endif #endif /* * U22 */ static inline void chol_common_cpu_codelet_update_u22(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("22\n"); */ float *left = (float *)STARPU_MATRIX_GET_PTR(descr[0]); float *right = (float *)STARPU_MATRIX_GET_PTR(descr[1]); float *center = (float *)STARPU_MATRIX_GET_PTR(descr[2]); unsigned dx = STARPU_MATRIX_GET_NY(descr[2]); unsigned dy = STARPU_MATRIX_GET_NX(descr[2]); unsigned dz = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld12 = STARPU_MATRIX_GET_LD(descr[1]); unsigned ld22 = STARPU_MATRIX_GET_LD(descr[2]); if (s == 0) { int worker_size = starpu_combined_worker_get_size(); if (worker_size == 1) { /* Sequential CPU kernel */ STARPU_SGEMM("N", "T", dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); } else { /* Parallel CPU kernel */ int rank = starpu_combined_worker_get_rank(); int block_size = (dx + worker_size - 1)/worker_size; int new_dx = STARPU_MIN(dx, block_size*(rank+1)) - block_size*rank; float *new_left = &left[block_size*rank]; float *new_center = ¢er[block_size*rank]; STARPU_SGEMM("N", "T", dy, new_dx, dz, -1.0f, new_left, ld21, right, ld12, 1.0f, new_center, ld22); } } else { /* CUDA kernel */ #ifdef STARPU_USE_CUDA cublasSgemm('n', 't', dy, dx, dz, -1.0f, left, ld21, right, ld12, 1.0f, center, ld22); cudaStreamSynchronize(starpu_cuda_get_local_stream()); #endif } } void chol_cpu_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u22(void *descr[], void *_args) { chol_common_cpu_codelet_update_u22(descr, 1, _args); } #endif /* STARPU_USE_CUDA */ /* * U21 */ static inline void chol_common_codelet_update_u21(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("21\n"); */ float *sub11; float *sub21; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); sub21 = (float *)STARPU_MATRIX_GET_PTR(descr[1]); unsigned ld11 = STARPU_MATRIX_GET_LD(descr[0]); unsigned ld21 = STARPU_MATRIX_GET_LD(descr[1]); unsigned nx21 = STARPU_MATRIX_GET_NY(descr[1]); unsigned ny21 = STARPU_MATRIX_GET_NX(descr[1]); switch (s) { case 0: STARPU_STRSM("R", "L", "T", "N", nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); break; #ifdef STARPU_USE_CUDA case 1: cublasStrsm('R', 'L', 'T', 'N', nx21, ny21, 1.0f, sub11, ld11, sub21, ld21); cudaStreamSynchronize(starpu_cuda_get_local_stream()); break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u21(void *descr[], void *_args) { chol_common_codelet_update_u21(descr, 1, _args); } #endif /* * U11 */ static inline void chol_common_codelet_update_u11(void *descr[], int s, STARPU_ATTRIBUTE_UNUSED void *_args) { /* printf("11\n"); */ float *sub11; sub11 = (float *)STARPU_MATRIX_GET_PTR(descr[0]); unsigned nx = STARPU_MATRIX_GET_NY(descr[0]); unsigned ld = STARPU_MATRIX_GET_LD(descr[0]); unsigned z; switch (s) { case 0: /* * - alpha 11 <- lambda 11 = sqrt(alpha11) * - alpha 21 <- l 21 = alpha 21 / lambda 11 * - A22 <- A22 - l21 trans(l21) */ for (z = 0; z < nx; z++) { float lambda11; lambda11 = sqrt(sub11[z+z*ld]); sub11[z+z*ld] = lambda11; STARPU_ASSERT(lambda11 != 0.0f); STARPU_SSCAL(nx - z - 1, 1.0f/lambda11, &sub11[(z+1)+z*ld], 1); STARPU_SSYR("L", nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } break; #ifdef STARPU_USE_CUDA case 1: #ifdef STARPU_HAVE_MAGMA { int ret; int info; ret = magma_spotrf_gpu('L', nx, sub11, ld, &info); if (ret != MAGMA_SUCCESS) { fprintf(stderr, "Error in Magma: %d\n", ret); STARPU_ABORT(); } cudaError_t cures = cudaThreadSynchronize(); STARPU_ASSERT(!cures); } #else { float *lambda11; cudaHostAlloc((void **)&lambda11, sizeof(float), 0); for (z = 0; z < nx; z++) { cudaMemcpyAsync(lambda11, &sub11[z+z*ld], sizeof(float), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); STARPU_ASSERT(*lambda11 != 0.0f); *lambda11 = sqrt(*lambda11); /* cublasSetVector(1, sizeof(float), lambda11, sizeof(float), &sub11[z+z*ld], sizeof(float)); */ cudaMemcpyAsync(&sub11[z+z*ld], lambda11, sizeof(float), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cublasSscal(nx - z - 1, 1.0f/(*lambda11), &sub11[(z+1)+z*ld], 1); cublasSsyr('U', nx - z - 1, -1.0f, &sub11[(z+1)+z*ld], 1, &sub11[(z+1)+(z+1)*ld], ld); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); cudaFreeHost(lambda11); } #endif break; #endif default: STARPU_ABORT(); break; } } void chol_cpu_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 0, _args); } #ifdef STARPU_USE_CUDA void chol_cublas_codelet_update_u11(void *descr[], void *_args) { chol_common_codelet_update_u11(descr, 1, _args); } #endif/* STARPU_USE_CUDA */ starpu-1.1.5/sc_hypervisor/examples/cholesky/cholesky_models.c0000644000373600000000000001006612571536600021644 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * As a convention, in that file, buffers[0] is represented by A, * buffers[1] is B ... */ /* * Number of flops of Gemm */ #include #include "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 static double cpu_chol_task_11_cost(struct starpu_task *task, enum starpu_perfmodel_archtype 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); } static double cuda_chol_task_11_cost(struct starpu_task *task, enum starpu_perfmodel_archtype 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); } static double cpu_chol_task_21_cost(struct starpu_task *task, enum starpu_perfmodel_archtype 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); } static double cuda_chol_task_21_cost(struct starpu_task *task, enum starpu_perfmodel_archtype 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); } static double cpu_chol_task_22_cost(struct starpu_task *task, enum starpu_perfmodel_archtype 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); } static double cuda_chol_task_22_cost(struct starpu_task *task, enum starpu_perfmodel_archtype 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); } struct starpu_perfmodel chol_model_11 = { .per_arch = { [STARPU_CPU_DEFAULT][0] = { .cost_function = cpu_chol_task_11_cost }, [STARPU_CUDA_DEFAULT][0] = { .cost_function = cuda_chol_task_11_cost } }, .type = STARPU_HISTORY_BASED, .symbol = "chol_model_11" }; struct starpu_perfmodel chol_model_21 = { .per_arch = { [STARPU_CPU_DEFAULT][0] = { .cost_function = cpu_chol_task_21_cost }, [STARPU_CUDA_DEFAULT][0] = { .cost_function = cuda_chol_task_21_cost } }, .type = STARPU_HISTORY_BASED, .symbol = "chol_model_21" }; struct starpu_perfmodel chol_model_22 = { .per_arch = { [STARPU_CPU_DEFAULT][0] = { .cost_function = cpu_chol_task_22_cost }, [STARPU_CUDA_DEFAULT][0] = { .cost_function = cuda_chol_task_22_cost } }, .type = STARPU_HISTORY_BASED, .symbol = "chol_model_22" }; starpu-1.1.5/sc_hypervisor/examples/cholesky/cholesky_implicit.c0000644000373600000000000002117712571536600022200 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "cholesky.h" #include "../sched_ctx_utils/sched_ctx_utils.h" /* * Create the codelets */ static struct starpu_codelet cl11 = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u11}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u11}, #endif .nbuffers = 1, .modes = {STARPU_RW}, .model = &chol_model_11 }; static struct starpu_codelet cl21 = { .type = STARPU_SEQ, .cpu_funcs = {chol_cpu_codelet_update_u21}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u21}, #endif .nbuffers = 2, .modes = {STARPU_R, STARPU_RW}, .model = &chol_model_21 }; static struct starpu_codelet cl22 = { .type = STARPU_SEQ, .max_parallelism = INT_MAX, .cpu_funcs = {chol_cpu_codelet_update_u22}, #ifdef STARPU_USE_CUDA .cuda_funcs = {chol_cublas_codelet_update_u22}, #endif .nbuffers = 3, .modes = {STARPU_R, STARPU_R, STARPU_RW}, .model = &chol_model_22 }; /* * code to bootstrap the factorization * and construct the DAG */ static void callback_turn_spmd_on(void *arg STARPU_ATTRIBUTE_UNUSED) { cl22.type = STARPU_SPMD; } int hypervisor_tag = 1; static void _cholesky(starpu_data_handle_t dataA, unsigned nblocks) { int ret; struct timeval start; struct timeval end; unsigned i,j,k; int prio_level = noprio?STARPU_DEFAULT_PRIO:STARPU_MAX_PRIO; gettimeofday(&start, NULL); if (bound) starpu_bound_start(0, 0); /* create all the DAG nodes */ for (k = 0; k < nblocks; k++) { starpu_data_handle_t sdatakk = starpu_data_get_sub_data(dataA, 2, k, k); if(k == 0 && with_ctxs) { ret = starpu_insert_task(&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_insert_task"); } else starpu_insert_task(&cl11, STARPU_PRIORITY, prio_level, STARPU_RW, sdatakk, STARPU_CALLBACK, (k == 3*nblocks/4)?callback_turn_spmd_on:NULL, 0); for (j = k+1; j j) { mat[j+i*size] = 0.0f; /* debug */ } } } float *test_mat = malloc(size*size*sizeof(float)); STARPU_ASSERT(test_mat); STARPU_SSYRK("L", "N", size, size, 1.0f, mat, size, 0.0f, test_mat, size); FPRINTF(stderr, "comparing results ...\n"); #ifdef PRINT_OUTPUT for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { FPRINTF(stdout, "%2.2f\t", test_mat[j +i*size]); } else { FPRINTF(stdout, ".\t"); } } FPRINTF(stdout, "\n"); } #endif for (j = 0; j < size; j++) { for (i = 0; i < size; i++) { if (i <= j) { float orig = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f); float err = abs(test_mat[j +i*size] - orig); if (err > 0.00001) { FPRINTF(stderr, "Error[%u, %u] --> %2.2f != %2.2f (err %2.2f)\n", i, j, test_mat[j +i*size], orig, err); assert(0); } } } } free(test_mat); } starpu_free(mat); } int main(int argc, char **argv) { /* create a simple definite positive symetric matrix example * * Hilbert matrix : h(i,j) = 1/(i+j+1) * */ parse_args(argc, argv); if(with_ctxs || with_noctxs || chole1 || chole2) parse_args_ctx(argc, argv); starpu_init(NULL); starpu_cublas_init(); if(with_ctxs) { construct_contexts(execute_cholesky); start_2benchs(execute_cholesky); } else if(with_noctxs) start_2benchs(execute_cholesky); else if(chole1) start_1stbench(execute_cholesky); else if(chole2) start_2ndbench(execute_cholesky); else execute_cholesky(size, nblocks); starpu_cublas_shutdown(); starpu_shutdown(); if(with_ctxs) end_contexts(); return 0; } starpu-1.1.5/sc_hypervisor/examples/cholesky/cholesky.h0000644000373600000000000001024212571536600020302 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifiqu * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_CHOLESKY_H__ #define __DW_CHOLESKY_H__ #include #include #include #include #ifdef STARPU_USE_CUDA #include #include #include #endif #include #include #include #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) #define NMAXBLOCKS 32 #define TAG11(k) ((starpu_tag_t)( (1ULL<<60) | (unsigned long long)(k))) #define TAG21(k,j) ((starpu_tag_t)(((3ULL<<60) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22(k,i,j) ((starpu_tag_t)(((4ULL<<60) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define TAG11_AUX(k, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) | (1ULL<<56) | (unsigned long long)(k))) #define TAG21_AUX(k,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) \ | ((3ULL<<56) | (((unsigned long long)(k))<<32) \ | (unsigned long long)(j)))) #define TAG22_AUX(k,i,j, prefix) ((starpu_tag_t)( (((unsigned long long)(prefix))<<60) \ | ((4ULL<<56) | ((unsigned long long)(k)<<32) \ | ((unsigned long long)(i)<<16) \ | (unsigned long long)(j)))) #define BLOCKSIZE (size/nblocks) #define BLAS3_FLOP(n1,n2,n3) \ (2*((uint64_t)n1)*((uint64_t)n2)*((uint64_t)n3)) static unsigned size = 4*1024; static unsigned nblocks = 16; static unsigned nbigblocks = 8; static unsigned pinned = 0; static unsigned noprio = 0; static unsigned check = 0; static unsigned bound = 0; static unsigned with_ctxs = 0; static unsigned with_noctxs = 0; static unsigned chole1 = 0; static unsigned chole2 = 0; void chol_cpu_codelet_update_u11(void **, void *); void chol_cpu_codelet_update_u21(void **, void *); void chol_cpu_codelet_update_u22(void **, void *); #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 extern struct starpu_perfmodel chol_model_11; extern struct starpu_perfmodel chol_model_21; extern struct starpu_perfmodel chol_model_22; static void STARPU_ATTRIBUTE_UNUSED parse_args(int argc, char **argv) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-with_ctxs") == 0) { with_ctxs = 1; break; } if (strcmp(argv[i], "-with_noctxs") == 0) { with_noctxs = 1; break; } if (strcmp(argv[i], "-chole1") == 0) { chole1 = 1; break; } if (strcmp(argv[i], "-chole2") == 0) { chole2 = 1; break; } if (strcmp(argv[i], "-size") == 0) { char *argptr; size = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks") == 0) { char *argptr; nblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nbigblocks") == 0) { char *argptr; nbigblocks = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-pin") == 0) { pinned = 1; } if (strcmp(argv[i], "-no-prio") == 0) { noprio = 1; } if (strcmp(argv[i], "-bound") == 0) { bound = 1; } if (strcmp(argv[i], "-check") == 0) { check = 1; } if (strcmp(argv[i], "-h") == 0) { printf("usage : %s [-pin] [-size size] [-nblocks nblocks] [-check]\n", argv[0]); } } } #endif /* __DW_CHOLESKY_H__ */ starpu-1.1.5/sc_hypervisor/examples/app_driven_test/0002755000373600000000000000000012571541166017743 500000000000000starpu-1.1.5/sc_hypervisor/examples/app_driven_test/app_driven_test.c0000644000373600000000000001304212571536600023210 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #define NTASKS 1000 #define NINCR 10 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0) struct params { unsigned sched_ctx; int task_tag; }; unsigned val[2]; pthread_mutex_t mut[2]; /* Every implementation of a codelet must have this prototype, the first * argument (buffers) describes the buffers/streams that are managed by the * DSM; the second arguments references read-only data that is passed as an * argument of the codelet (task->cl_arg). Here, "buffers" is unused as there * are no data input/output managed by the DSM (cl.nbuffers = 0) */ void cpu_func(__attribute__((unused))void *buffers[], void *cl_arg) { struct params *params = (struct params *) cl_arg; int i; for(i = 0; i < NINCR; i++) { pthread_mutex_lock(&mut[params->sched_ctx - 1]); val[params->sched_ctx - 1]++; pthread_mutex_unlock(&mut[params->sched_ctx - 1]); } if(params->task_tag != 0) FPRINTF(stdout, "Task with tag %d executed in ctx = %d %d 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 %d at tag %d\n", sched_ctx, tag); /* specify that the contexts should be resized when the task having this particular tag will finish executing */ sc_hypervisor_post_resize_request(sched_ctx, tag); } params[i].sched_ctx = sched_ctx; params[i].task_tag = task[i]->hypervisor_tag; task[i]->cl_arg = ¶ms[i]; task[i]->cl_arg_size = sizeof(params); int ret = starpu_task_submit(task[i]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_task_wait_for_all(); return NULL; } int main() { int ret = starpu_init(NULL); if (ret == -ENODEV) return 77; int nres1 = 6; int nres2 = 6; int ressources1[nres1]; int ressources2[nres2]; int i; for(i = 0; i < nres1; i++) ressources1[i] = i; for(i = 0; i < nres2; i++) ressources2[i] = nres1+i; /* create contexts */ unsigned sched_ctx1 = starpu_sched_ctx_create(ressources1, nres1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); unsigned sched_ctx2 = starpu_sched_ctx_create(ressources2, nres2, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "dmda", 0); /* initialize the hypervisor */ struct sc_hypervisor_policy policy; policy.custom = 0; /* indicate which strategy to use in this particular case we use app_driven which allows the user to resize the ctxs dynamically at particular moments of the execution of the application */ policy.name = "app_driven"; void *perf_counters = sc_hypervisor_init(&policy); /* let starpu know which performance counters should use to inform the hypervisor how the application and the resources are executing */ starpu_sched_ctx_set_perf_counters(sched_ctx1, perf_counters); starpu_sched_ctx_set_perf_counters(sched_ctx2, perf_counters); /* register the contexts that should be managed by the hypervisor and indicate an approximate amount of workload if known; in this case we don't know it and we put 0 */ sc_hypervisor_register_ctx(sched_ctx1, 0.0); sc_hypervisor_register_ctx(sched_ctx2, 0.0); starpu_pthread_t tid[2]; val[0] = 0; val[1] = 0; pthread_mutex_init(&mut[0], NULL); pthread_mutex_init(&mut[1], NULL); /* we create two threads to simulate simultaneous submission of tasks */ starpu_pthread_create(&tid[0], NULL, submit_tasks_thread, (void*)&sched_ctx1); starpu_pthread_create(&tid[1], NULL, submit_tasks_thread, (void*)&sched_ctx2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); /* free starpu and hypervisor data */ starpu_shutdown(); sc_hypervisor_shutdown(); FPRINTF(stdout, "ctx = %d executed %d counter_tests out of %d \n", sched_ctx1, val[0], NTASKS*NINCR); FPRINTF(stdout, "ctx = %d executed %d counter_tests out of %d \n", sched_ctx2, val[1], NTASKS*NINCR); return 0; } starpu-1.1.5/sc_hypervisor/examples/Makefile.am0000644000373600000000000000432712571536600016532 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011,2012 Institut National de Recherche en Informatique et Automatique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. AM_CFLAGS = -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) $(MAGMA_CFLAGS) $(HWLOC_CFLAGS) $(GLOBAL_AM_CFLAGS) LIBS = $(top_builddir)/src/@LIBSTARPU_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) noinst_PROGRAMS = \ app_driven_test/app_driven_test \ lp_test/lp_test \ lp_test/lp_resize_test if !NO_BLAS_LIB noinst_PROGRAMS += \ cholesky/cholesky_implicit noinst_HEADERS = \ cholesky/cholesky.h \ sched_ctx_utils/sched_ctx_utils.h endif if !NO_BLAS_LIB cholesky_cholesky_implicit_SOURCES = \ cholesky/cholesky_implicit.c \ cholesky/cholesky_models.c \ cholesky/cholesky_kernels.c \ sched_ctx_utils/sched_ctx_utils.c \ $(top_srcdir)/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 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 starpu-1.1.5/sc_hypervisor/examples/sched_ctx_utils/0002755000373600000000000000000012571541166017741 500000000000000starpu-1.1.5/sc_hypervisor/examples/sched_ctx_utils/sched_ctx_utils.c0000644000373600000000000003222312571536600023206 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "sched_ctx_utils.h" #include #include "sc_hypervisor.h" #define NSAMPLES 3 unsigned size1; unsigned size2; unsigned nblocks1; unsigned nblocks2; unsigned cpu1; unsigned cpu2; unsigned gpu; unsigned gpu1; unsigned gpu2; typedef struct { unsigned id; unsigned ctx; int the_other_ctx; int *workers; int nworkers; void (*bench)(float*, unsigned, unsigned); unsigned size; unsigned nblocks; float *mat[NSAMPLES]; } params; typedef struct { double flops; double avg_timing; } retvals; int first = 1; starpu_pthread_mutex_t mut; retvals rv[2]; params p1, p2; int it = 0; int it2 = 0; starpu_pthread_key_t key; void init() { size1 = 4*1024; size2 = 4*1024; nblocks1 = 16; nblocks2 = 16; cpu1 = 0; cpu2 = 0; gpu = 0; gpu1 = 0; gpu2 = 0; rv[0].flops = 0.0; rv[1].flops = 0.0; rv[1].avg_timing = 0.0; rv[1].avg_timing = 0.0; p1.ctx = 0; p2.ctx = 0; p1.id = 0; p2.id = 1; starpu_pthread_key_create(&key, NULL); } void update_sched_ctx_timing_results(double flops, double avg_timing) { unsigned *id = starpu_pthread_getspecific(key); rv[*id].flops += flops; rv[*id].avg_timing += avg_timing; } void* start_bench(void *val) { params *p = (params*)val; int i; starpu_pthread_setspecific(key, &p->id); if(p->ctx != 0) starpu_sched_ctx_set_context(&p->ctx); for(i = 0; i < NSAMPLES; i++) p->bench(p->mat[i], p->size, p->nblocks); /* if(p->ctx != 0) */ /* { */ /* starpu_pthread_mutex_lock(&mut); */ /* if(first){ */ /* sc_hypervisor_unregiser_ctx(p->ctx); */ /* starpu_sched_ctx_delete(p->ctx, p->the_other_ctx); */ /* } */ /* first = 0; */ /* starpu_pthread_mutex_unlock(&mut); */ /* } */ sc_hypervisor_stop_resize(p->the_other_ctx); rv[p->id].flops /= NSAMPLES; rv[p->id].avg_timing /= NSAMPLES; } float* construct_matrix(unsigned size) { float *mat; starpu_malloc((void **)&mat, (size_t)size*size*sizeof(float)); unsigned i,j; for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { mat[j +i*size] = (1.0f/(1.0f+i+j)) + ((i == j)?1.0f*size:0.0f); /* mat[j +i*size] = ((i == j)?1.0f*size:0.0f); */ } } return mat; } void start_2benchs(void (*bench)(float*, unsigned, unsigned)) { p1.bench = bench; p1.size = size1; p1.nblocks = nblocks1; p2.bench = bench; p2.size = size2; p2.nblocks = nblocks2; int i; for(i = 0; i < NSAMPLES; i++) { p1.mat[i] = construct_matrix(p1.size); p2.mat[i] = construct_matrix(p2.size); } starpu_pthread_t tid[2]; starpu_pthread_mutex_init(&mut, NULL); struct timeval start; struct timeval end; gettimeofday(&start, NULL); starpu_pthread_create(&tid[0], NULL, (void*)start_bench, (void*)&p1); starpu_pthread_create(&tid[1], NULL, (void*)start_bench, (void*)&p2); starpu_pthread_join(tid[0], NULL); starpu_pthread_join(tid[1], NULL); gettimeofday(&end, NULL); starpu_pthread_mutex_destroy(&mut); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); timing /= 1000000; printf("%2.2f %2.2f ", rv[0].flops, rv[1].flops); printf("%2.2f %2.2f %2.2f\n", rv[0].avg_timing, rv[1].avg_timing, timing); } void start_1stbench(void (*bench)(float*, unsigned, unsigned)) { p1.bench = bench; p1.size = size1; p1.nblocks = nblocks1; int i; for(i = 0; i < NSAMPLES; i++) { p1.mat[i] = construct_matrix(p1.size); } struct timeval start; struct timeval end; gettimeofday(&start, NULL); start_bench((void*)&p1); gettimeofday(&end, NULL); starpu_pthread_mutex_destroy(&mut); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); timing /= 1000000; printf("%2.2f ", rv[0].flops); printf("%2.2f %2.2f\n", rv[0].avg_timing, timing); } void start_2ndbench(void (*bench)(float*, unsigned, unsigned)) { p2.bench = bench; p2.size = size2; p2.nblocks = nblocks2; int i; for(i = 0; i < NSAMPLES; i++) { p2.mat[i] = construct_matrix(p2.size); } struct timeval start; struct timeval end; gettimeofday(&start, NULL); start_bench((void*)&p2); gettimeofday(&end, NULL); starpu_pthread_mutex_destroy(&mut); double timing = (double)((end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec)); timing /= 1000000; printf("%2.2f ", rv[1].flops); printf("%2.2f %2.2f\n", rv[1].avg_timing, timing); } void construct_contexts(void (*bench)(float*, unsigned, unsigned)) { struct sc_hypervisor_policy policy; policy.custom = 0; policy.name = "idle"; void *perf_counters = sc_hypervisor_init(&policy); int nworkers1 = cpu1 + gpu + gpu1; int nworkers2 = cpu2 + gpu + gpu2; unsigned n_all_gpus = gpu + gpu1 + gpu2; int i; int k = 0; nworkers1 = 12; p1.workers = (int*)malloc(nworkers1*sizeof(int)); /* for(i = 0; i < gpu; i++) */ /* p1.workers[k++] = i; */ /* for(i = gpu; i < gpu + gpu1; i++) */ /* p1.workers[k++] = i; */ /* for(i = n_all_gpus; i < n_all_gpus + cpu1; i++) */ /* p1.workers[k++] = i; */ for(i = 0; i < 12; i++) p1.workers[i] = i; p1.ctx = starpu_sched_ctx_create(p1.workers, nworkers1, "sched_ctx1", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0); starpu_sched_ctx_set_perf_counters(p1.ctx, perf_counters); p2.the_other_ctx = (int)p1.ctx; p1.nworkers = nworkers1; sc_hypervisor_register_ctx(p1.ctx, 0.0); /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, p1.workers, p1.nworkers, 5000.0, */ /* SC_HYPERVISOR_MAX_IDLE, p1.workers, gpu+gpu1, 100000.0, */ /* SC_HYPERVISOR_EMPTY_CTX_MAX_IDLE, p1.workers, p1.nworkers, 500000.0, */ /* SC_HYPERVISOR_GRANULARITY, 2, */ /* SC_HYPERVISOR_MIN_TASKS, 1000, */ /* SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE, 100000.0, */ /* SC_HYPERVISOR_MIN_WORKERS, 6, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* NULL); */ sc_hypervisor_ctl(p1.ctx, SC_HYPERVISOR_GRANULARITY, 2, SC_HYPERVISOR_MIN_TASKS, 1000, SC_HYPERVISOR_MIN_WORKERS, 6, SC_HYPERVISOR_MAX_WORKERS, 12, NULL); k = 0; p2.workers = (int*)malloc(nworkers2*sizeof(int)); /* for(i = 0; i < gpu; i++) */ /* p2.workers[k++] = i; */ /* for(i = gpu + gpu1; i < gpu + gpu1 + gpu2; i++) */ /* p2.workers[k++] = i; */ /* for(i = n_all_gpus + cpu1; i < n_all_gpus + cpu1 + cpu2; i++) */ /* p2.workers[k++] = i; */ p2.ctx = starpu_sched_ctx_create(p2.workers, 0, "sched_ctx2", STARPU_SCHED_CTX_POLICY_NAME, "heft", 0); starpu_sched_ctx_set_perf_counters(p2.ctx, perf_counters); p1.the_other_ctx = (int)p2.ctx; p2.nworkers = 0; sc_hypervisor_register_ctx(p2.ctx, 0.0); /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, p2.workers, p2.nworkers, 2000.0, */ /* SC_HYPERVISOR_MAX_IDLE, p2.workers, gpu+gpu2, 5000.0, */ /* SC_HYPERVISOR_EMPTY_CTX_MAX_IDLE, p1.workers, p1.nworkers, 500000.0, */ /* SC_HYPERVISOR_GRANULARITY, 2, */ /* SC_HYPERVISOR_MIN_TASKS, 500, */ /* SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE, 1000.0, */ /* SC_HYPERVISOR_MIN_WORKERS, 4, */ /* SC_HYPERVISOR_MAX_WORKERS, 8, */ /* NULL); */ sc_hypervisor_ctl(p2.ctx, SC_HYPERVISOR_GRANULARITY, 2, SC_HYPERVISOR_MIN_TASKS, 500, SC_HYPERVISOR_MIN_WORKERS, 0, SC_HYPERVISOR_MAX_WORKERS, 6, NULL); } void set_hypervisor_conf(int event, int task_tag) { /* unsigned *id = starpu_pthread_getspecific(key); */ /* if(*id == 0) */ /* { */ /* if(event == END_BENCH) */ /* { */ /* if(it < 2) */ /* { */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 2, */ /* SC_HYPERVISOR_MAX_WORKERS, 4, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p2.ctx, 4, task_tag); */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 6, */ /* SC_HYPERVISOR_MAX_WORKERS, 8, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p1.ctx, 8, task_tag); */ /* sc_hypervisor_resize(p1.ctx, task_tag); */ /* } */ /* if(it == 2) */ /* { */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 12, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p2.ctx, 12, task_tag); */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 0, */ /* SC_HYPERVISOR_MAX_WORKERS, 0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p1.ctx, 0, task_tag); */ /* sc_hypervisor_resize(p1.ctx, task_tag); */ /* } */ /* it++; */ /* } */ /* } */ /* else */ /* { */ /* if(event == END_BENCH) */ /* { */ /* if(it2 < 3) */ /* { */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 6, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p1.ctx, 12, task_tag); */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MIN_WORKERS, 0, */ /* SC_HYPERVISOR_MAX_WORKERS, 0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* printf("%d: set max %d for tag %d\n", p2.ctx, 0, task_tag); */ /* sc_hypervisor_resize(p2.ctx, task_tag); */ /* } */ /* it2++; */ /* } */ /* } */ /* if(*id == 1) */ /* { */ /* if(event == START_BENCH) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 800000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* else */ /* { */ /* if(it2 < 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 500.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 200.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* if(it2 == 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p2.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 1000.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 500.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* SC_HYPERVISOR_MAX_WORKERS, 12, */ /* NULL); */ /* } */ /* it2++; */ /* } */ /* } else { */ /* if(event == START_BENCH) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 1500.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 4000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* if(event == END_BENCH) */ /* { */ /* if(it < 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 100.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 5000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* if(it == 2) */ /* { */ /* int workers[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; */ /* sc_hypervisor_ctl(p1.ctx, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 12, 5000.0, */ /* SC_HYPERVISOR_MAX_IDLE, workers, 3, 10000.0, */ /* SC_HYPERVISOR_TIME_TO_APPLY, task_tag, */ /* NULL); */ /* } */ /* it++; */ /* } */ /* } */ } void end_contexts() { free(p1.workers); free(p2.workers); sc_hypervisor_shutdown(); } void parse_args_ctx(int argc, char **argv) { init(); int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-size1") == 0) { char *argptr; size1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks1") == 0) { char *argptr; nblocks1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-size2") == 0) { char *argptr; size2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-nblocks2") == 0) { char *argptr; nblocks2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu1") == 0) { char *argptr; cpu1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-cpu2") == 0) { char *argptr; cpu2 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu") == 0) { char *argptr; gpu = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu1") == 0) { char *argptr; gpu1 = strtol(argv[++i], &argptr, 10); } if (strcmp(argv[i], "-gpu2") == 0) { char *argptr; gpu2 = strtol(argv[++i], &argptr, 10); } } } starpu-1.1.5/sc_hypervisor/examples/sched_ctx_utils/sched_ctx_utils.h0000644000373600000000000000242412571536600023213 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #define START_BENCH 0 #define END_BENCH 1 void parse_args_ctx(int argc, char **argv); void update_sched_ctx_timing_results(double gflops, double timing); void construct_contexts(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void end_contexts(void); void start_2benchs(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void start_1stbench(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void start_2ndbench(void (*bench)(float *mat, unsigned size, unsigned nblocks)); void set_hypervisor_conf(int event, int task_tag); starpu-1.1.5/sc_hypervisor/include/0002755000373600000000000000000012571541166014362 500000000000000starpu-1.1.5/sc_hypervisor/include/sc_hypervisor_policy.h0000644000373600000000000001234612571536600020732 00000000000000/* StarPUf --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_POLICY_H #define SC_HYPERVISOR_POLICY_H #include #ifdef __cplusplus extern "C" { #endif #define HYPERVISOR_REDIM_SAMPLE 0.02 #define HYPERVISOR_START_REDIM_SAMPLE 0.1 #define SC_NOTHING 0 #define SC_IDLE 1 #define SC_SPEED 2 struct types_of_workers { unsigned ncpus; unsigned ncuda; unsigned nw; }; struct sc_hypervisor_policy_task_pool { struct starpu_codelet *cl; uint32_t footprint; unsigned sched_ctx_id; unsigned long n; size_t data_size; struct sc_hypervisor_policy_task_pool *next; }; /* add task information to a task wrapper linked list */ void sc_hypervisor_policy_add_task_to_pool(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools, size_t data_size); /* remove task information from a task wrapper linked list */ void sc_hypervisor_policy_remove_task_from_pool(struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools); /* clone a task wrapper linked list */ struct sc_hypervisor_policy_task_pool* sc_hypervisor_policy_clone_task_pool(struct sc_hypervisor_policy_task_pool *tp); /* get the execution time of the submitted tasks out of starpu's calibration files */ void sc_hypervisor_get_tasks_times(int nw, int nt, double times[nw][nt], int *workers, unsigned size_ctxs, struct sc_hypervisor_policy_task_pool *task_pools); /* find the context with the lowest priority in order to move some workers */ unsigned sc_hypervisor_find_lowest_prio_sched_ctx(unsigned req_sched_ctx, int nworkers_to_move); /* find the first most idle workers of a context*/ int* sc_hypervisor_get_idlest_workers(unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch); /* find the first most idle workers in a list */ int* sc_hypervisor_get_idlest_workers_in_list(int *start, int *workers, int nall_workers, int *nworkers, enum starpu_worker_archtype arch); /* find workers that can be moved from a context (if the constraints of min, max, etc allow this) */ int sc_hypervisor_get_movable_nworkers(struct sc_hypervisor_policy_config *config, unsigned sched_ctx, enum starpu_worker_archtype arch); /* compute how many workers should be moved from this context */ int sc_hypervisor_compute_nworkers_to_move(unsigned req_sched_ctx); /* check the policy's constraints in order to resize */ unsigned sc_hypervisor_policy_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize, unsigned now); /* check the policy's constraints in order to resize and find a context willing the resources */ unsigned sc_hypervisor_policy_resize_to_unknown_receiver(unsigned sender_sched_ctx, unsigned now); /* compute the speed of a context */ double sc_hypervisor_get_ctx_speed(struct sc_hypervisor_wrapper* sc_w); /* get the time of execution of the slowest context */ double sc_hypervisor_get_slowest_ctx_exec_time(void); /* get the time of execution of the fastest context */ double sc_hypervisor_get_fastest_ctx_exec_time(void); /* compute the speed of a workers in a context */ double sc_hypervisor_get_speed_per_worker(struct sc_hypervisor_wrapper *sc_w, unsigned worker); /* compute the speed of a type of worker in a context */ double sc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch); /* compute the speed of a type of worker in a context depending on its history */ double sc_hypervisor_get_ref_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch); /* 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(void); /* 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.1.5/sc_hypervisor/include/sc_hypervisor_lp.h0000644000373600000000000001056312571536600020045 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_LP_H #define SC_HYPERVISOR_LP_H #include #include #ifdef __cplusplus extern "C" { #endif /* * GNU Linear Programming Kit backend */ #ifdef STARPU_HAVE_GLPK_H #include #endif //STARPU_HAVE_GLPK_H struct sc_hypervisor_policy_task_pool; struct types_of_workers; /* returns tmax, and computes in table res the nr of workers needed by each context st the system ends up in the smallest tmax*/ double sc_hypervisor_lp_get_nworkers_per_ctx(int nsched_ctxs, int ntypes_of_workers, double res[nsched_ctxs][ntypes_of_workers], int total_nw[ntypes_of_workers], struct types_of_workers *tw); /* returns tmax of the system */ double sc_hypervisor_lp_get_tmax(int nw, int *workers); /* the linear programme determins a rational number of ressources for each ctx, we round them depending on the type of ressource */ void sc_hypervisor_lp_round_double_to_int(int ns, int nw, double res[ns][nw], int res_rounded[ns][nw]); /* redistribute the ressource in contexts by assigning the first x available ressources to each one */ void sc_hypervisor_lp_redistribute_resources_in_ctxs(int ns, int nw, int res_rounded[ns][nw], double res[ns][nw], unsigned *sched_ctxs, struct types_of_workers *tw); /* make the first distribution of ressource in contexts by assigning the first x available ressources to each one */ void sc_hypervisor_lp_distribute_resources_in_ctxs(unsigned* sched_ctxs, int ns, int nw, int res_rounded[ns][nw], double res[ns][nw], int *workers, int nworkers, struct types_of_workers *tw); /* 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.1.5/sc_hypervisor/include/sc_hypervisor_monitoring.h0000644000373600000000000001215612571536600021617 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_MONITORING_H #define SC_HYPERVISOR_MONITORING_H #include #ifdef __cplusplus extern "C" { #endif /* structure to indicate when the moving of workers was actually done (moved workers can be seen in the new ctx ) */ struct sc_hypervisor_resize_ack { /* receiver context */ int receiver_sched_ctx; /* list of workers required to be moved */ int *moved_workers; /* number of workers required to be moved */ int nmoved_workers; /* list of workers that actually got in the receiver ctx */ int *acked_workers; }; /* wrapper attached to a sched_ctx storing monitoring information */ struct sc_hypervisor_wrapper { /* the sched_ctx it monitors */ unsigned sched_ctx; /* user configuration meant to limit resizing */ struct sc_hypervisor_policy_config *config; /* the start time of the resizing sample of the workers of this context*/ double start_time_w[STARPU_NMAXWORKERS]; /* idle time of workers in this context */ double current_idle_time[STARPU_NMAXWORKERS]; /* idle time from the last resize */ double idle_time[STARPU_NMAXWORKERS]; /* time when the idle started */ double idle_start_time[STARPU_NMAXWORKERS]; /* time during which the worker executed tasks */ double exec_time[STARPU_NMAXWORKERS]; /* time when the worker started executing a task */ double exec_start_time[STARPU_NMAXWORKERS]; /* list of workers that will leave this contexts (lazy resizing process) */ int worker_to_be_removed[STARPU_NMAXWORKERS]; /* number of tasks pushed on each worker in this ctx */ int pushed_tasks[STARPU_NMAXWORKERS]; /* number of tasks poped from each worker in this ctx */ int poped_tasks[STARPU_NMAXWORKERS]; /* number of flops the context has to execute */ double total_flops; /* number of flops executed since the biginning until now */ double total_elapsed_flops[STARPU_NMAXWORKERS]; /* number of flops executed since last resizing */ double elapsed_flops[STARPU_NMAXWORKERS]; /* data quantity executed on each worker in this ctx */ size_t elapsed_data[STARPU_NMAXWORKERS]; /* nr of tasks executed on each worker in this ctx */ int elapsed_tasks[STARPU_NMAXWORKERS]; /* the average speed of the type of workers when they belonged to this context */ /* 0 - cuda 1 - cpu */ double ref_speed[2]; /* number of flops submitted to this ctx */ double submitted_flops; /* number of flops that still have to be executed in this ctx */ double remaining_flops; /* the start time of the resizing sample of this context*/ double start_time; /* the first time a task was pushed to this context*/ double real_start_time; /* the start time for sample in which the hyp is not allowed to react bc too expensive */ double hyp_react_start_time; /* the workers don't leave the current ctx until the receiver ctx doesn't ack the receive of these workers */ struct sc_hypervisor_resize_ack resize_ack; /* mutex to protect the ack of workers */ starpu_pthread_mutex_t mutex; /* boolean indicating if the resizing strategy can see the flops of all the execution or not */ unsigned total_flops_available; /* boolean indicating that a context is being sized */ unsigned to_be_sized; /* boolean indicating if we add the idle of this worker to the idle of the context */ unsigned compute_idle[STARPU_NMAXWORKERS]; }; /* return the wrapper of context that saves its monitoring information */ struct sc_hypervisor_wrapper *sc_hypervisor_get_wrapper(unsigned sched_ctx); /* get the list of registered contexts */ unsigned *sc_hypervisor_get_sched_ctxs(); /* get the number of registered contexts */ int sc_hypervisor_get_nsched_ctxs(); /* get the number of workers of a certain architecture in a context */ int sc_hypervisor_get_nworkers_ctx(unsigned sched_ctx, enum starpu_worker_archtype arch); /* get the number of flops executed by a context since last resizing (reset to 0 when a resizing is done)*/ double sc_hypervisor_get_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper *sc_w); /* get the number of flops executed by a context since the begining */ double sc_hypervisor_get_total_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper* sc_w); /* compute an average value of the cpu/cuda speed */ double sc_hypervisorsc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch); /* compte the actual speed of all workers of a specific type of worker */ double sc_hypervisor_get_speed(struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch); #ifdef __cplusplus } #endif #endif starpu-1.1.5/sc_hypervisor/include/sc_hypervisor.h0000644000373600000000000001322712571536600017352 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_H #define SC_HYPERVISOR_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* synchronise the hypervisor when several workers try to update its information */ starpu_pthread_mutex_t act_hypervisor_mutex; /* platform of resizing contexts */ struct sc_hypervisor_policy { /* name of the strategy */ const char* name; /* indicate if it is a policiy create by the user or not */ unsigned custom; /* Distribute workers to contexts even at the begining of the program */ void (*size_ctxs)(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers); /* Require explicit resizing */ void (*resize_ctxs)(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers); /* the hypervisor takes a decision when the worker was idle for another cyle in this ctx */ void (*handle_idle_cycle)(unsigned sched_ctx, int worker); /* the hypervisor takes a decision when another task was pushed on this worker in this ctx */ void (*handle_pushed_task)(unsigned sched_ctx, int worker); /* the hypervisor takes a decision when another task was poped from this worker in this ctx */ void (*handle_poped_task)(unsigned sched_ctx, int worker,struct starpu_task *task, uint32_t footprint); /* the hypervisor takes a decision when the worker stoped being idle in this ctx */ void (*handle_idle_end)(unsigned sched_ctx, int worker); /* the hypervisor takes a decision when a certain task finished executing in this ctx */ void (*handle_post_exec_hook)(unsigned sched_ctx, int task_tag); /* the hypervisor takes a decision when a job was submitted in this ctx */ void (*handle_submitted_job)(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size); /* the hypervisor takes a decision when a certain ctx was deleted */ void (*end_ctx)(unsigned sched_ctx); }; /* start the hypervisor indicating the resizing policy to user */ void* sc_hypervisor_init(struct sc_hypervisor_policy *policy); /* shutdown the hypervisor */ void sc_hypervisor_shutdown(void); /* only registered contexts are resized by the hypervisor */ void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops); /* remove a worker from the hypervisor's list */ void sc_hypervisor_unregister_ctx(unsigned sched_ctx); /* submit a requirement of resizing when a task taged with task_tag is executed */ void sc_hypervisor_post_resize_request(unsigned sched_ctx, int task_tag); /* reevaluate the distribution of the resources and eventually resize if needed */ void sc_hypervisor_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers); /* don't allow the hypervisor to resize a context */ void sc_hypervisor_stop_resize(unsigned sched_ctx); /* allow the hypervisor to resize a context */ void sc_hypervisor_start_resize(unsigned sched_ctx); /* check out the current policy of the hypervisor */ const char *sc_hypervisor_get_policy(); /* ask the hypervisor to add workers to a sched_ctx */ void sc_hypervisor_add_workers_to_sched_ctx(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx); /* ask the hypervisor to remove workers from a sched_ctx */ void sc_hypervisor_remove_workers_from_sched_ctx(int* workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now); /* ask the hypervisor to move workers from one context to another */ void sc_hypervisor_move_workers(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *workers_to_move, unsigned nworkers_to_move, unsigned now); /* ask the hypervisor to chose a distribution of workers in the required contexts */ void sc_hypervisor_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers); /* check if there are pending demands of resizing */ unsigned sc_hypervisor_get_size_req(unsigned **sched_ctxs, int* nsched_ctxs, int **workers, int *nworkers); /* save a demand of resizing */ void sc_hypervisor_save_size_req(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers); /* clear the list of pending demands of resizing */ void sc_hypervisor_free_size_req(void); /* check out if a context can be resized */ unsigned sc_hypervisor_can_resize(unsigned sched_ctx); /* indicate the types of tasks a context will execute in order to better decide the sizing of ctxs */ void sc_hypervisor_set_type_of_task(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size); /* change dynamically the total number of flops of a context, move the deadline of the finishing time of the context */ void sc_hypervisor_update_diff_total_flops(unsigned sched_ctx, double diff_total_flops); /* change dynamically the number of the elapsed flops in a context, modify the past in order to better compute the speed */ void sc_hypervisor_update_diff_elapsed_flops(unsigned sched_ctx, double diff_task_flops); /* updates the min and max workers needed by each context */ void sc_hypervisor_update_resize_interval(unsigned *sched_ctxs, int nsched_ctxs); #ifdef __cplusplus } #endif #endif starpu-1.1.5/sc_hypervisor/include/sc_hypervisor_config.h0000644000373600000000000000544112571536600020676 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 - 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef SC_HYPERVISOR_CONFIG_H #define SC_HYPERVISOR_CONFIG_H #include #ifdef __cplusplus extern "C" { #endif /* ctl properties*/ #define SC_HYPERVISOR_MAX_IDLE -1 #define SC_HYPERVISOR_MIN_WORKING -2 #define SC_HYPERVISOR_PRIORITY -3 #define SC_HYPERVISOR_MIN_WORKERS -4 #define SC_HYPERVISOR_MAX_WORKERS -5 #define SC_HYPERVISOR_GRANULARITY -6 #define SC_HYPERVISOR_FIXED_WORKERS -7 #define SC_HYPERVISOR_MIN_TASKS -8 #define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE -9 #define SC_HYPERVISOR_TIME_TO_APPLY -10 #define SC_HYPERVISOR_NULL -11 #define SC_HYPERVISOR_ISPEED_W_SAMPLE -12 #define SC_HYPERVISOR_ISPEED_CTX_SAMPLE -13 #define SC_HYPERVISOR_TIME_SAMPLE -14 #define MAX_IDLE_TIME 5000000000 #define MIN_WORKING_TIME 500 struct sc_hypervisor_policy_config { /* underneath this limit we cannot resize */ int min_nworkers; /* above this limit we cannot resize */ int max_nworkers; /*resize granularity */ int granularity; /* priority for a worker to stay in this context */ /* the smaller the priority the faster it will be moved */ /* to another context */ int priority[STARPU_NMAXWORKERS]; /* above this limit the priority of the worker is reduced */ double max_idle[STARPU_NMAXWORKERS]; /* underneath this limit the priority of the worker is reduced */ double min_working[STARPU_NMAXWORKERS]; /* workers that will not move */ int fixed_workers[STARPU_NMAXWORKERS]; /* max idle for the workers that will be added during the resizing process*/ double new_workers_max_idle; /* sample used to compute the instant speed per worker*/ double ispeed_w_sample[STARPU_NMAXWORKERS]; /* sample used to compute the instant speed per ctx*/ double ispeed_ctx_sample; /* sample used to compute the instant speed per ctx (in seconds)*/ double time_sample; }; /* set a certain configuration to a context */ void sc_hypervisor_set_config(unsigned sched_ctx, void *config); /* check out the configuration of a context */ struct sc_hypervisor_policy_config *sc_hypervisor_get_config(unsigned sched_ctx); /* impose different parameters to a configuration of a context */ void sc_hypervisor_ctl(unsigned sched_ctx, ...); #ifdef __cplusplus } #endif #endif starpu-1.1.5/m4/0002755000373600000000000000000012571541160010352 500000000000000starpu-1.1.5/m4/lt~obsolete.m40000644000373600000000000001375612571536624013131 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) starpu-1.1.5/m4/acinclude.m40000644000373600000000000001040012571536566012472 00000000000000dnl Copyright (C) Free Software Foundation, Inc. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA dnl dnl This test is taken from libgfortran dnl Check whether the target supports __sync_val_compare_and_swap. AC_DEFUN([STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP], [ AC_CACHE_CHECK([whether the target supports __sync_val_compare_and_swap], ac_cv_have_sync_val_compare_and_swap, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_val_compare_and_swap(&foo, 0, 1);])], [ac_cv_have_sync_val_compare_and_swap=yes], [ac_cv_have_sync_val_compare_and_swap=no])]) if test $ac_cv_have_sync_val_compare_and_swap = yes; then AC_DEFINE(STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP, 1, [Define to 1 if the target supports __sync_val_compare_and_swap]) fi]) dnl Check whether the target supports __sync_bool_compare_and_swap. AC_DEFUN([STARPU_CHECK_SYNC_BOOL_COMPARE_AND_SWAP], [ AC_CACHE_CHECK([whether the target supports __sync_bool_compare_and_swap], ac_cv_have_sync_bool_compare_and_swap, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_bool_compare_and_swap(&foo, 0, 1);])], [ac_cv_have_sync_bool_compare_and_swap=yes], [ac_cv_have_sync_bool_compare_and_swap=no])]) if test $ac_cv_have_sync_bool_compare_and_swap = yes; then AC_DEFINE(STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP, 1, [Define to 1 if the target supports __sync_bool_compare_and_swap]) fi]) dnl Check whether the target supports __sync_fetch_and_add. AC_DEFUN([STARPU_CHECK_SYNC_FETCH_AND_ADD], [ AC_CACHE_CHECK([whether the target supports __sync_fetch_and_add], ac_cv_have_sync_fetch_and_add, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_fetch_and_add(&foo, 1);])], [ac_cv_have_sync_fetch_and_add=yes], [ac_cv_have_sync_fetch_and_add=no])]) if test $ac_cv_have_sync_fetch_and_add = yes; then AC_DEFINE(STARPU_HAVE_SYNC_FETCH_AND_ADD, 1, [Define to 1 if the target supports __sync_fetch_and_add]) fi]) dnl Check whether the target supports __sync_fetch_and_or. AC_DEFUN([STARPU_CHECK_SYNC_FETCH_AND_OR], [ AC_CACHE_CHECK([whether the target supports __sync_fetch_and_or], ac_cv_have_sync_fetch_and_or, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_fetch_and_or(&foo, 1);])], [ac_cv_have_sync_fetch_and_or=yes], [ac_cv_have_sync_fetch_and_or=no])]) if test $ac_cv_have_sync_fetch_and_or = yes; then AC_DEFINE(STARPU_HAVE_SYNC_FETCH_AND_OR, 1, [Define to 1 if the target supports __sync_fetch_and_or]) fi]) dnl Check whether the target supports __sync_lock_test_and_set. AC_DEFUN([STARPU_CHECK_SYNC_LOCK_TEST_AND_SET], [ AC_CACHE_CHECK([whether the target supports __sync_lock_test_and_set], ac_cv_have_sync_lock_test_and_set, [ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo, bar;], [bar = __sync_lock_test_and_set(&foo, 1);])], [ac_cv_have_sync_lock_test_and_set=yes], [ac_cv_have_sync_lock_test_and_set=no])]) if test $ac_cv_have_sync_lock_test_and_set = yes; then AC_DEFINE(STARPU_HAVE_SYNC_LOCK_TEST_AND_SET, 1, [Define to 1 if the target supports __sync_lock_test_and_set]) fi]) dnl Check whether the target supports __sync_synchronize. AC_DEFUN([STARPU_CHECK_SYNC_SYNCHRONIZE], [ AC_CACHE_CHECK([whether the target supports __sync_synchronize], ac_cv_have_sync_synchronize, [ AC_LINK_IFELSE([AC_LANG_PROGRAM(, [__sync_synchronize();])], [ac_cv_have_sync_synchronize=yes], [ac_cv_have_sync_synchronize=no])]) if test $ac_cv_have_sync_synchronize = yes; then AC_DEFINE(STARPU_HAVE_SYNC_SYNCHRONIZE, 1, [Define to 1 if the target supports __sync_synchronize]) fi]) starpu-1.1.5/m4/ltoptions.m40000644000373600000000000003007312571536624012601 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) starpu-1.1.5/m4/ltversion.m40000644000373600000000000000126212571536624012571 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) starpu-1.1.5/m4/libs.m40000644000373600000000000000351112571536566011501 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2011 Université de Bordeaux # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. # STARPU_SEARCH_LIBS(NAME, FUNCTION, SEARCH-LIBS, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # # Like AC_SEARCH_LIBS, but puts -l flags into $1_LDFLAGS instead of LIBS, and # AC_SUBSTs it AC_DEFUN([STARPU_SEARCH_LIBS], [dnl _LIBS_SAV="$LIBS" LIBS="" AC_SEARCH_LIBS([$2], [$3], [$4], [$5], [$6]) STARPU_$1_LDFLAGS="$STARPU_$1_LDFLAGS $LIBS" LIBS=$_LIBS_SAV AC_SUBST(STARPU_$1_LDFLAGS) ])dnl # STARPU_CHECK_LIB(NAME, LIBRARY, FUNCTION, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # # Like AC_CHECK_LIB, but puts -l flags into $1_LDFLAGS instead of LIBS, and # AC_SUBSTs it AC_DEFUN([STARPU_CHECK_LIB], [dnl _LIBS_SAV="$LIBS" LIBS="" AC_CHECK_LIB([$2], [$3], [$4], [$5], [$6]) STARPU_$1_LDFLAGS="$STARPU_$1_LDFLAGS $LIBS" LIBS=$_LIBS_SAV AC_SUBST(STARPU_$1_LDFLAGS) ])dnl # STARPU_HAVE_LIBRARY(NAME, LIBRARY, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], # [OTHER-LIBRARIES]) # Like AC_HAVE_LIBRARY, but puts -l flags into $1_LDFLAGS instead of LIBS, and # AC_SUBSTs it AC_DEFUN([STARPU_HAVE_LIBRARY], [dnl STARPU_CHECK_LIB([$1], [$2], main, [$3], [$4], [$5]) ])dnl starpu-1.1.5/m4/pkg.m40000644000373600000000000001214512571536566011334 00000000000000# 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.1.5/m4/libtool.m40000644000373600000000000106011112571536624012207 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS starpu-1.1.5/m4/ltsugar.m40000644000373600000000000001042412571536624012225 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) starpu-1.1.5/m4/gcc.m40000644000373600000000000001625512571536566011315 00000000000000dnl -*- Autoconf -*- dnl dnl Copyright (C) 2011, 2012, 2013 Inria dnl dnl StarPU is free software; you can redistribute it and/or modify dnl it under the terms of the GNU Lesser General Public License as published by dnl the Free Software Foundation; either version 2.1 of the License, or (at dnl your option) any later version. dnl dnl StarPU is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. dnl dnl See the GNU Lesser General Public License in COPYING.LGPL for more details. dnl Run its argument with CPPFLAGS pointing to GCC's plug-in API. AC_DEFUN([_STARPU_WITH_GCC_PLUGIN_API], [ GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac $1 CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" ]) dnl Set $ac_cv_starpu_gcc_for_plugin to the compiler to use to compile dnl GCC plug-ins. It's `gcc' for GCC 4.5/4.6, probably `g++' for 4.7, dnl and definitely `g++' for 4.8, because the last two build dnl themselves with `g++', leading to mangled names. dnl See for details. AC_DEFUN([_STARPU_GCC_PLUGIN_LANGUAGE], [ AC_CACHE_CHECK([which compiler to use to build GCC plug-ins], [ac_cv_starpu_gcc_for_plugin], [ for GCC_FOR_PLUGIN in "$CC" "$CXX" "" do if test "x$GCC_FOR_PLUGIN" = "x"; then break; fi cat > conftest.c < #include #include int plugin_is_GPL_compatible; extern struct cpp_reader *parse_in; /* C-family front-ends */ static void define_something (void *gcc_data, void *user_data) { cpp_define (parse_in, "CONFTEST_GCC_PLUGIN=1"); } int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { if (!plugin_default_version_check (version, &gcc_version)) return 1; register_callback ("conftest", PLUGIN_START_UNIT, define_something, NULL); return 0; } END_OF_CONFTEST # Build the plug-in. rm -f conftest.so _STARPU_WITH_GCC_PLUGIN_API([ _AC_DO(["$GCC_FOR_PLUGIN" "$CPPFLAGS" -fPIC -shared conftest.c -o conftest.so]) || { AC_MSG_ERROR([failed to build a GCC plug-in with `$GCC_FOR_PLUGIN']) } ]) # Attempt to use it. save_CFLAGS="$CFLAGS" CFLAGS="-fplugin=$PWD/conftest.so" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #ifndef CONFTEST_GCC_PLUGIN # error plug-in not loaded #endif]], [])], [ac_cv_starpu_gcc_for_plugin="$GCC_FOR_PLUGIN"], [:]) CFLAGS="$save_CFLAGS" rm -f conftest.so conftest.c if test "x$ac_cv_starpu_gcc_for_plugin" != "x"; then # We're done. break fi done if test "x$ac_cv_starpu_gcc_for_plugin" = "x"; then AC_MSG_RESULT([none]) AC_MSG_ERROR([could not find a suitable compiler for GCC plug-ins]) fi ]) $1="$ac_cv_starpu_gcc_for_plugin" ]) dnl Check whether GCC plug-in support is available (GCC 4.5+). AC_DEFUN([STARPU_GCC_PLUGIN_SUPPORT], [ AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_CXX]) dnl for GCC 4.7+ AC_CACHE_CHECK([whether GCC supports plug-ins], [ac_cv_have_gcc_plugins], [ if test "x$GCC" = xyes; then # ICC 12.1.0 and Clang 3.1 (among others) support `--version', # define `__GNUC__', and provide a `-print-file-name=plugin' # that returns GCC's valid header directory. This makes them # hardly distinguishable from GCC. Actually, ICC 12.1.0 is able # to compile our plug-in, but silently ignores `-fplugin', leading # to obvious build failures; thus, it is explicitly excluded below. _STARPU_WITH_GCC_PLUGIN_API([ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include #include #if defined __INTEL_COMPILER || defined __ICC Beware, this compiler is a fake. Don't use it. #endif tree fndecl; gimple call;]], [[/* Clang 3.1 doesn't support nested functions, so try to discriminate it this way. */ tree foo (void) { return lookup_name (get_identifier ("puts")); } fndecl = foo (); call = gimple_build_call (fndecl, 0);]])], [ac_cv_have_gcc_plugins="yes"], [ac_cv_have_gcc_plugins="no"]) ]) else ac_cv_have_gcc_plugins="no" fi ]) if test "x$ac_cv_have_gcc_plugins" = "xyes"; then dnl Check for specific features. dnl dnl Reason: dnl build_call_expr_loc_array -- not in GCC 4.5.x; appears in 4.6 dnl build_call_expr_loc_vec -- likewise dnl build_array_ref -- present but undeclared in 4.6.1 dnl build_zero_cst -- not in GCC 4.5.x; appears in 4.6 dnl builtin_decl_explicit -- new in 4.7, replaces `built_in_decls' dnl ptr_derefs_may_alias_p -- new in 4.6, nothing equivalent in 4.5 dnl .affects_type_identity -- new field in 4.7 _STARPU_WITH_GCC_PLUGIN_API([ AC_CHECK_DECLS([build_call_expr_loc_array, build_call_expr_loc_vec, build_array_ref, build_zero_cst, builtin_decl_explicit, ptr_derefs_may_alias_p], [], [], [#include #include #include ]) dnl Work around header naming issues introduced upstream and in Debian dnl (see ). AC_CHECK_HEADERS([c-common.h c-pragma.h c-family/c-common.h c-family/c-pragma.h], [], [], [#include #include ]) AC_CHECK_MEMBER([struct attribute_spec.affects_type_identity], [AC_DEFINE([HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY], [1], [Define to 1 when `struct attribute_spec' has the `affects_type_identity' field.])], [], [#include #include ]) ]) AC_DEFINE_UNQUOTED([STARPU_INCLUDE_DIR], ["`test "x$prefix" = xNONE && prefix=$ac_default_prefix ; eval "echo $includedir"`/starpu/$STARPU_EFFECTIVE_VERSION"], [Define to the directory where StarPU's headers are installed.]) dnl Now, `gcc' or `g++'? _STARPU_GCC_PLUGIN_LANGUAGE([GCC_FOR_PLUGIN]) AC_SUBST([GCC_FOR_PLUGIN]) dnl Determine the corresponding Libtool tag. if test "$GCC_FOR_PLUGIN" = "$CXX"; then GCC_FOR_PLUGIN_LIBTOOL_TAG="CXX" # Require C++11, for lambdas and `auto'. GCC_FOR_PLUGIN="$GCC_FOR_PLUGIN -std=c++11" else GCC_FOR_PLUGIN_LIBTOOL_TAG="CC" fi AC_SUBST([GCC_FOR_PLUGIN_LIBTOOL_TAG]) fi AC_SUBST([GCC_PLUGIN_INCLUDE_DIR]) ]) dnl Substitute `STARPU_GCC_VERSION_MAJOR' and `STARPU_GCC_VERSION_MINOR'. AC_DEFUN([STARPU_GCC_VERSION], [ AC_COMPUTE_INT([STARPU_GCC_VERSION_MAJOR], [__GNUC__]) AC_COMPUTE_INT([STARPU_GCC_VERSION_MINOR], [__GNUC_MINOR__]) AC_SUBST([STARPU_GCC_VERSION_MAJOR]) AC_SUBST([STARPU_GCC_VERSION_MINOR]) ]) starpu-1.1.5/tests/0002755000373600000000000000000012571541162011176 500000000000000starpu-1.1.5/tests/perfmodels/0002755000373600000000000000000012571541162013336 500000000000000starpu-1.1.5/tests/perfmodels/feed.c0000644000373600000000000000434712571536551014341 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Test the starpu_perfmodel_update_history function */ #include #include #include "../helper.h" static struct starpu_perfmodel model = { .type = STARPU_REGRESSION_BASED, .symbol = "feed" }; static struct starpu_perfmodel nl_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "nlfeed" }; static struct starpu_codelet cl = { .model = &model, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char **argv) { struct starpu_task task; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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; /* Simulate Fast GPU */ starpu_perfmodel_update_history(&model, &task, STARPU_CUDA_DEFAULT, 0, 0, measured_fast); starpu_perfmodel_update_history(&nl_model, &task, STARPU_CUDA_DEFAULT, 0, 0, measured_fast); /* Simulate Slow GPU */ starpu_perfmodel_update_history(&model, &task, STARPU_CUDA_DEFAULT + 1, 0, 0, measured_slow); starpu_perfmodel_update_history(&nl_model, &task, STARPU_CUDA_DEFAULT + 1, 0, 0, measured_slow); starpu_task_clean(&task); starpu_data_unregister(handle); } starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/perfmodels/non_linear_regression_based.c0000644000373600000000000000647212571536551021161 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014-2015 Université de Bordeaux * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #define START_LOG 8 #ifdef STARPU_QUICK_CHECK #define END_LOG 20 #else #define END_LOG 25 #endif #ifdef STARPU_USE_CUDA static void memset_cuda(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(ptr, 42, n * sizeof(*ptr), starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void memset_cpu(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); memset(ptr, 42, n * sizeof(*ptr)); } static struct starpu_perfmodel model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "non_linear_memset_regression_based" }; #ifdef STARPU_USE_OPENCL extern void memset_opencl(void *buffers[], void *args); #endif static struct starpu_codelet memset_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {memset_cuda}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {memset_opencl}, #endif .cpu_funcs = {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_init(&conf); 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.1.5/tests/perfmodels/value_nan.c0000644000373600000000000000446312571536551015405 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #define STRING "booh" 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; } fprintf(f, "%lf %s\n", val, 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]; int x = _starpu_read_double(f, "%lf", &lat); int y = fscanf(f, "%s", 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 && lat == val; return pass?0:1; } int main(int argc, char **argv) { int ret; ret = _check_number(42.0, 0); FPRINTF(stderr, "%s when reading %lf\n", ret==0?"Success":"Error", 42.0); if (ret==0) { ret = _check_number(NAN, 1); FPRINTF(stderr, "%s when reading %lf\n", ret==0?"Success":"Error", NAN); } return ret; } starpu-1.1.5/tests/perfmodels/opencl_memset.c0000644000373600000000000000376612571536551016274 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include 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; cl_event event; 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(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "_memset_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err|= clSetKernelArg(kernel, 1, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &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.1.5/tests/perfmodels/valid_model.c0000644000373600000000000000776412571536551015723 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" static void func(void *descr[], void *arg) { } static struct starpu_perfmodel rb_model = { .type = STARPU_REGRESSION_BASED, .symbol = "valid_model_regression_based" }; static struct starpu_perfmodel nlrb_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "valid_model_non_linear_regression_based" }; #if 0 static struct starpu_perfmodel hb_model = { .type = STARPU_HISTORY_BASED, .symbol = "valid_model_history_based" }; #endif static struct starpu_codelet mycodelet = { .cuda_funcs = {func}, .opencl_funcs = {func}, .cpu_funcs = {func}, .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; unsigned archid; 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; ret = starpu_perfmodel_load_symbol(codelet->model->symbol, &lmodel); if (ret != 1) for (archid = 0; archid < STARPU_NARCH_VARIATIONS; archid++) old_nsamples += lmodel.per_arch[archid][0].regression.nsample; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, 100, sizeof(int)); for (loop = 0; loop < nloops; loop++) { ret = starpu_insert_task(codelet, STARPU_W, handle, 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(handle); starpu_perfmodel_unload_model(&lmodel); starpu_shutdown(); // To force dumping perf models on disk // We need to call starpu_init again to initialise values used by perfmodels ret = starpu_init(NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_perfmodel_load_symbol(codelet->model->symbol, &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; } new_nsamples = 0; for (archid = 0; archid < STARPU_NARCH_VARIATIONS; archid++) new_nsamples += lmodel.per_arch[archid][0].regression.nsample; ret = starpu_perfmodel_unload_model(&lmodel); starpu_shutdown(); if (ret == 1) { FPRINTF(stderr, "The performance model for the symbol <%s> could not be UNloaded\n", codelet->model->symbol); return 1; } if (old_nsamples + nloops == new_nsamples) { FPRINTF(stderr, "Sampling for <%s> OK %d + %d == %d\n", codelet->model->symbol, old_nsamples, nloops, new_nsamples); return EXIT_SUCCESS; } else { FPRINTF(stderr, "Sampling for <%s> failed %d + %d != %d\n", codelet->model->symbol, old_nsamples, nloops, new_nsamples); return EXIT_FAILURE; } } int main(int argc, char **argv) { int ret; /* Use a linear regression model */ ret = submit(&mycodelet, &rb_model); if (ret) return ret; /* Use a non-linear regression model */ ret = submit(&mycodelet, &nlrb_model); if (ret) return ret; #ifdef STARPU_DEVEL # warning history based model cannot be validated with regression.nsample #endif #if 0 /* Use a history model */ ret = submit(&mycodelet, &hb_model); if (ret) return ret; #endif return EXIT_SUCCESS; } starpu-1.1.5/tests/perfmodels/regression_based.c0000644000373600000000000001156012571536551016747 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2015 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" #define START 1024 #ifdef STARPU_QUICK_CHECK #define END 1048576 #else #define END 16777216 #endif #ifdef STARPU_USE_CUDA static void memset_cuda(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(ptr, 42, n * sizeof(*ptr), starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL extern void memset_opencl(void *buffers[], void *args); #endif static void memset_cpu(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; int *ptr = (int *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned n = STARPU_VECTOR_GET_NX(descr[0]); memset(ptr, 42, n * sizeof(*ptr)); } static struct starpu_perfmodel model = { .type = STARPU_REGRESSION_BASED, .symbol = "memset_regression_based" }; static struct starpu_perfmodel nl_model = { .type = STARPU_NL_REGRESSION_BASED, .symbol = "non_linear_memset_regression_based" }; static struct starpu_codelet memset_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {memset_cuda}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {memset_opencl}, #endif .cpu_funcs = {memset_cpu}, .model = &model, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet nl_memset_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {memset_cuda}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {memset_opencl}, #endif .cpu_funcs = {memset_cpu}, .model = &nl_model, .nbuffers = 1, .modes = {STARPU_W} }; static void test_memset(int nelems, struct starpu_codelet *codelet) { int nloops = 100; int loop; starpu_data_handle_t handle; starpu_vector_data_register(&handle, -1, (uintptr_t)NULL, nelems, sizeof(int)); for (loop = 0; loop < nloops; loop++) { struct starpu_task *task = starpu_task_create(); task->cl = codelet; task->handles[0] = handle; int ret = starpu_task_submit(task); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(handle); } static void show_task_perfs(int size, struct starpu_task *task) { unsigned workerid; for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) { char name[16]; starpu_worker_get_name(workerid, name, sizeof(name)); unsigned nimpl; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { FPRINTF(stdout, "Expected time for %d on %s (impl %d):\t%f\n", size, name, nimpl, starpu_task_expected_length(task, starpu_worker_get_perf_archtype(workerid), nimpl)); } } } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { struct starpu_conf conf; starpu_data_handle_t handle; int ret; starpu_conf_init(&conf); conf.sched_policy_name = "eager"; conf.calibrate = 2; ret = starpu_init(&conf); 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.1.5/tests/perfmodels/opencl_memset_kernel.cl0000644000373600000000000000141712571536551017777 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void _memset_opencl(__global int *val, int nx) { const int i = get_global_id(0); if (i < nx) val[i] = 42; } starpu-1.1.5/tests/Makefile.in0000644000373600000000000210440712571536634013201 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # Copyright (C) 2010, 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @STARPU_USE_CUDA_TRUE@am__append_1 = -I$(top_srcdir)/include/ -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_builddir)/include $(HWLOC_CFLAGS) $(SIMGRID_CFLAGS) @STARPU_COVERAGE_ENABLED_TRUE@am__append_2 = coverage/coverage.sh XFAIL_TESTS = errorcheck/invalid_blocking_calls$(EXEEXT) noinst_PROGRAMS = main/deprecated_func$(EXEEXT) \ main/deprecated_buffer$(EXEEXT) \ main/driver_api/init_run_deinit$(EXEEXT) \ main/driver_api/run_driver$(EXEEXT) main/deploop$(EXEEXT) \ main/restart$(EXEEXT) \ main/execute_on_a_specific_worker$(EXEEXT) \ main/insert_task$(EXEEXT) \ main/insert_task_nullcodelet$(EXEEXT) \ main/insert_task_array$(EXEEXT) main/multithreaded$(EXEEXT) \ main/multithreaded_init$(EXEEXT) \ main/starpu_task_bundle$(EXEEXT) \ main/starpu_task_wait_for_all$(EXEEXT) \ main/starpu_task_wait$(EXEEXT) \ main/static_restartable$(EXEEXT) \ main/static_restartable_using_initializer$(EXEEXT) \ main/static_restartable_tag$(EXEEXT) main/regenerate$(EXEEXT) \ main/regenerate_pipeline$(EXEEXT) \ main/wait_all_regenerable_tasks$(EXEEXT) \ main/subgraph_repeat$(EXEEXT) \ main/subgraph_repeat_regenerate$(EXEEXT) \ main/subgraph_repeat_regenerate_tag$(EXEEXT) \ main/empty_task$(EXEEXT) main/empty_task_sync_point$(EXEEXT) \ main/empty_task_sync_point_tasks$(EXEEXT) \ main/empty_task_chain$(EXEEXT) main/tag_wait_api$(EXEEXT) \ main/task_wait_api$(EXEEXT) \ main/declare_deps_in_callback$(EXEEXT) \ main/declare_deps_after_submission$(EXEEXT) \ main/declare_deps_after_submission_synchronous$(EXEEXT) \ main/get_current_task$(EXEEXT) main/starpu_init$(EXEEXT) \ main/starpu_worker_exists$(EXEEXT) main/submit$(EXEEXT) \ main/pause_resume$(EXEEXT) main/pack$(EXEEXT) \ datawizard/allocate$(EXEEXT) datawizard/acquire_cb$(EXEEXT) \ datawizard/acquire_cb_insert$(EXEEXT) \ datawizard/acquire_release$(EXEEXT) \ datawizard/acquire_release2$(EXEEXT) datawizard/cache$(EXEEXT) \ datawizard/copy$(EXEEXT) \ datawizard/data_implicit_deps$(EXEEXT) \ datawizard/data_lookup$(EXEEXT) datawizard/scratch$(EXEEXT) \ datawizard/sync_and_notify_data$(EXEEXT) \ datawizard/sync_and_notify_data_implicit$(EXEEXT) \ datawizard/dsm_stress$(EXEEXT) \ datawizard/double_parameter$(EXEEXT) \ datawizard/write_only_tmp_buffer$(EXEEXT) \ datawizard/data_invalidation$(EXEEXT) \ datawizard/dining_philosophers$(EXEEXT) \ datawizard/manual_reduction$(EXEEXT) \ datawizard/readers_and_writers$(EXEEXT) \ datawizard/unpartition$(EXEEXT) \ datawizard/user_interaction_implicit$(EXEEXT) \ datawizard/sync_with_data_with_mem$(EXEEXT) \ datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT) \ datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT) \ datawizard/mpi_like$(EXEEXT) \ datawizard/mpi_like_async$(EXEEXT) \ datawizard/critical_section_with_void_interface$(EXEEXT) \ datawizard/increment_init$(EXEEXT) \ datawizard/increment_redux$(EXEEXT) \ datawizard/increment_redux_v2$(EXEEXT) \ datawizard/increment_redux_lazy$(EXEEXT) \ datawizard/handle_to_pointer$(EXEEXT) \ datawizard/lazy_allocation$(EXEEXT) \ datawizard/lazy_unregister$(EXEEXT) \ datawizard/no_unregister$(EXEEXT) datawizard/nowhere$(EXEEXT) \ datawizard/interfaces/copy_interfaces$(EXEEXT) \ datawizard/interfaces/block/block_interface$(EXEEXT) \ datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) \ datawizard/interfaces/coo/coo_interface$(EXEEXT) \ datawizard/interfaces/csr/csr_interface$(EXEEXT) \ datawizard/interfaces/matrix/matrix_interface$(EXEEXT) \ datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) \ datawizard/interfaces/variable/variable_interface$(EXEEXT) \ datawizard/interfaces/vector/test_vector_interface$(EXEEXT) \ datawizard/interfaces/void/void_interface$(EXEEXT) \ datawizard/in_place_partition$(EXEEXT) \ datawizard/partition_lazy$(EXEEXT) \ datawizard/gpu_register$(EXEEXT) \ datawizard/gpu_ptr_register$(EXEEXT) \ datawizard/wt_host$(EXEEXT) datawizard/wt_broadcast$(EXEEXT) \ datawizard/readonly$(EXEEXT) datawizard/specific_node$(EXEEXT) \ datawizard/task_with_multiple_time_the_same_handle$(EXEEXT) \ errorcheck/starpu_init_noworker$(EXEEXT) \ errorcheck/invalid_blocking_calls$(EXEEXT) \ errorcheck/invalid_tasks$(EXEEXT) helper/cublas_init$(EXEEXT) \ helper/starpu_data_cpy$(EXEEXT) helper/pinned_memory$(EXEEXT) \ helper/execute_on_all$(EXEEXT) \ helper/starpu_create_sync_task$(EXEEXT) \ microbenchs/async_tasks_overhead$(EXEEXT) \ microbenchs/sync_tasks_overhead$(EXEEXT) \ microbenchs/tasks_overhead$(EXEEXT) \ microbenchs/tasks_size_overhead$(EXEEXT) \ microbenchs/prefetch_data_on_node$(EXEEXT) \ microbenchs/redundant_buffer$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) \ microbenchs/matrix_as_vector$(EXEEXT) overlap/overlap$(EXEEXT) \ parallel_tasks/explicit_combined_worker$(EXEEXT) \ parallel_tasks/parallel_kernels$(EXEEXT) \ parallel_tasks/parallel_kernels_spmd$(EXEEXT) \ parallel_tasks/spmd_peager$(EXEEXT) \ parallel_tasks/cuda_only$(EXEEXT) \ perfmodels/regression_based$(EXEEXT) \ perfmodels/non_linear_regression_based$(EXEEXT) \ perfmodels/feed$(EXEEXT) perfmodels/valid_model$(EXEEXT) \ perfmodels/value_nan$(EXEEXT) \ sched_policies/data_locality$(EXEEXT) \ sched_policies/execute_all_tasks$(EXEEXT) \ sched_policies/prio$(EXEEXT) \ sched_policies/simple_deps$(EXEEXT) \ sched_policies/simple_cpu_gpu_sched$(EXEEXT) $(am__EXEEXT_2) \ $(am__EXEEXT_3) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@am__append_3 = \ @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@ fortran90/init_01 @STARPU_LONG_CHECK_TRUE@am__append_4 = \ @STARPU_LONG_CHECK_TRUE@ main/tag_task_data_deps \ @STARPU_LONG_CHECK_TRUE@ datawizard/reclaim examplebin_PROGRAMS = microbenchs/tasks_size_overhead$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) @STARPU_HAVE_WINDOWS_FALSE@check_PROGRAMS = $(am__EXEEXT_1) \ @STARPU_HAVE_WINDOWS_FALSE@ $(am__EXEEXT_4) @STARPU_HAVE_WINDOWS_TRUE@check_PROGRAMS = $(am__EXEEXT_4) @STARPU_USE_CUDA_TRUE@am__append_5 = \ @STARPU_USE_CUDA_TRUE@ datawizard/acquire_release_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_6 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__append_7 = \ @STARPU_USE_CUDA_TRUE@ datawizard/acquire_release_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_8 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__append_9 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scratch_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_10 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scratch_opencl.c @STARPU_USE_CUDA_TRUE@am__append_11 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_12 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_13 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_14 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_15 = \ @STARPU_USE_CUDA_TRUE@ datawizard/sync_and_notify_data_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_16 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__append_17 = \ @STARPU_USE_CUDA_TRUE@ datawizard/sync_and_notify_data_kernels.cu @STARPU_USE_OPENCL_TRUE@am__append_18 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__append_19 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_20 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_21 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_22 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_23 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_24 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_25 = \ @STARPU_USE_CUDA_TRUE@ datawizard/scal_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_26 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__append_27 = \ @STARPU_USE_CUDA_TRUE@ datawizard/cuda_codelet_unsigned_inc.cu @STARPU_USE_OPENCL_TRUE@am__append_28 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__append_29 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/block/block_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_30 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/block/block_opencl.c @STARPU_USE_CUDA_TRUE@am__append_31 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/bcsr/bcsr_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_32 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/bcsr/bcsr_opencl.c @STARPU_USE_CUDA_TRUE@am__append_33 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/coo/coo_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_34 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/coo/coo_opencl.c @STARPU_USE_CUDA_TRUE@am__append_35 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/csr/csr_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_36 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/csr/csr_opencl.c @STARPU_USE_CUDA_TRUE@am__append_37 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/vector/test_vector_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_38 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/vector/test_vector_opencl.c @STARPU_USE_CUDA_TRUE@am__append_39 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/matrix/matrix_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_40 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/matrix/matrix_opencl.c @STARPU_USE_CUDA_TRUE@am__append_41 = \ @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_42 = \ @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_43 = \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/variable/variable_cuda.cu @STARPU_USE_OPENCL_TRUE@am__append_44 = \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/variable/variable_opencl.c @STARPU_USE_OPENCL_TRUE@am__append_45 = \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset.c @STARPU_USE_OPENCL_TRUE@am__append_46 = \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset.c subdir = tests DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @STARPU_HAVE_WINDOWS_FALSE@am__EXEEXT_1 = loader$(EXEEXT) @STARPU_HAVE_FC_TRUE@@STARPU_SANITIZE_FALSE@am__EXEEXT_2 = fortran90/init_01$(EXEEXT) @STARPU_LONG_CHECK_TRUE@am__EXEEXT_3 = \ @STARPU_LONG_CHECK_TRUE@ main/tag_task_data_deps$(EXEEXT) \ @STARPU_LONG_CHECK_TRUE@ datawizard/reclaim$(EXEEXT) am__EXEEXT_4 = main/deprecated_func$(EXEEXT) \ main/deprecated_buffer$(EXEEXT) \ main/driver_api/init_run_deinit$(EXEEXT) \ main/driver_api/run_driver$(EXEEXT) main/deploop$(EXEEXT) \ main/restart$(EXEEXT) \ main/execute_on_a_specific_worker$(EXEEXT) \ main/insert_task$(EXEEXT) \ main/insert_task_nullcodelet$(EXEEXT) \ main/insert_task_array$(EXEEXT) main/multithreaded$(EXEEXT) \ main/multithreaded_init$(EXEEXT) \ main/starpu_task_bundle$(EXEEXT) \ main/starpu_task_wait_for_all$(EXEEXT) \ main/starpu_task_wait$(EXEEXT) \ main/static_restartable$(EXEEXT) \ main/static_restartable_using_initializer$(EXEEXT) \ main/static_restartable_tag$(EXEEXT) main/regenerate$(EXEEXT) \ main/regenerate_pipeline$(EXEEXT) \ main/wait_all_regenerable_tasks$(EXEEXT) \ main/subgraph_repeat$(EXEEXT) \ main/subgraph_repeat_regenerate$(EXEEXT) \ main/subgraph_repeat_regenerate_tag$(EXEEXT) \ main/empty_task$(EXEEXT) main/empty_task_sync_point$(EXEEXT) \ main/empty_task_sync_point_tasks$(EXEEXT) \ main/empty_task_chain$(EXEEXT) main/tag_wait_api$(EXEEXT) \ main/task_wait_api$(EXEEXT) \ main/declare_deps_in_callback$(EXEEXT) \ main/declare_deps_after_submission$(EXEEXT) \ main/declare_deps_after_submission_synchronous$(EXEEXT) \ main/get_current_task$(EXEEXT) main/starpu_init$(EXEEXT) \ main/starpu_worker_exists$(EXEEXT) main/submit$(EXEEXT) \ main/pause_resume$(EXEEXT) main/pack$(EXEEXT) \ datawizard/allocate$(EXEEXT) datawizard/acquire_cb$(EXEEXT) \ datawizard/acquire_cb_insert$(EXEEXT) \ datawizard/acquire_release$(EXEEXT) \ datawizard/acquire_release2$(EXEEXT) datawizard/cache$(EXEEXT) \ datawizard/copy$(EXEEXT) \ datawizard/data_implicit_deps$(EXEEXT) \ datawizard/data_lookup$(EXEEXT) datawizard/scratch$(EXEEXT) \ datawizard/sync_and_notify_data$(EXEEXT) \ datawizard/sync_and_notify_data_implicit$(EXEEXT) \ datawizard/dsm_stress$(EXEEXT) \ datawizard/double_parameter$(EXEEXT) \ datawizard/write_only_tmp_buffer$(EXEEXT) \ datawizard/data_invalidation$(EXEEXT) \ datawizard/dining_philosophers$(EXEEXT) \ datawizard/manual_reduction$(EXEEXT) \ datawizard/readers_and_writers$(EXEEXT) \ datawizard/unpartition$(EXEEXT) \ datawizard/user_interaction_implicit$(EXEEXT) \ datawizard/sync_with_data_with_mem$(EXEEXT) \ datawizard/sync_with_data_with_mem_non_blocking$(EXEEXT) \ datawizard/sync_with_data_with_mem_non_blocking_implicit$(EXEEXT) \ datawizard/mpi_like$(EXEEXT) \ datawizard/mpi_like_async$(EXEEXT) \ datawizard/critical_section_with_void_interface$(EXEEXT) \ datawizard/increment_init$(EXEEXT) \ datawizard/increment_redux$(EXEEXT) \ datawizard/increment_redux_v2$(EXEEXT) \ datawizard/increment_redux_lazy$(EXEEXT) \ datawizard/handle_to_pointer$(EXEEXT) \ datawizard/lazy_allocation$(EXEEXT) \ datawizard/lazy_unregister$(EXEEXT) \ datawizard/no_unregister$(EXEEXT) datawizard/nowhere$(EXEEXT) \ datawizard/interfaces/copy_interfaces$(EXEEXT) \ datawizard/interfaces/block/block_interface$(EXEEXT) \ datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) \ datawizard/interfaces/coo/coo_interface$(EXEEXT) \ datawizard/interfaces/csr/csr_interface$(EXEEXT) \ datawizard/interfaces/matrix/matrix_interface$(EXEEXT) \ datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) \ datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) \ datawizard/interfaces/variable/variable_interface$(EXEEXT) \ datawizard/interfaces/vector/test_vector_interface$(EXEEXT) \ datawizard/interfaces/void/void_interface$(EXEEXT) \ datawizard/in_place_partition$(EXEEXT) \ datawizard/partition_lazy$(EXEEXT) \ datawizard/gpu_register$(EXEEXT) \ datawizard/gpu_ptr_register$(EXEEXT) \ datawizard/wt_host$(EXEEXT) datawizard/wt_broadcast$(EXEEXT) \ datawizard/readonly$(EXEEXT) datawizard/specific_node$(EXEEXT) \ datawizard/task_with_multiple_time_the_same_handle$(EXEEXT) \ errorcheck/starpu_init_noworker$(EXEEXT) \ errorcheck/invalid_blocking_calls$(EXEEXT) \ errorcheck/invalid_tasks$(EXEEXT) helper/cublas_init$(EXEEXT) \ helper/starpu_data_cpy$(EXEEXT) helper/pinned_memory$(EXEEXT) \ helper/execute_on_all$(EXEEXT) \ helper/starpu_create_sync_task$(EXEEXT) \ microbenchs/async_tasks_overhead$(EXEEXT) \ microbenchs/sync_tasks_overhead$(EXEEXT) \ microbenchs/tasks_overhead$(EXEEXT) \ microbenchs/tasks_size_overhead$(EXEEXT) \ microbenchs/prefetch_data_on_node$(EXEEXT) \ microbenchs/redundant_buffer$(EXEEXT) \ microbenchs/local_pingpong$(EXEEXT) \ microbenchs/matrix_as_vector$(EXEEXT) overlap/overlap$(EXEEXT) \ parallel_tasks/explicit_combined_worker$(EXEEXT) \ parallel_tasks/parallel_kernels$(EXEEXT) \ parallel_tasks/parallel_kernels_spmd$(EXEEXT) \ parallel_tasks/spmd_peager$(EXEEXT) \ parallel_tasks/cuda_only$(EXEEXT) \ perfmodels/regression_based$(EXEEXT) \ perfmodels/non_linear_regression_based$(EXEEXT) \ perfmodels/feed$(EXEEXT) perfmodels/valid_model$(EXEEXT) \ perfmodels/value_nan$(EXEEXT) \ sched_policies/data_locality$(EXEEXT) \ sched_policies/execute_all_tasks$(EXEEXT) \ sched_policies/prio$(EXEEXT) \ sched_policies/simple_deps$(EXEEXT) \ sched_policies/simple_cpu_gpu_sched$(EXEEXT) $(am__EXEEXT_2) \ $(am__EXEEXT_3) am__installdirs = "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(examplebindir)" \ "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" PROGRAMS = $(examplebin_PROGRAMS) $(noinst_PROGRAMS) datawizard_acquire_cb_SOURCES = datawizard/acquire_cb.c datawizard_acquire_cb_OBJECTS = acquire_cb.$(OBJEXT) datawizard_acquire_cb_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__dirstamp = $(am__leading_dot)dirstamp datawizard_acquire_cb_insert_SOURCES = datawizard/acquire_cb_insert.c datawizard_acquire_cb_insert_OBJECTS = acquire_cb_insert.$(OBJEXT) datawizard_acquire_cb_insert_LDADD = $(LDADD) am__datawizard_acquire_release_SOURCES_DIST = \ datawizard/acquire_release.c \ datawizard/acquire_release_cuda.cu \ datawizard/acquire_release_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_1 = datawizard/acquire_release_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_2 = \ @STARPU_USE_OPENCL_TRUE@ acquire_release_opencl.$(OBJEXT) am_datawizard_acquire_release_OBJECTS = acquire_release.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) datawizard_acquire_release_OBJECTS = \ $(am_datawizard_acquire_release_OBJECTS) datawizard_acquire_release_LDADD = $(LDADD) am__datawizard_acquire_release2_SOURCES_DIST = \ datawizard/acquire_release2.c \ datawizard/acquire_release_cuda.cu \ datawizard/acquire_release_opencl.c am_datawizard_acquire_release2_OBJECTS = acquire_release2.$(OBJEXT) \ $(am__objects_1) $(am__objects_2) datawizard_acquire_release2_OBJECTS = \ $(am_datawizard_acquire_release2_OBJECTS) datawizard_acquire_release2_LDADD = $(LDADD) datawizard_allocate_SOURCES = datawizard/allocate.c datawizard_allocate_OBJECTS = allocate.$(OBJEXT) datawizard_allocate_LDADD = $(LDADD) datawizard_cache_SOURCES = datawizard/cache.c datawizard_cache_OBJECTS = cache.$(OBJEXT) datawizard_cache_LDADD = $(LDADD) datawizard_copy_SOURCES = datawizard/copy.c datawizard_copy_OBJECTS = copy.$(OBJEXT) datawizard_copy_LDADD = $(LDADD) datawizard_critical_section_with_void_interface_SOURCES = \ datawizard/critical_section_with_void_interface.c datawizard_critical_section_with_void_interface_OBJECTS = \ critical_section_with_void_interface.$(OBJEXT) datawizard_critical_section_with_void_interface_LDADD = $(LDADD) datawizard_data_implicit_deps_SOURCES = \ datawizard/data_implicit_deps.c datawizard_data_implicit_deps_OBJECTS = data_implicit_deps.$(OBJEXT) datawizard_data_implicit_deps_LDADD = $(LDADD) datawizard_data_invalidation_SOURCES = datawizard/data_invalidation.c datawizard_data_invalidation_OBJECTS = data_invalidation.$(OBJEXT) datawizard_data_invalidation_LDADD = $(LDADD) datawizard_data_lookup_SOURCES = datawizard/data_lookup.c datawizard_data_lookup_OBJECTS = data_lookup.$(OBJEXT) datawizard_data_lookup_LDADD = $(LDADD) datawizard_dining_philosophers_SOURCES = \ datawizard/dining_philosophers.c datawizard_dining_philosophers_OBJECTS = \ dining_philosophers.$(OBJEXT) datawizard_dining_philosophers_LDADD = $(LDADD) datawizard_double_parameter_SOURCES = datawizard/double_parameter.c datawizard_double_parameter_OBJECTS = double_parameter.$(OBJEXT) datawizard_double_parameter_LDADD = $(LDADD) datawizard_dsm_stress_SOURCES = datawizard/dsm_stress.c datawizard_dsm_stress_OBJECTS = dsm_stress.$(OBJEXT) datawizard_dsm_stress_LDADD = $(LDADD) am__datawizard_gpu_ptr_register_SOURCES_DIST = \ datawizard/gpu_ptr_register.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl @STARPU_USE_CUDA_TRUE@am__objects_3 = datawizard/scal_cuda.$(OBJEXT) am__objects_4 = am_datawizard_gpu_ptr_register_OBJECTS = gpu_ptr_register.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_gpu_ptr_register_OBJECTS = \ $(am_datawizard_gpu_ptr_register_OBJECTS) datawizard_gpu_ptr_register_LDADD = $(LDADD) am__datawizard_gpu_register_SOURCES_DIST = datawizard/gpu_register.c \ datawizard/scal.c datawizard/scal_cuda.cu \ datawizard/scal_opencl.cl am_datawizard_gpu_register_OBJECTS = gpu_register.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_gpu_register_OBJECTS = \ $(am_datawizard_gpu_register_OBJECTS) datawizard_gpu_register_LDADD = $(LDADD) datawizard_handle_to_pointer_SOURCES = datawizard/handle_to_pointer.c datawizard_handle_to_pointer_OBJECTS = handle_to_pointer.$(OBJEXT) datawizard_handle_to_pointer_LDADD = $(LDADD) am__datawizard_in_place_partition_SOURCES_DIST = \ datawizard/in_place_partition.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl am_datawizard_in_place_partition_OBJECTS = \ in_place_partition.$(OBJEXT) scal.$(OBJEXT) $(am__objects_3) \ $(am__objects_4) datawizard_in_place_partition_OBJECTS = \ $(am_datawizard_in_place_partition_OBJECTS) datawizard_in_place_partition_LDADD = $(LDADD) datawizard_increment_init_SOURCES = datawizard/increment_init.c datawizard_increment_init_OBJECTS = increment_init.$(OBJEXT) datawizard_increment_init_LDADD = $(LDADD) datawizard_increment_redux_SOURCES = datawizard/increment_redux.c datawizard_increment_redux_OBJECTS = increment_redux.$(OBJEXT) datawizard_increment_redux_LDADD = $(LDADD) datawizard_increment_redux_lazy_SOURCES = \ datawizard/increment_redux_lazy.c datawizard_increment_redux_lazy_OBJECTS = \ increment_redux_lazy.$(OBJEXT) datawizard_increment_redux_lazy_LDADD = $(LDADD) datawizard_increment_redux_v2_SOURCES = \ datawizard/increment_redux_v2.c datawizard_increment_redux_v2_OBJECTS = increment_redux_v2.$(OBJEXT) datawizard_increment_redux_v2_LDADD = $(LDADD) am__datawizard_interfaces_bcsr_bcsr_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c \ datawizard/interfaces/bcsr/bcsr_cuda.cu \ datawizard/interfaces/bcsr/bcsr_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_5 = datawizard/interfaces/bcsr/bcsr_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_6 = bcsr_opencl.$(OBJEXT) am_datawizard_interfaces_bcsr_bcsr_interface_OBJECTS = \ test_interfaces.$(OBJEXT) bcsr_interface.$(OBJEXT) \ $(am__objects_5) $(am__objects_6) datawizard_interfaces_bcsr_bcsr_interface_OBJECTS = \ $(am_datawizard_interfaces_bcsr_bcsr_interface_OBJECTS) datawizard_interfaces_bcsr_bcsr_interface_LDADD = $(LDADD) am__datawizard_interfaces_block_block_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/block/block_interface.c \ datawizard/interfaces/block/block_cuda.cu \ datawizard/interfaces/block/block_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_7 = datawizard/interfaces/block/block_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_8 = block_opencl.$(OBJEXT) am_datawizard_interfaces_block_block_interface_OBJECTS = \ test_interfaces.$(OBJEXT) block_interface.$(OBJEXT) \ $(am__objects_7) $(am__objects_8) datawizard_interfaces_block_block_interface_OBJECTS = \ $(am_datawizard_interfaces_block_block_interface_OBJECTS) datawizard_interfaces_block_block_interface_LDADD = $(LDADD) am__datawizard_interfaces_coo_coo_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c \ datawizard/interfaces/coo/coo_cuda.cu \ datawizard/interfaces/coo/coo_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_9 = datawizard/interfaces/coo/coo_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_10 = coo_opencl.$(OBJEXT) am_datawizard_interfaces_coo_coo_interface_OBJECTS = \ test_interfaces.$(OBJEXT) coo_interface.$(OBJEXT) \ $(am__objects_9) $(am__objects_10) datawizard_interfaces_coo_coo_interface_OBJECTS = \ $(am_datawizard_interfaces_coo_coo_interface_OBJECTS) datawizard_interfaces_coo_coo_interface_LDADD = $(LDADD) datawizard_interfaces_copy_interfaces_SOURCES = \ datawizard/interfaces/copy_interfaces.c datawizard_interfaces_copy_interfaces_OBJECTS = \ copy_interfaces.$(OBJEXT) datawizard_interfaces_copy_interfaces_LDADD = $(LDADD) am__datawizard_interfaces_csr_csr_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c \ datawizard/interfaces/csr/csr_cuda.cu \ datawizard/interfaces/csr/csr_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_11 = datawizard/interfaces/csr/csr_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_12 = csr_opencl.$(OBJEXT) am_datawizard_interfaces_csr_csr_interface_OBJECTS = \ test_interfaces.$(OBJEXT) csr_interface.$(OBJEXT) \ $(am__objects_11) $(am__objects_12) datawizard_interfaces_csr_csr_interface_OBJECTS = \ $(am_datawizard_interfaces_csr_csr_interface_OBJECTS) datawizard_interfaces_csr_csr_interface_LDADD = $(LDADD) am__datawizard_interfaces_matrix_matrix_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c \ datawizard/interfaces/matrix/matrix_cuda.cu \ datawizard/interfaces/matrix/matrix_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_13 = datawizard/interfaces/matrix/matrix_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_14 = matrix_opencl.$(OBJEXT) am_datawizard_interfaces_matrix_matrix_interface_OBJECTS = \ test_interfaces.$(OBJEXT) matrix_interface.$(OBJEXT) \ $(am__objects_13) $(am__objects_14) datawizard_interfaces_matrix_matrix_interface_OBJECTS = \ $(am_datawizard_interfaces_matrix_matrix_interface_OBJECTS) datawizard_interfaces_matrix_matrix_interface_LDADD = $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS = \ generic.$(OBJEXT) multiformat_cuda_opencl.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS = \ generic.$(OBJEXT) multiformat_data_release.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_data_release_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS = \ generic.$(OBJEXT) multiformat_handle_conversion.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS = \ generic.$(OBJEXT) multiformat_worker.$(OBJEXT) datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS) datawizard_interfaces_multiformat_advanced_multiformat_worker_LDADD = \ $(LDADD) am_datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS = \ generic.$(OBJEXT) same_handle.$(OBJEXT) datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS = $(am_datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS) datawizard_interfaces_multiformat_advanced_same_handle_LDADD = \ $(LDADD) am__datawizard_interfaces_multiformat_multiformat_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/multiformat/multiformat_interface.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets.c \ datawizard/interfaces/multiformat/multiformat_cuda.cu \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu \ datawizard/interfaces/multiformat/multiformat_opencl.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_15 = datawizard/interfaces/multiformat/multiformat_cuda.$(OBJEXT) \ @STARPU_USE_CUDA_TRUE@ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_16 = multiformat_opencl.$(OBJEXT) \ @STARPU_USE_OPENCL_TRUE@ multiformat_conversion_codelets_opencl.$(OBJEXT) am_datawizard_interfaces_multiformat_multiformat_interface_OBJECTS = \ test_interfaces.$(OBJEXT) multiformat_interface.$(OBJEXT) \ multiformat_conversion_codelets.$(OBJEXT) $(am__objects_15) \ $(am__objects_16) datawizard_interfaces_multiformat_multiformat_interface_OBJECTS = $(am_datawizard_interfaces_multiformat_multiformat_interface_OBJECTS) datawizard_interfaces_multiformat_multiformat_interface_LDADD = \ $(LDADD) am__datawizard_interfaces_variable_variable_interface_SOURCES_DIST = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/variable/variable_interface.c \ datawizard/interfaces/variable/variable_cuda.cu \ datawizard/interfaces/variable/variable_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_17 = datawizard/interfaces/variable/variable_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_18 = variable_opencl.$(OBJEXT) am_datawizard_interfaces_variable_variable_interface_OBJECTS = \ test_interfaces.$(OBJEXT) variable_interface.$(OBJEXT) \ $(am__objects_17) $(am__objects_18) datawizard_interfaces_variable_variable_interface_OBJECTS = $(am_datawizard_interfaces_variable_variable_interface_OBJECTS) datawizard_interfaces_variable_variable_interface_LDADD = $(LDADD) am__datawizard_interfaces_vector_test_vector_interface_SOURCES_DIST = \ datawizard/interfaces/vector/test_vector_interface.c \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/vector/test_vector_cuda.cu \ datawizard/interfaces/vector/test_vector_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_19 = datawizard/interfaces/vector/test_vector_cuda.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_20 = test_vector_opencl.$(OBJEXT) am_datawizard_interfaces_vector_test_vector_interface_OBJECTS = \ test_vector_interface.$(OBJEXT) test_interfaces.$(OBJEXT) \ $(am__objects_19) $(am__objects_20) datawizard_interfaces_vector_test_vector_interface_OBJECTS = $(am_datawizard_interfaces_vector_test_vector_interface_OBJECTS) datawizard_interfaces_vector_test_vector_interface_LDADD = $(LDADD) am_datawizard_interfaces_void_void_interface_OBJECTS = \ test_interfaces.$(OBJEXT) void_interface.$(OBJEXT) datawizard_interfaces_void_void_interface_OBJECTS = \ $(am_datawizard_interfaces_void_void_interface_OBJECTS) datawizard_interfaces_void_void_interface_LDADD = $(LDADD) datawizard_lazy_allocation_SOURCES = datawizard/lazy_allocation.c datawizard_lazy_allocation_OBJECTS = lazy_allocation.$(OBJEXT) datawizard_lazy_allocation_LDADD = $(LDADD) datawizard_lazy_unregister_SOURCES = datawizard/lazy_unregister.c datawizard_lazy_unregister_OBJECTS = lazy_unregister.$(OBJEXT) datawizard_lazy_unregister_LDADD = $(LDADD) datawizard_manual_reduction_SOURCES = datawizard/manual_reduction.c datawizard_manual_reduction_OBJECTS = manual_reduction.$(OBJEXT) datawizard_manual_reduction_LDADD = $(LDADD) am__datawizard_mpi_like_SOURCES_DIST = datawizard/mpi_like.c \ datawizard/cuda_codelet_unsigned_inc.cu \ datawizard/opencl_codelet_unsigned_inc.c @STARPU_USE_CUDA_TRUE@am__objects_21 = datawizard/cuda_codelet_unsigned_inc.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_22 = \ @STARPU_USE_OPENCL_TRUE@ opencl_codelet_unsigned_inc.$(OBJEXT) am_datawizard_mpi_like_OBJECTS = mpi_like.$(OBJEXT) $(am__objects_21) \ $(am__objects_22) datawizard_mpi_like_OBJECTS = $(am_datawizard_mpi_like_OBJECTS) datawizard_mpi_like_LDADD = $(LDADD) am__datawizard_mpi_like_async_SOURCES_DIST = \ datawizard/mpi_like_async.c \ datawizard/cuda_codelet_unsigned_inc.cu \ datawizard/opencl_codelet_unsigned_inc.c am_datawizard_mpi_like_async_OBJECTS = mpi_like_async.$(OBJEXT) \ $(am__objects_21) $(am__objects_22) datawizard_mpi_like_async_OBJECTS = \ $(am_datawizard_mpi_like_async_OBJECTS) datawizard_mpi_like_async_LDADD = $(LDADD) datawizard_no_unregister_SOURCES = datawizard/no_unregister.c datawizard_no_unregister_OBJECTS = no_unregister.$(OBJEXT) datawizard_no_unregister_LDADD = $(LDADD) datawizard_nowhere_SOURCES = datawizard/nowhere.c datawizard_nowhere_OBJECTS = nowhere.$(OBJEXT) datawizard_nowhere_LDADD = $(LDADD) am__datawizard_partition_lazy_SOURCES_DIST = \ datawizard/partition_lazy.c datawizard/scal.c \ datawizard/scal_cuda.cu datawizard/scal_opencl.cl am_datawizard_partition_lazy_OBJECTS = partition_lazy.$(OBJEXT) \ scal.$(OBJEXT) $(am__objects_3) $(am__objects_4) datawizard_partition_lazy_OBJECTS = \ $(am_datawizard_partition_lazy_OBJECTS) datawizard_partition_lazy_LDADD = $(LDADD) datawizard_readers_and_writers_SOURCES = \ datawizard/readers_and_writers.c datawizard_readers_and_writers_OBJECTS = \ readers_and_writers.$(OBJEXT) datawizard_readers_and_writers_LDADD = $(LDADD) datawizard_readonly_SOURCES = datawizard/readonly.c datawizard_readonly_OBJECTS = readonly.$(OBJEXT) datawizard_readonly_LDADD = $(LDADD) datawizard_reclaim_SOURCES = datawizard/reclaim.c datawizard_reclaim_OBJECTS = reclaim.$(OBJEXT) datawizard_reclaim_LDADD = $(LDADD) 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) am__datawizard_specific_node_SOURCES_DIST = \ datawizard/specific_node.c \ datawizard/cuda_codelet_unsigned_inc.cu \ datawizard/opencl_codelet_unsigned_inc.c am_datawizard_specific_node_OBJECTS = specific_node.$(OBJEXT) \ $(am__objects_21) $(am__objects_22) datawizard_specific_node_OBJECTS = \ $(am_datawizard_specific_node_OBJECTS) datawizard_specific_node_LDADD = $(LDADD) am__datawizard_sync_and_notify_data_SOURCES_DIST = \ datawizard/sync_and_notify_data.c \ datawizard/sync_and_notify_data_kernels.cu \ datawizard/sync_and_notify_data_opencl.c @STARPU_USE_CUDA_TRUE@am__objects_25 = datawizard/sync_and_notify_data_kernels.$(OBJEXT) @STARPU_USE_OPENCL_TRUE@am__objects_26 = \ @STARPU_USE_OPENCL_TRUE@ sync_and_notify_data_opencl.$(OBJEXT) am_datawizard_sync_and_notify_data_OBJECTS = \ sync_and_notify_data.$(OBJEXT) $(am__objects_25) \ $(am__objects_26) datawizard_sync_and_notify_data_OBJECTS = \ $(am_datawizard_sync_and_notify_data_OBJECTS) datawizard_sync_and_notify_data_LDADD = $(LDADD) am__datawizard_sync_and_notify_data_implicit_SOURCES_DIST = \ datawizard/sync_and_notify_data_implicit.c \ datawizard/sync_and_notify_data_kernels.cu \ datawizard/sync_and_notify_data_opencl.c am_datawizard_sync_and_notify_data_implicit_OBJECTS = \ sync_and_notify_data_implicit.$(OBJEXT) $(am__objects_25) \ $(am__objects_26) datawizard_sync_and_notify_data_implicit_OBJECTS = \ $(am_datawizard_sync_and_notify_data_implicit_OBJECTS) datawizard_sync_and_notify_data_implicit_LDADD = $(LDADD) datawizard_sync_with_data_with_mem_SOURCES = \ datawizard/sync_with_data_with_mem.c datawizard_sync_with_data_with_mem_OBJECTS = \ sync_with_data_with_mem.$(OBJEXT) datawizard_sync_with_data_with_mem_LDADD = $(LDADD) datawizard_sync_with_data_with_mem_non_blocking_SOURCES = \ datawizard/sync_with_data_with_mem_non_blocking.c datawizard_sync_with_data_with_mem_non_blocking_OBJECTS = \ sync_with_data_with_mem_non_blocking.$(OBJEXT) datawizard_sync_with_data_with_mem_non_blocking_LDADD = $(LDADD) datawizard_sync_with_data_with_mem_non_blocking_implicit_SOURCES = \ datawizard/sync_with_data_with_mem_non_blocking_implicit.c datawizard_sync_with_data_with_mem_non_blocking_implicit_OBJECTS = \ sync_with_data_with_mem_non_blocking_implicit.$(OBJEXT) datawizard_sync_with_data_with_mem_non_blocking_implicit_LDADD = \ $(LDADD) datawizard_task_with_multiple_time_the_same_handle_SOURCES = \ datawizard/task_with_multiple_time_the_same_handle.c datawizard_task_with_multiple_time_the_same_handle_OBJECTS = \ task_with_multiple_time_the_same_handle.$(OBJEXT) datawizard_task_with_multiple_time_the_same_handle_LDADD = $(LDADD) datawizard_unpartition_SOURCES = datawizard/unpartition.c datawizard_unpartition_OBJECTS = unpartition.$(OBJEXT) datawizard_unpartition_LDADD = $(LDADD) datawizard_user_interaction_implicit_SOURCES = \ datawizard/user_interaction_implicit.c datawizard_user_interaction_implicit_OBJECTS = \ user_interaction_implicit.$(OBJEXT) datawizard_user_interaction_implicit_LDADD = $(LDADD) datawizard_write_only_tmp_buffer_SOURCES = \ datawizard/write_only_tmp_buffer.c datawizard_write_only_tmp_buffer_OBJECTS = \ write_only_tmp_buffer.$(OBJEXT) datawizard_write_only_tmp_buffer_LDADD = $(LDADD) am_datawizard_wt_broadcast_OBJECTS = wt_broadcast.$(OBJEXT) datawizard_wt_broadcast_OBJECTS = \ $(am_datawizard_wt_broadcast_OBJECTS) datawizard_wt_broadcast_LDADD = $(LDADD) am_datawizard_wt_host_OBJECTS = wt_host.$(OBJEXT) datawizard_wt_host_OBJECTS = $(am_datawizard_wt_host_OBJECTS) datawizard_wt_host_LDADD = $(LDADD) errorcheck_invalid_blocking_calls_SOURCES = \ errorcheck/invalid_blocking_calls.c errorcheck_invalid_blocking_calls_OBJECTS = \ invalid_blocking_calls.$(OBJEXT) errorcheck_invalid_blocking_calls_LDADD = $(LDADD) errorcheck_invalid_tasks_SOURCES = errorcheck/invalid_tasks.c errorcheck_invalid_tasks_OBJECTS = invalid_tasks.$(OBJEXT) errorcheck_invalid_tasks_LDADD = $(LDADD) errorcheck_starpu_init_noworker_SOURCES = \ errorcheck/starpu_init_noworker.c errorcheck_starpu_init_noworker_OBJECTS = \ starpu_init_noworker.$(OBJEXT) errorcheck_starpu_init_noworker_LDADD = $(LDADD) am__fortran90_init_01_SOURCES_DIST = \ $(top_srcdir)/include/starpu_mod.f90 fortran90/init_01.f90 @STARPU_HAVE_FC_TRUE@am_fortran90_init_01_OBJECTS = \ @STARPU_HAVE_FC_TRUE@ starpu_mod.$(OBJEXT) init_01.$(OBJEXT) fortran90_init_01_OBJECTS = $(am_fortran90_init_01_OBJECTS) fortran90_init_01_LDADD = $(LDADD) helper_cublas_init_SOURCES = helper/cublas_init.c helper_cublas_init_OBJECTS = cublas_init.$(OBJEXT) helper_cublas_init_LDADD = $(LDADD) helper_execute_on_all_SOURCES = helper/execute_on_all.c helper_execute_on_all_OBJECTS = execute_on_all.$(OBJEXT) helper_execute_on_all_LDADD = $(LDADD) helper_pinned_memory_SOURCES = helper/pinned_memory.c helper_pinned_memory_OBJECTS = pinned_memory.$(OBJEXT) helper_pinned_memory_LDADD = $(LDADD) helper_starpu_create_sync_task_SOURCES = \ helper/starpu_create_sync_task.c helper_starpu_create_sync_task_OBJECTS = \ starpu_create_sync_task.$(OBJEXT) helper_starpu_create_sync_task_LDADD = $(LDADD) helper_starpu_data_cpy_SOURCES = helper/starpu_data_cpy.c helper_starpu_data_cpy_OBJECTS = starpu_data_cpy.$(OBJEXT) helper_starpu_data_cpy_LDADD = $(LDADD) loader_SOURCES = loader.c loader_OBJECTS = loader.$(OBJEXT) loader_LDADD = $(LDADD) main_declare_deps_after_submission_SOURCES = \ main/declare_deps_after_submission.c main_declare_deps_after_submission_OBJECTS = \ declare_deps_after_submission.$(OBJEXT) main_declare_deps_after_submission_LDADD = $(LDADD) main_declare_deps_after_submission_synchronous_SOURCES = \ main/declare_deps_after_submission_synchronous.c main_declare_deps_after_submission_synchronous_OBJECTS = \ declare_deps_after_submission_synchronous.$(OBJEXT) main_declare_deps_after_submission_synchronous_LDADD = $(LDADD) main_declare_deps_in_callback_SOURCES = \ main/declare_deps_in_callback.c main_declare_deps_in_callback_OBJECTS = \ declare_deps_in_callback.$(OBJEXT) main_declare_deps_in_callback_LDADD = $(LDADD) main_deploop_SOURCES = main/deploop.c main_deploop_OBJECTS = deploop.$(OBJEXT) main_deploop_LDADD = $(LDADD) main_deprecated_buffer_SOURCES = main/deprecated_buffer.c main_deprecated_buffer_OBJECTS = \ main_deprecated_buffer-deprecated_buffer.$(OBJEXT) main_deprecated_buffer_LDADD = $(LDADD) main_deprecated_buffer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(main_deprecated_buffer_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ main_deprecated_func_SOURCES = main/deprecated_func.c main_deprecated_func_OBJECTS = \ main_deprecated_func-deprecated_func.$(OBJEXT) main_deprecated_func_LDADD = $(LDADD) main_deprecated_func_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(main_deprecated_func_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ main_driver_api_init_run_deinit_SOURCES = \ main/driver_api/init_run_deinit.c main_driver_api_init_run_deinit_OBJECTS = init_run_deinit.$(OBJEXT) main_driver_api_init_run_deinit_LDADD = $(LDADD) main_driver_api_run_driver_SOURCES = main/driver_api/run_driver.c main_driver_api_run_driver_OBJECTS = run_driver.$(OBJEXT) main_driver_api_run_driver_LDADD = $(LDADD) main_empty_task_SOURCES = main/empty_task.c main_empty_task_OBJECTS = empty_task.$(OBJEXT) main_empty_task_LDADD = $(LDADD) main_empty_task_chain_SOURCES = main/empty_task_chain.c main_empty_task_chain_OBJECTS = empty_task_chain.$(OBJEXT) main_empty_task_chain_LDADD = $(LDADD) main_empty_task_sync_point_SOURCES = main/empty_task_sync_point.c main_empty_task_sync_point_OBJECTS = empty_task_sync_point.$(OBJEXT) main_empty_task_sync_point_LDADD = $(LDADD) main_empty_task_sync_point_tasks_SOURCES = \ main/empty_task_sync_point_tasks.c main_empty_task_sync_point_tasks_OBJECTS = \ empty_task_sync_point_tasks.$(OBJEXT) main_empty_task_sync_point_tasks_LDADD = $(LDADD) main_execute_on_a_specific_worker_SOURCES = \ main/execute_on_a_specific_worker.c main_execute_on_a_specific_worker_OBJECTS = \ execute_on_a_specific_worker.$(OBJEXT) main_execute_on_a_specific_worker_LDADD = $(LDADD) main_get_current_task_SOURCES = main/get_current_task.c main_get_current_task_OBJECTS = get_current_task.$(OBJEXT) main_get_current_task_LDADD = $(LDADD) main_insert_task_SOURCES = main/insert_task.c main_insert_task_OBJECTS = insert_task.$(OBJEXT) main_insert_task_LDADD = $(LDADD) main_insert_task_array_SOURCES = main/insert_task_array.c main_insert_task_array_OBJECTS = insert_task_array.$(OBJEXT) main_insert_task_array_LDADD = $(LDADD) main_insert_task_nullcodelet_SOURCES = main/insert_task_nullcodelet.c main_insert_task_nullcodelet_OBJECTS = \ insert_task_nullcodelet.$(OBJEXT) main_insert_task_nullcodelet_LDADD = $(LDADD) main_multithreaded_SOURCES = main/multithreaded.c main_multithreaded_OBJECTS = multithreaded.$(OBJEXT) main_multithreaded_LDADD = $(LDADD) main_multithreaded_init_SOURCES = main/multithreaded_init.c main_multithreaded_init_OBJECTS = multithreaded_init.$(OBJEXT) main_multithreaded_init_LDADD = $(LDADD) main_pack_SOURCES = main/pack.c main_pack_OBJECTS = pack.$(OBJEXT) main_pack_LDADD = $(LDADD) main_pause_resume_SOURCES = main/pause_resume.c main_pause_resume_OBJECTS = pause_resume.$(OBJEXT) main_pause_resume_LDADD = $(LDADD) main_regenerate_SOURCES = main/regenerate.c main_regenerate_OBJECTS = regenerate.$(OBJEXT) main_regenerate_LDADD = $(LDADD) main_regenerate_pipeline_SOURCES = main/regenerate_pipeline.c main_regenerate_pipeline_OBJECTS = regenerate_pipeline.$(OBJEXT) main_regenerate_pipeline_LDADD = $(LDADD) main_restart_SOURCES = main/restart.c main_restart_OBJECTS = restart.$(OBJEXT) main_restart_LDADD = $(LDADD) main_starpu_init_SOURCES = main/starpu_init.c main_starpu_init_OBJECTS = starpu_init.$(OBJEXT) main_starpu_init_LDADD = $(LDADD) main_starpu_task_bundle_SOURCES = main/starpu_task_bundle.c main_starpu_task_bundle_OBJECTS = starpu_task_bundle.$(OBJEXT) main_starpu_task_bundle_LDADD = $(LDADD) main_starpu_task_wait_SOURCES = main/starpu_task_wait.c main_starpu_task_wait_OBJECTS = starpu_task_wait.$(OBJEXT) main_starpu_task_wait_LDADD = $(LDADD) main_starpu_task_wait_for_all_SOURCES = \ main/starpu_task_wait_for_all.c main_starpu_task_wait_for_all_OBJECTS = \ starpu_task_wait_for_all.$(OBJEXT) main_starpu_task_wait_for_all_LDADD = $(LDADD) main_starpu_worker_exists_SOURCES = main/starpu_worker_exists.c main_starpu_worker_exists_OBJECTS = starpu_worker_exists.$(OBJEXT) main_starpu_worker_exists_LDADD = $(LDADD) main_static_restartable_SOURCES = main/static_restartable.c main_static_restartable_OBJECTS = static_restartable.$(OBJEXT) main_static_restartable_LDADD = $(LDADD) main_static_restartable_tag_SOURCES = main/static_restartable_tag.c main_static_restartable_tag_OBJECTS = \ static_restartable_tag.$(OBJEXT) main_static_restartable_tag_LDADD = $(LDADD) main_static_restartable_using_initializer_SOURCES = \ main/static_restartable_using_initializer.c main_static_restartable_using_initializer_OBJECTS = \ static_restartable_using_initializer.$(OBJEXT) main_static_restartable_using_initializer_LDADD = $(LDADD) main_subgraph_repeat_SOURCES = main/subgraph_repeat.c main_subgraph_repeat_OBJECTS = subgraph_repeat.$(OBJEXT) main_subgraph_repeat_LDADD = $(LDADD) main_subgraph_repeat_regenerate_SOURCES = \ main/subgraph_repeat_regenerate.c main_subgraph_repeat_regenerate_OBJECTS = \ subgraph_repeat_regenerate.$(OBJEXT) main_subgraph_repeat_regenerate_LDADD = $(LDADD) main_subgraph_repeat_regenerate_tag_SOURCES = \ main/subgraph_repeat_regenerate_tag.c main_subgraph_repeat_regenerate_tag_OBJECTS = \ subgraph_repeat_regenerate_tag.$(OBJEXT) main_subgraph_repeat_regenerate_tag_LDADD = $(LDADD) main_submit_SOURCES = main/submit.c main_submit_OBJECTS = submit.$(OBJEXT) main_submit_LDADD = $(LDADD) main_tag_task_data_deps_SOURCES = main/tag_task_data_deps.c main_tag_task_data_deps_OBJECTS = tag_task_data_deps.$(OBJEXT) main_tag_task_data_deps_LDADD = $(LDADD) main_tag_wait_api_SOURCES = main/tag_wait_api.c main_tag_wait_api_OBJECTS = tag_wait_api.$(OBJEXT) main_tag_wait_api_LDADD = $(LDADD) main_task_wait_api_SOURCES = main/task_wait_api.c main_task_wait_api_OBJECTS = task_wait_api.$(OBJEXT) main_task_wait_api_LDADD = $(LDADD) main_wait_all_regenerable_tasks_SOURCES = \ main/wait_all_regenerable_tasks.c main_wait_all_regenerable_tasks_OBJECTS = \ wait_all_regenerable_tasks.$(OBJEXT) main_wait_all_regenerable_tasks_LDADD = $(LDADD) microbenchs_async_tasks_overhead_SOURCES = \ microbenchs/async_tasks_overhead.c microbenchs_async_tasks_overhead_OBJECTS = \ async_tasks_overhead.$(OBJEXT) microbenchs_async_tasks_overhead_LDADD = $(LDADD) microbenchs_local_pingpong_SOURCES = microbenchs/local_pingpong.c microbenchs_local_pingpong_OBJECTS = local_pingpong.$(OBJEXT) microbenchs_local_pingpong_LDADD = $(LDADD) microbenchs_matrix_as_vector_SOURCES = microbenchs/matrix_as_vector.c microbenchs_matrix_as_vector_OBJECTS = matrix_as_vector.$(OBJEXT) microbenchs_matrix_as_vector_LDADD = $(LDADD) microbenchs_prefetch_data_on_node_SOURCES = \ microbenchs/prefetch_data_on_node.c microbenchs_prefetch_data_on_node_OBJECTS = \ prefetch_data_on_node.$(OBJEXT) microbenchs_prefetch_data_on_node_LDADD = $(LDADD) microbenchs_redundant_buffer_SOURCES = microbenchs/redundant_buffer.c microbenchs_redundant_buffer_OBJECTS = redundant_buffer.$(OBJEXT) microbenchs_redundant_buffer_LDADD = $(LDADD) microbenchs_sync_tasks_overhead_SOURCES = \ microbenchs/sync_tasks_overhead.c microbenchs_sync_tasks_overhead_OBJECTS = \ sync_tasks_overhead.$(OBJEXT) microbenchs_sync_tasks_overhead_LDADD = $(LDADD) microbenchs_tasks_overhead_SOURCES = microbenchs/tasks_overhead.c microbenchs_tasks_overhead_OBJECTS = tasks_overhead.$(OBJEXT) microbenchs_tasks_overhead_LDADD = $(LDADD) microbenchs_tasks_size_overhead_SOURCES = \ microbenchs/tasks_size_overhead.c microbenchs_tasks_size_overhead_OBJECTS = \ tasks_size_overhead.$(OBJEXT) microbenchs_tasks_size_overhead_LDADD = $(LDADD) overlap_overlap_SOURCES = overlap/overlap.c overlap_overlap_OBJECTS = overlap.$(OBJEXT) overlap_overlap_LDADD = $(LDADD) parallel_tasks_cuda_only_SOURCES = parallel_tasks/cuda_only.c parallel_tasks_cuda_only_OBJECTS = cuda_only.$(OBJEXT) parallel_tasks_cuda_only_LDADD = $(LDADD) parallel_tasks_explicit_combined_worker_SOURCES = \ parallel_tasks/explicit_combined_worker.c parallel_tasks_explicit_combined_worker_OBJECTS = \ explicit_combined_worker.$(OBJEXT) parallel_tasks_explicit_combined_worker_LDADD = $(LDADD) parallel_tasks_parallel_kernels_SOURCES = \ parallel_tasks/parallel_kernels.c parallel_tasks_parallel_kernels_OBJECTS = parallel_kernels.$(OBJEXT) parallel_tasks_parallel_kernels_LDADD = $(LDADD) parallel_tasks_parallel_kernels_spmd_SOURCES = \ parallel_tasks/parallel_kernels_spmd.c parallel_tasks_parallel_kernels_spmd_OBJECTS = \ parallel_kernels_spmd.$(OBJEXT) parallel_tasks_parallel_kernels_spmd_LDADD = $(LDADD) parallel_tasks_spmd_peager_SOURCES = parallel_tasks/spmd_peager.c parallel_tasks_spmd_peager_OBJECTS = spmd_peager.$(OBJEXT) parallel_tasks_spmd_peager_LDADD = $(LDADD) am_perfmodels_feed_OBJECTS = feed.$(OBJEXT) perfmodels_feed_OBJECTS = $(am_perfmodels_feed_OBJECTS) perfmodels_feed_LDADD = $(LDADD) am__perfmodels_non_linear_regression_based_SOURCES_DIST = \ perfmodels/non_linear_regression_based.c \ perfmodels/opencl_memset.c @STARPU_USE_OPENCL_TRUE@am__objects_27 = opencl_memset.$(OBJEXT) am_perfmodels_non_linear_regression_based_OBJECTS = \ non_linear_regression_based.$(OBJEXT) $(am__objects_27) perfmodels_non_linear_regression_based_OBJECTS = \ $(am_perfmodels_non_linear_regression_based_OBJECTS) perfmodels_non_linear_regression_based_LDADD = $(LDADD) am__perfmodels_regression_based_SOURCES_DIST = \ perfmodels/regression_based.c perfmodels/opencl_memset.c am_perfmodels_regression_based_OBJECTS = regression_based.$(OBJEXT) \ $(am__objects_27) perfmodels_regression_based_OBJECTS = \ $(am_perfmodels_regression_based_OBJECTS) perfmodels_regression_based_LDADD = $(LDADD) perfmodels_valid_model_SOURCES = perfmodels/valid_model.c perfmodels_valid_model_OBJECTS = valid_model.$(OBJEXT) perfmodels_valid_model_LDADD = $(LDADD) perfmodels_value_nan_SOURCES = perfmodels/value_nan.c perfmodels_value_nan_OBJECTS = value_nan.$(OBJEXT) perfmodels_value_nan_LDADD = $(LDADD) sched_policies_data_locality_SOURCES = sched_policies/data_locality.c sched_policies_data_locality_OBJECTS = data_locality.$(OBJEXT) sched_policies_data_locality_LDADD = $(LDADD) sched_policies_execute_all_tasks_SOURCES = \ sched_policies/execute_all_tasks.c sched_policies_execute_all_tasks_OBJECTS = \ execute_all_tasks.$(OBJEXT) sched_policies_execute_all_tasks_LDADD = $(LDADD) sched_policies_execute_all_tasks_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) \ $(sched_policies_execute_all_tasks_LDFLAGS) $(LDFLAGS) -o $@ sched_policies_prio_SOURCES = sched_policies/prio.c sched_policies_prio_OBJECTS = prio.$(OBJEXT) sched_policies_prio_LDADD = $(LDADD) sched_policies_simple_cpu_gpu_sched_SOURCES = \ sched_policies/simple_cpu_gpu_sched.c sched_policies_simple_cpu_gpu_sched_OBJECTS = \ simple_cpu_gpu_sched.$(OBJEXT) sched_policies_simple_cpu_gpu_sched_LDADD = $(LDADD) sched_policies_simple_deps_SOURCES = sched_policies/simple_deps.c sched_policies_simple_deps_OBJECTS = simple_deps.$(OBJEXT) sched_policies_simple_deps_LDADD = $(LDADD) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(examplebin_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = 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/allocate.c \ datawizard/cache.c datawizard/copy.c \ datawizard/critical_section_with_void_interface.c \ datawizard/data_implicit_deps.c datawizard/data_invalidation.c \ datawizard/data_lookup.c datawizard/dining_philosophers.c \ datawizard/double_parameter.c datawizard/dsm_stress.c \ $(datawizard_gpu_ptr_register_SOURCES) \ $(datawizard_gpu_register_SOURCES) \ datawizard/handle_to_pointer.c \ $(datawizard_in_place_partition_SOURCES) \ datawizard/increment_init.c datawizard/increment_redux.c \ datawizard/increment_redux_lazy.c \ datawizard/increment_redux_v2.c \ $(datawizard_interfaces_bcsr_bcsr_interface_SOURCES) \ $(datawizard_interfaces_block_block_interface_SOURCES) \ $(datawizard_interfaces_coo_coo_interface_SOURCES) \ datawizard/interfaces/copy_interfaces.c \ $(datawizard_interfaces_csr_csr_interface_SOURCES) \ $(datawizard_interfaces_matrix_matrix_interface_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_same_handle_SOURCES) \ $(datawizard_interfaces_multiformat_multiformat_interface_SOURCES) \ $(datawizard_interfaces_variable_variable_interface_SOURCES) \ $(datawizard_interfaces_vector_test_vector_interface_SOURCES) \ $(datawizard_interfaces_void_void_interface_SOURCES) \ datawizard/lazy_allocation.c datawizard/lazy_unregister.c \ datawizard/manual_reduction.c $(datawizard_mpi_like_SOURCES) \ $(datawizard_mpi_like_async_SOURCES) \ datawizard/no_unregister.c datawizard/nowhere.c \ $(datawizard_partition_lazy_SOURCES) \ datawizard/readers_and_writers.c datawizard/readonly.c \ datawizard/reclaim.c $(datawizard_scratch_SOURCES) \ $(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/unpartition.c \ datawizard/user_interaction_implicit.c \ datawizard/write_only_tmp_buffer.c \ $(datawizard_wt_broadcast_SOURCES) \ $(datawizard_wt_host_SOURCES) \ errorcheck/invalid_blocking_calls.c errorcheck/invalid_tasks.c \ errorcheck/starpu_init_noworker.c $(fortran90_init_01_SOURCES) \ helper/cublas_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/declare_deps_after_submission.c \ main/declare_deps_after_submission_synchronous.c \ main/declare_deps_in_callback.c main/deploop.c \ main/deprecated_buffer.c main/deprecated_func.c \ main/driver_api/init_run_deinit.c main/driver_api/run_driver.c \ main/empty_task.c main/empty_task_chain.c \ main/empty_task_sync_point.c \ main/empty_task_sync_point_tasks.c \ main/execute_on_a_specific_worker.c main/get_current_task.c \ main/insert_task.c main/insert_task_array.c \ main/insert_task_nullcodelet.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.c main/subgraph_repeat_regenerate.c \ main/subgraph_repeat_regenerate_tag.c main/submit.c \ main/tag_task_data_deps.c main/tag_wait_api.c \ main/task_wait_api.c main/wait_all_regenerable_tasks.c \ microbenchs/async_tasks_overhead.c \ microbenchs/local_pingpong.c microbenchs/matrix_as_vector.c \ microbenchs/prefetch_data_on_node.c \ microbenchs/redundant_buffer.c \ microbenchs/sync_tasks_overhead.c microbenchs/tasks_overhead.c \ microbenchs/tasks_size_overhead.c overlap/overlap.c \ parallel_tasks/cuda_only.c \ parallel_tasks/explicit_combined_worker.c \ parallel_tasks/parallel_kernels.c \ parallel_tasks/parallel_kernels_spmd.c \ parallel_tasks/spmd_peager.c $(perfmodels_feed_SOURCES) \ $(perfmodels_non_linear_regression_based_SOURCES) \ $(perfmodels_regression_based_SOURCES) \ perfmodels/valid_model.c perfmodels/value_nan.c \ sched_policies/data_locality.c \ sched_policies/execute_all_tasks.c sched_policies/prio.c \ sched_policies/simple_cpu_gpu_sched.c \ sched_policies/simple_deps.c DIST_SOURCES = datawizard/acquire_cb.c datawizard/acquire_cb_insert.c \ $(am__datawizard_acquire_release_SOURCES_DIST) \ $(am__datawizard_acquire_release2_SOURCES_DIST) \ datawizard/allocate.c datawizard/cache.c datawizard/copy.c \ datawizard/critical_section_with_void_interface.c \ datawizard/data_implicit_deps.c datawizard/data_invalidation.c \ datawizard/data_lookup.c datawizard/dining_philosophers.c \ datawizard/double_parameter.c datawizard/dsm_stress.c \ $(am__datawizard_gpu_ptr_register_SOURCES_DIST) \ $(am__datawizard_gpu_register_SOURCES_DIST) \ datawizard/handle_to_pointer.c \ $(am__datawizard_in_place_partition_SOURCES_DIST) \ datawizard/increment_init.c datawizard/increment_redux.c \ datawizard/increment_redux_lazy.c \ datawizard/increment_redux_v2.c \ $(am__datawizard_interfaces_bcsr_bcsr_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_block_block_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_coo_coo_interface_SOURCES_DIST) \ datawizard/interfaces/copy_interfaces.c \ $(am__datawizard_interfaces_csr_csr_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_matrix_matrix_interface_SOURCES_DIST) \ $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES) \ $(datawizard_interfaces_multiformat_advanced_same_handle_SOURCES) \ $(am__datawizard_interfaces_multiformat_multiformat_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_variable_variable_interface_SOURCES_DIST) \ $(am__datawizard_interfaces_vector_test_vector_interface_SOURCES_DIST) \ $(datawizard_interfaces_void_void_interface_SOURCES) \ datawizard/lazy_allocation.c datawizard/lazy_unregister.c \ datawizard/manual_reduction.c \ $(am__datawizard_mpi_like_SOURCES_DIST) \ $(am__datawizard_mpi_like_async_SOURCES_DIST) \ datawizard/no_unregister.c datawizard/nowhere.c \ $(am__datawizard_partition_lazy_SOURCES_DIST) \ datawizard/readers_and_writers.c datawizard/readonly.c \ datawizard/reclaim.c $(am__datawizard_scratch_SOURCES_DIST) \ $(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/unpartition.c \ datawizard/user_interaction_implicit.c \ datawizard/write_only_tmp_buffer.c \ $(datawizard_wt_broadcast_SOURCES) \ $(datawizard_wt_host_SOURCES) \ errorcheck/invalid_blocking_calls.c errorcheck/invalid_tasks.c \ errorcheck/starpu_init_noworker.c \ $(am__fortran90_init_01_SOURCES_DIST) helper/cublas_init.c \ helper/execute_on_all.c helper/pinned_memory.c \ helper/starpu_create_sync_task.c helper/starpu_data_cpy.c \ loader.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_buffer.c main/deprecated_func.c \ main/driver_api/init_run_deinit.c main/driver_api/run_driver.c \ main/empty_task.c main/empty_task_chain.c \ main/empty_task_sync_point.c \ main/empty_task_sync_point_tasks.c \ main/execute_on_a_specific_worker.c main/get_current_task.c \ main/insert_task.c main/insert_task_array.c \ main/insert_task_nullcodelet.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.c main/subgraph_repeat_regenerate.c \ main/subgraph_repeat_regenerate_tag.c main/submit.c \ main/tag_task_data_deps.c main/tag_wait_api.c \ main/task_wait_api.c main/wait_all_regenerable_tasks.c \ microbenchs/async_tasks_overhead.c \ microbenchs/local_pingpong.c microbenchs/matrix_as_vector.c \ microbenchs/prefetch_data_on_node.c \ microbenchs/redundant_buffer.c \ microbenchs/sync_tasks_overhead.c microbenchs/tasks_overhead.c \ microbenchs/tasks_size_overhead.c overlap/overlap.c \ parallel_tasks/cuda_only.c \ parallel_tasks/explicit_combined_worker.c \ parallel_tasks/parallel_kernels.c \ parallel_tasks/parallel_kernels_spmd.c \ parallel_tasks/spmd_peager.c $(perfmodels_feed_SOURCES) \ $(am__perfmodels_non_linear_regression_based_SOURCES_DIST) \ $(am__perfmodels_regression_based_SOURCES_DIST) \ perfmodels/valid_model.c perfmodels/value_nan.c \ sched_policies/data_locality.c \ sched_policies/execute_all_tasks.c sched_policies/prio.c \ sched_policies/simple_cpu_gpu_sched.c \ sched_policies/simple_deps.c RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(nobase_STARPU_OPENCL_DATA_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ $(am__append_1) OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/src -I$(top_srcdir)/src/ AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) EXTRA_DIST = \ helper.h \ datawizard/scal.h \ microbenchs/tasks_size_overhead.sh \ microbenchs/tasks_size_overhead.gp \ datawizard/scratch_opencl_kernel.cl \ datawizard/sync_and_notify_data_opencl_codelet.cl\ datawizard/opencl_codelet_unsigned_inc_kernel.cl \ coverage/coverage.sh \ datawizard/acquire_release_opencl_kernel.cl \ datawizard/interfaces/test_interfaces.h \ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl \ datawizard/interfaces/coo/coo_opencl_kernel.cl \ datawizard/interfaces/matrix/matrix_opencl_kernel.cl \ datawizard/interfaces/variable/variable_opencl_kernel.cl \ datawizard/interfaces/vector/test_vector_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_types.h \ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl \ datawizard/interfaces/multiformat/advanced/generic.h \ datawizard/interfaces/csr/csr_opencl_kernel.cl \ datawizard/interfaces/block/block_opencl_kernel.cl \ perfmodels/opencl_memset_kernel.cl CLEANFILES = \ *.gcno *.gcda *.linkinfo core *.mod BUILT_SOURCES = SUBDIRS = examplebindir = $(libdir)/starpu/examples @STARPU_USE_OPENCL_TRUE@nobase_STARPU_OPENCL_DATA_DATA = datawizard/acquire_release_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/scratch_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/opencl_codelet_unsigned_inc_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/sync_and_notify_data_opencl_codelet.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/block/block_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/coo/coo_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/csr/csr_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/vector/test_vector_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/matrix/matrix_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ datawizard/interfaces/variable/variable_opencl_kernel.cl \ @STARPU_USE_OPENCL_TRUE@ perfmodels/opencl_memset_kernel.cl testbindir = $(libdir)/starpu/tests ##################################### # What to install and what to check # ##################################### @STARPU_HAVE_WINDOWS_FALSE@LOADER = loader @STARPU_HAVE_WINDOWS_FALSE@LOADER_BIN = $(abs_top_builddir)/tests/$(LOADER) @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) TESTS = $(noinst_PROGRAMS) $(am__append_2) examplebin_SCRIPTS = \ microbenchs/tasks_size_overhead.gp \ microbenchs/tasks_size_overhead.sh ####################### # Source files # ####################### datawizard_acquire_release_SOURCES = datawizard/acquire_release.c \ $(am__append_5) $(am__append_6) datawizard_acquire_release2_SOURCES = datawizard/acquire_release2.c \ $(am__append_7) $(am__append_8) datawizard_scratch_SOURCES = datawizard/scratch.c $(am__append_9) \ $(am__append_10) datawizard_mpi_like_SOURCES = datawizard/mpi_like.c $(am__append_11) \ $(am__append_12) datawizard_mpi_like_async_SOURCES = datawizard/mpi_like_async.c \ $(am__append_13) $(am__append_14) datawizard_sync_and_notify_data_SOURCES = \ datawizard/sync_and_notify_data.c $(am__append_15) \ $(am__append_16) datawizard_sync_and_notify_data_implicit_SOURCES = \ datawizard/sync_and_notify_data_implicit.c $(am__append_17) \ $(am__append_18) datawizard_in_place_partition_SOURCES = \ datawizard/in_place_partition.c datawizard/scal.c \ $(am__append_19) $(am__append_20) datawizard_partition_lazy_SOURCES = datawizard/partition_lazy.c \ datawizard/scal.c $(am__append_21) $(am__append_22) datawizard_gpu_register_SOURCES = datawizard/gpu_register.c \ datawizard/scal.c $(am__append_23) $(am__append_24) datawizard_gpu_ptr_register_SOURCES = datawizard/gpu_ptr_register.c \ datawizard/scal.c $(am__append_25) $(am__append_26) 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_27) $(am__append_28) main_deprecated_func_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations main_deprecated_buffer_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations @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_29) \ $(am__append_30) ################## # BSCR interface # ################## datawizard_interfaces_bcsr_bcsr_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c $(am__append_31) \ $(am__append_32) ################# # COO interface # ################# datawizard_interfaces_coo_coo_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c $(am__append_33) \ $(am__append_34) ################# # CSR interface # ################# datawizard_interfaces_csr_csr_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c $(am__append_35) \ $(am__append_36) datawizard_interfaces_vector_test_vector_interface_SOURCES = \ datawizard/interfaces/vector/test_vector_interface.c \ datawizard/interfaces/test_interfaces.c $(am__append_37) \ $(am__append_38) #################### # Matrix interface # #################### datawizard_interfaces_matrix_matrix_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c \ $(am__append_39) $(am__append_40) ######################### # 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_41) $(am__append_42) 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_43) $(am__append_44) ################## # Void interface # ################## datawizard_interfaces_void_void_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/void/void_interface.c perfmodels_regression_based_SOURCES = perfmodels/regression_based.c \ $(am__append_45) perfmodels_non_linear_regression_based_SOURCES = \ perfmodels/non_linear_regression_based.c $(am__append_46) perfmodels_feed_SOURCES = \ perfmodels/feed.c sched_policies_execute_all_tasks_LDFLAGS = -lm all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cu .cubin .f90 .lo .log .o .obj .test .test$(EXEEXT) .trs $(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 tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): 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/allocate$(EXEEXT): $(datawizard_allocate_OBJECTS) $(datawizard_allocate_DEPENDENCIES) $(EXTRA_datawizard_allocate_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/allocate$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_allocate_OBJECTS) $(datawizard_allocate_LDADD) $(LIBS) datawizard/cache$(EXEEXT): $(datawizard_cache_OBJECTS) $(datawizard_cache_DEPENDENCIES) $(EXTRA_datawizard_cache_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/cache$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_cache_OBJECTS) $(datawizard_cache_LDADD) $(LIBS) datawizard/copy$(EXEEXT): $(datawizard_copy_OBJECTS) $(datawizard_copy_DEPENDENCIES) $(EXTRA_datawizard_copy_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/copy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_copy_OBJECTS) $(datawizard_copy_LDADD) $(LIBS) datawizard/critical_section_with_void_interface$(EXEEXT): $(datawizard_critical_section_with_void_interface_OBJECTS) $(datawizard_critical_section_with_void_interface_DEPENDENCIES) $(EXTRA_datawizard_critical_section_with_void_interface_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/critical_section_with_void_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_critical_section_with_void_interface_OBJECTS) $(datawizard_critical_section_with_void_interface_LDADD) $(LIBS) datawizard/data_implicit_deps$(EXEEXT): $(datawizard_data_implicit_deps_OBJECTS) $(datawizard_data_implicit_deps_DEPENDENCIES) $(EXTRA_datawizard_data_implicit_deps_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/data_implicit_deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_data_implicit_deps_OBJECTS) $(datawizard_data_implicit_deps_LDADD) $(LIBS) datawizard/data_invalidation$(EXEEXT): $(datawizard_data_invalidation_OBJECTS) $(datawizard_data_invalidation_DEPENDENCIES) $(EXTRA_datawizard_data_invalidation_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/data_invalidation$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_data_invalidation_OBJECTS) $(datawizard_data_invalidation_LDADD) $(LIBS) datawizard/data_lookup$(EXEEXT): $(datawizard_data_lookup_OBJECTS) $(datawizard_data_lookup_DEPENDENCIES) $(EXTRA_datawizard_data_lookup_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/data_lookup$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_data_lookup_OBJECTS) $(datawizard_data_lookup_LDADD) $(LIBS) datawizard/dining_philosophers$(EXEEXT): $(datawizard_dining_philosophers_OBJECTS) $(datawizard_dining_philosophers_DEPENDENCIES) $(EXTRA_datawizard_dining_philosophers_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/dining_philosophers$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_dining_philosophers_OBJECTS) $(datawizard_dining_philosophers_LDADD) $(LIBS) datawizard/double_parameter$(EXEEXT): $(datawizard_double_parameter_OBJECTS) $(datawizard_double_parameter_DEPENDENCIES) $(EXTRA_datawizard_double_parameter_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/double_parameter$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_double_parameter_OBJECTS) $(datawizard_double_parameter_LDADD) $(LIBS) datawizard/dsm_stress$(EXEEXT): $(datawizard_dsm_stress_OBJECTS) $(datawizard_dsm_stress_DEPENDENCIES) $(EXTRA_datawizard_dsm_stress_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/dsm_stress$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_dsm_stress_OBJECTS) $(datawizard_dsm_stress_LDADD) $(LIBS) datawizard/scal_cuda.$(OBJEXT): datawizard/$(am__dirstamp) \ datawizard/$(DEPDIR)/$(am__dirstamp) datawizard/gpu_ptr_register$(EXEEXT): $(datawizard_gpu_ptr_register_OBJECTS) $(datawizard_gpu_ptr_register_DEPENDENCIES) $(EXTRA_datawizard_gpu_ptr_register_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/gpu_ptr_register$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_gpu_ptr_register_OBJECTS) $(datawizard_gpu_ptr_register_LDADD) $(LIBS) datawizard/gpu_register$(EXEEXT): $(datawizard_gpu_register_OBJECTS) $(datawizard_gpu_register_DEPENDENCIES) $(EXTRA_datawizard_gpu_register_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/gpu_register$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_gpu_register_OBJECTS) $(datawizard_gpu_register_LDADD) $(LIBS) datawizard/handle_to_pointer$(EXEEXT): $(datawizard_handle_to_pointer_OBJECTS) $(datawizard_handle_to_pointer_DEPENDENCIES) $(EXTRA_datawizard_handle_to_pointer_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/handle_to_pointer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_handle_to_pointer_OBJECTS) $(datawizard_handle_to_pointer_LDADD) $(LIBS) datawizard/in_place_partition$(EXEEXT): $(datawizard_in_place_partition_OBJECTS) $(datawizard_in_place_partition_DEPENDENCIES) $(EXTRA_datawizard_in_place_partition_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/in_place_partition$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_in_place_partition_OBJECTS) $(datawizard_in_place_partition_LDADD) $(LIBS) datawizard/increment_init$(EXEEXT): $(datawizard_increment_init_OBJECTS) $(datawizard_increment_init_DEPENDENCIES) $(EXTRA_datawizard_increment_init_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_init_OBJECTS) $(datawizard_increment_init_LDADD) $(LIBS) datawizard/increment_redux$(EXEEXT): $(datawizard_increment_redux_OBJECTS) $(datawizard_increment_redux_DEPENDENCIES) $(EXTRA_datawizard_increment_redux_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_redux$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_redux_OBJECTS) $(datawizard_increment_redux_LDADD) $(LIBS) datawizard/increment_redux_lazy$(EXEEXT): $(datawizard_increment_redux_lazy_OBJECTS) $(datawizard_increment_redux_lazy_DEPENDENCIES) $(EXTRA_datawizard_increment_redux_lazy_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_redux_lazy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_redux_lazy_OBJECTS) $(datawizard_increment_redux_lazy_LDADD) $(LIBS) datawizard/increment_redux_v2$(EXEEXT): $(datawizard_increment_redux_v2_OBJECTS) $(datawizard_increment_redux_v2_DEPENDENCIES) $(EXTRA_datawizard_increment_redux_v2_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/increment_redux_v2$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_increment_redux_v2_OBJECTS) $(datawizard_increment_redux_v2_LDADD) $(LIBS) datawizard/interfaces/bcsr/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/bcsr @: > datawizard/interfaces/bcsr/$(am__dirstamp) datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/bcsr/$(DEPDIR) @: > datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/bcsr/bcsr_cuda.$(OBJEXT): \ datawizard/interfaces/bcsr/$(am__dirstamp) \ datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT): $(datawizard_interfaces_bcsr_bcsr_interface_OBJECTS) $(datawizard_interfaces_bcsr_bcsr_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_bcsr_bcsr_interface_DEPENDENCIES) datawizard/interfaces/bcsr/$(am__dirstamp) @rm -f datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_bcsr_bcsr_interface_OBJECTS) $(datawizard_interfaces_bcsr_bcsr_interface_LDADD) $(LIBS) datawizard/interfaces/block/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/block @: > datawizard/interfaces/block/$(am__dirstamp) datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/block/$(DEPDIR) @: > datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/block/block_cuda.$(OBJEXT): \ datawizard/interfaces/block/$(am__dirstamp) \ datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/block/block_interface$(EXEEXT): $(datawizard_interfaces_block_block_interface_OBJECTS) $(datawizard_interfaces_block_block_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_block_block_interface_DEPENDENCIES) datawizard/interfaces/block/$(am__dirstamp) @rm -f datawizard/interfaces/block/block_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_block_block_interface_OBJECTS) $(datawizard_interfaces_block_block_interface_LDADD) $(LIBS) datawizard/interfaces/coo/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/coo @: > datawizard/interfaces/coo/$(am__dirstamp) datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/coo/$(DEPDIR) @: > datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/coo/coo_cuda.$(OBJEXT): \ datawizard/interfaces/coo/$(am__dirstamp) \ datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/coo/coo_interface$(EXEEXT): $(datawizard_interfaces_coo_coo_interface_OBJECTS) $(datawizard_interfaces_coo_coo_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_coo_coo_interface_DEPENDENCIES) datawizard/interfaces/coo/$(am__dirstamp) @rm -f datawizard/interfaces/coo/coo_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_coo_coo_interface_OBJECTS) $(datawizard_interfaces_coo_coo_interface_LDADD) $(LIBS) datawizard/interfaces/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces @: > datawizard/interfaces/$(am__dirstamp) datawizard/interfaces/copy_interfaces$(EXEEXT): $(datawizard_interfaces_copy_interfaces_OBJECTS) $(datawizard_interfaces_copy_interfaces_DEPENDENCIES) $(EXTRA_datawizard_interfaces_copy_interfaces_DEPENDENCIES) datawizard/interfaces/$(am__dirstamp) @rm -f datawizard/interfaces/copy_interfaces$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_copy_interfaces_OBJECTS) $(datawizard_interfaces_copy_interfaces_LDADD) $(LIBS) datawizard/interfaces/csr/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/csr @: > datawizard/interfaces/csr/$(am__dirstamp) datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/csr/$(DEPDIR) @: > datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/csr/csr_cuda.$(OBJEXT): \ datawizard/interfaces/csr/$(am__dirstamp) \ datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/csr/csr_interface$(EXEEXT): $(datawizard_interfaces_csr_csr_interface_OBJECTS) $(datawizard_interfaces_csr_csr_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_csr_csr_interface_DEPENDENCIES) datawizard/interfaces/csr/$(am__dirstamp) @rm -f datawizard/interfaces/csr/csr_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_csr_csr_interface_OBJECTS) $(datawizard_interfaces_csr_csr_interface_LDADD) $(LIBS) datawizard/interfaces/matrix/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/matrix @: > datawizard/interfaces/matrix/$(am__dirstamp) datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/matrix/$(DEPDIR) @: > datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/matrix/matrix_cuda.$(OBJEXT): \ datawizard/interfaces/matrix/$(am__dirstamp) \ datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/matrix/matrix_interface$(EXEEXT): $(datawizard_interfaces_matrix_matrix_interface_OBJECTS) $(datawizard_interfaces_matrix_matrix_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_matrix_matrix_interface_DEPENDENCIES) datawizard/interfaces/matrix/$(am__dirstamp) @rm -f datawizard/interfaces/matrix/matrix_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_matrix_matrix_interface_OBJECTS) $(datawizard_interfaces_matrix_matrix_interface_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/multiformat/advanced @: > datawizard/interfaces/multiformat/advanced/$(am__dirstamp) datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_data_release_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_data_release_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_worker_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_multiformat_worker_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_multiformat_worker_OBJECTS) $(datawizard_interfaces_multiformat_advanced_multiformat_worker_LDADD) $(LIBS) datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT): $(datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS) $(datawizard_interfaces_multiformat_advanced_same_handle_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_advanced_same_handle_DEPENDENCIES) datawizard/interfaces/multiformat/advanced/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_advanced_same_handle_OBJECTS) $(datawizard_interfaces_multiformat_advanced_same_handle_LDADD) $(LIBS) datawizard/interfaces/multiformat/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/multiformat @: > datawizard/interfaces/multiformat/$(am__dirstamp) datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/multiformat/$(DEPDIR) @: > datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/multiformat/multiformat_cuda.$(OBJEXT): \ datawizard/interfaces/multiformat/$(am__dirstamp) \ datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.$(OBJEXT): \ datawizard/interfaces/multiformat/$(am__dirstamp) \ datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT): $(datawizard_interfaces_multiformat_multiformat_interface_OBJECTS) $(datawizard_interfaces_multiformat_multiformat_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_multiformat_multiformat_interface_DEPENDENCIES) datawizard/interfaces/multiformat/$(am__dirstamp) @rm -f datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_multiformat_multiformat_interface_OBJECTS) $(datawizard_interfaces_multiformat_multiformat_interface_LDADD) $(LIBS) datawizard/interfaces/variable/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/variable @: > datawizard/interfaces/variable/$(am__dirstamp) datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/variable/$(DEPDIR) @: > datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/variable/variable_cuda.$(OBJEXT): \ datawizard/interfaces/variable/$(am__dirstamp) \ datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/variable/variable_interface$(EXEEXT): $(datawizard_interfaces_variable_variable_interface_OBJECTS) $(datawizard_interfaces_variable_variable_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_variable_variable_interface_DEPENDENCIES) datawizard/interfaces/variable/$(am__dirstamp) @rm -f datawizard/interfaces/variable/variable_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_variable_variable_interface_OBJECTS) $(datawizard_interfaces_variable_variable_interface_LDADD) $(LIBS) datawizard/interfaces/vector/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/vector @: > datawizard/interfaces/vector/$(am__dirstamp) datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/vector/$(DEPDIR) @: > datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/vector/test_vector_cuda.$(OBJEXT): \ datawizard/interfaces/vector/$(am__dirstamp) \ datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) datawizard/interfaces/vector/test_vector_interface$(EXEEXT): $(datawizard_interfaces_vector_test_vector_interface_OBJECTS) $(datawizard_interfaces_vector_test_vector_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_vector_test_vector_interface_DEPENDENCIES) datawizard/interfaces/vector/$(am__dirstamp) @rm -f datawizard/interfaces/vector/test_vector_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_vector_test_vector_interface_OBJECTS) $(datawizard_interfaces_vector_test_vector_interface_LDADD) $(LIBS) datawizard/interfaces/void/$(am__dirstamp): @$(MKDIR_P) datawizard/interfaces/void @: > datawizard/interfaces/void/$(am__dirstamp) datawizard/interfaces/void/void_interface$(EXEEXT): $(datawizard_interfaces_void_void_interface_OBJECTS) $(datawizard_interfaces_void_void_interface_DEPENDENCIES) $(EXTRA_datawizard_interfaces_void_void_interface_DEPENDENCIES) datawizard/interfaces/void/$(am__dirstamp) @rm -f datawizard/interfaces/void/void_interface$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_interfaces_void_void_interface_OBJECTS) $(datawizard_interfaces_void_void_interface_LDADD) $(LIBS) datawizard/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/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/nowhere$(EXEEXT): $(datawizard_nowhere_OBJECTS) $(datawizard_nowhere_DEPENDENCIES) $(EXTRA_datawizard_nowhere_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/nowhere$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_nowhere_OBJECTS) $(datawizard_nowhere_LDADD) $(LIBS) datawizard/partition_lazy$(EXEEXT): $(datawizard_partition_lazy_OBJECTS) $(datawizard_partition_lazy_DEPENDENCIES) $(EXTRA_datawizard_partition_lazy_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/partition_lazy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_partition_lazy_OBJECTS) $(datawizard_partition_lazy_LDADD) $(LIBS) datawizard/readers_and_writers$(EXEEXT): $(datawizard_readers_and_writers_OBJECTS) $(datawizard_readers_and_writers_DEPENDENCIES) $(EXTRA_datawizard_readers_and_writers_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/readers_and_writers$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_readers_and_writers_OBJECTS) $(datawizard_readers_and_writers_LDADD) $(LIBS) datawizard/readonly$(EXEEXT): $(datawizard_readonly_OBJECTS) $(datawizard_readonly_DEPENDENCIES) $(EXTRA_datawizard_readonly_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/readonly$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_readonly_OBJECTS) $(datawizard_readonly_LDADD) $(LIBS) datawizard/reclaim$(EXEEXT): $(datawizard_reclaim_OBJECTS) $(datawizard_reclaim_DEPENDENCIES) $(EXTRA_datawizard_reclaim_DEPENDENCIES) datawizard/$(am__dirstamp) @rm -f datawizard/reclaim$(EXEEXT) $(AM_V_CCLD)$(LINK) $(datawizard_reclaim_OBJECTS) $(datawizard_reclaim_LDADD) $(LIBS) datawizard/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/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/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/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) errorcheck/$(am__dirstamp): @$(MKDIR_P) errorcheck @: > errorcheck/$(am__dirstamp) errorcheck/invalid_blocking_calls$(EXEEXT): $(errorcheck_invalid_blocking_calls_OBJECTS) $(errorcheck_invalid_blocking_calls_DEPENDENCIES) $(EXTRA_errorcheck_invalid_blocking_calls_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/invalid_blocking_calls$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_invalid_blocking_calls_OBJECTS) $(errorcheck_invalid_blocking_calls_LDADD) $(LIBS) errorcheck/invalid_tasks$(EXEEXT): $(errorcheck_invalid_tasks_OBJECTS) $(errorcheck_invalid_tasks_DEPENDENCIES) $(EXTRA_errorcheck_invalid_tasks_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/invalid_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_invalid_tasks_OBJECTS) $(errorcheck_invalid_tasks_LDADD) $(LIBS) errorcheck/starpu_init_noworker$(EXEEXT): $(errorcheck_starpu_init_noworker_OBJECTS) $(errorcheck_starpu_init_noworker_DEPENDENCIES) $(EXTRA_errorcheck_starpu_init_noworker_DEPENDENCIES) errorcheck/$(am__dirstamp) @rm -f errorcheck/starpu_init_noworker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(errorcheck_starpu_init_noworker_OBJECTS) $(errorcheck_starpu_init_noworker_LDADD) $(LIBS) fortran90/$(am__dirstamp): @$(MKDIR_P) fortran90 @: > fortran90/$(am__dirstamp) fortran90/init_01$(EXEEXT): $(fortran90_init_01_OBJECTS) $(fortran90_init_01_DEPENDENCIES) $(EXTRA_fortran90_init_01_DEPENDENCIES) fortran90/$(am__dirstamp) @rm -f fortran90/init_01$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(fortran90_init_01_OBJECTS) $(fortran90_init_01_LDADD) $(LIBS) helper/$(am__dirstamp): @$(MKDIR_P) helper @: > helper/$(am__dirstamp) helper/cublas_init$(EXEEXT): $(helper_cublas_init_OBJECTS) $(helper_cublas_init_DEPENDENCIES) $(EXTRA_helper_cublas_init_DEPENDENCIES) helper/$(am__dirstamp) @rm -f helper/cublas_init$(EXEEXT) $(AM_V_CCLD)$(LINK) $(helper_cublas_init_OBJECTS) $(helper_cublas_init_LDADD) $(LIBS) helper/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/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_buffer$(EXEEXT): $(main_deprecated_buffer_OBJECTS) $(main_deprecated_buffer_DEPENDENCIES) $(EXTRA_main_deprecated_buffer_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/deprecated_buffer$(EXEEXT) $(AM_V_CCLD)$(main_deprecated_buffer_LINK) $(main_deprecated_buffer_OBJECTS) $(main_deprecated_buffer_LDADD) $(LIBS) main/deprecated_func$(EXEEXT): $(main_deprecated_func_OBJECTS) $(main_deprecated_func_DEPENDENCIES) $(EXTRA_main_deprecated_func_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/deprecated_func$(EXEEXT) $(AM_V_CCLD)$(main_deprecated_func_LINK) $(main_deprecated_func_OBJECTS) $(main_deprecated_func_LDADD) $(LIBS) main/driver_api/$(am__dirstamp): @$(MKDIR_P) main/driver_api @: > main/driver_api/$(am__dirstamp) main/driver_api/init_run_deinit$(EXEEXT): $(main_driver_api_init_run_deinit_OBJECTS) $(main_driver_api_init_run_deinit_DEPENDENCIES) $(EXTRA_main_driver_api_init_run_deinit_DEPENDENCIES) main/driver_api/$(am__dirstamp) @rm -f main/driver_api/init_run_deinit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_driver_api_init_run_deinit_OBJECTS) $(main_driver_api_init_run_deinit_LDADD) $(LIBS) main/driver_api/run_driver$(EXEEXT): $(main_driver_api_run_driver_OBJECTS) $(main_driver_api_run_driver_DEPENDENCIES) $(EXTRA_main_driver_api_run_driver_DEPENDENCIES) main/driver_api/$(am__dirstamp) @rm -f main/driver_api/run_driver$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_driver_api_run_driver_OBJECTS) $(main_driver_api_run_driver_LDADD) $(LIBS) main/empty_task$(EXEEXT): $(main_empty_task_OBJECTS) $(main_empty_task_DEPENDENCIES) $(EXTRA_main_empty_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_OBJECTS) $(main_empty_task_LDADD) $(LIBS) main/empty_task_chain$(EXEEXT): $(main_empty_task_chain_OBJECTS) $(main_empty_task_chain_DEPENDENCIES) $(EXTRA_main_empty_task_chain_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task_chain$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_chain_OBJECTS) $(main_empty_task_chain_LDADD) $(LIBS) main/empty_task_sync_point$(EXEEXT): $(main_empty_task_sync_point_OBJECTS) $(main_empty_task_sync_point_DEPENDENCIES) $(EXTRA_main_empty_task_sync_point_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task_sync_point$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_sync_point_OBJECTS) $(main_empty_task_sync_point_LDADD) $(LIBS) main/empty_task_sync_point_tasks$(EXEEXT): $(main_empty_task_sync_point_tasks_OBJECTS) $(main_empty_task_sync_point_tasks_DEPENDENCIES) $(EXTRA_main_empty_task_sync_point_tasks_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/empty_task_sync_point_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_empty_task_sync_point_tasks_OBJECTS) $(main_empty_task_sync_point_tasks_LDADD) $(LIBS) main/execute_on_a_specific_worker$(EXEEXT): $(main_execute_on_a_specific_worker_OBJECTS) $(main_execute_on_a_specific_worker_DEPENDENCIES) $(EXTRA_main_execute_on_a_specific_worker_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/execute_on_a_specific_worker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_execute_on_a_specific_worker_OBJECTS) $(main_execute_on_a_specific_worker_LDADD) $(LIBS) main/get_current_task$(EXEEXT): $(main_get_current_task_OBJECTS) $(main_get_current_task_DEPENDENCIES) $(EXTRA_main_get_current_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/get_current_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_get_current_task_OBJECTS) $(main_get_current_task_LDADD) $(LIBS) main/insert_task$(EXEEXT): $(main_insert_task_OBJECTS) $(main_insert_task_DEPENDENCIES) $(EXTRA_main_insert_task_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_OBJECTS) $(main_insert_task_LDADD) $(LIBS) main/insert_task_array$(EXEEXT): $(main_insert_task_array_OBJECTS) $(main_insert_task_array_DEPENDENCIES) $(EXTRA_main_insert_task_array_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/insert_task_array$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_insert_task_array_OBJECTS) $(main_insert_task_array_LDADD) $(LIBS) main/insert_task_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/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/submit$(EXEEXT): $(main_submit_OBJECTS) $(main_submit_DEPENDENCIES) $(EXTRA_main_submit_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/submit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_submit_OBJECTS) $(main_submit_LDADD) $(LIBS) main/tag_task_data_deps$(EXEEXT): $(main_tag_task_data_deps_OBJECTS) $(main_tag_task_data_deps_DEPENDENCIES) $(EXTRA_main_tag_task_data_deps_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/tag_task_data_deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_tag_task_data_deps_OBJECTS) $(main_tag_task_data_deps_LDADD) $(LIBS) main/tag_wait_api$(EXEEXT): $(main_tag_wait_api_OBJECTS) $(main_tag_wait_api_DEPENDENCIES) $(EXTRA_main_tag_wait_api_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/tag_wait_api$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_tag_wait_api_OBJECTS) $(main_tag_wait_api_LDADD) $(LIBS) main/task_wait_api$(EXEEXT): $(main_task_wait_api_OBJECTS) $(main_task_wait_api_DEPENDENCIES) $(EXTRA_main_task_wait_api_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/task_wait_api$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_task_wait_api_OBJECTS) $(main_task_wait_api_LDADD) $(LIBS) main/wait_all_regenerable_tasks$(EXEEXT): $(main_wait_all_regenerable_tasks_OBJECTS) $(main_wait_all_regenerable_tasks_DEPENDENCIES) $(EXTRA_main_wait_all_regenerable_tasks_DEPENDENCIES) main/$(am__dirstamp) @rm -f main/wait_all_regenerable_tasks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(main_wait_all_regenerable_tasks_OBJECTS) $(main_wait_all_regenerable_tasks_LDADD) $(LIBS) microbenchs/$(am__dirstamp): @$(MKDIR_P) microbenchs @: > microbenchs/$(am__dirstamp) microbenchs/async_tasks_overhead$(EXEEXT): $(microbenchs_async_tasks_overhead_OBJECTS) $(microbenchs_async_tasks_overhead_DEPENDENCIES) $(EXTRA_microbenchs_async_tasks_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/async_tasks_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_async_tasks_overhead_OBJECTS) $(microbenchs_async_tasks_overhead_LDADD) $(LIBS) microbenchs/local_pingpong$(EXEEXT): $(microbenchs_local_pingpong_OBJECTS) $(microbenchs_local_pingpong_DEPENDENCIES) $(EXTRA_microbenchs_local_pingpong_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/local_pingpong$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_local_pingpong_OBJECTS) $(microbenchs_local_pingpong_LDADD) $(LIBS) microbenchs/matrix_as_vector$(EXEEXT): $(microbenchs_matrix_as_vector_OBJECTS) $(microbenchs_matrix_as_vector_DEPENDENCIES) $(EXTRA_microbenchs_matrix_as_vector_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/matrix_as_vector$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_matrix_as_vector_OBJECTS) $(microbenchs_matrix_as_vector_LDADD) $(LIBS) microbenchs/prefetch_data_on_node$(EXEEXT): $(microbenchs_prefetch_data_on_node_OBJECTS) $(microbenchs_prefetch_data_on_node_DEPENDENCIES) $(EXTRA_microbenchs_prefetch_data_on_node_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/prefetch_data_on_node$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_prefetch_data_on_node_OBJECTS) $(microbenchs_prefetch_data_on_node_LDADD) $(LIBS) microbenchs/redundant_buffer$(EXEEXT): $(microbenchs_redundant_buffer_OBJECTS) $(microbenchs_redundant_buffer_DEPENDENCIES) $(EXTRA_microbenchs_redundant_buffer_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/redundant_buffer$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_redundant_buffer_OBJECTS) $(microbenchs_redundant_buffer_LDADD) $(LIBS) microbenchs/sync_tasks_overhead$(EXEEXT): $(microbenchs_sync_tasks_overhead_OBJECTS) $(microbenchs_sync_tasks_overhead_DEPENDENCIES) $(EXTRA_microbenchs_sync_tasks_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/sync_tasks_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_sync_tasks_overhead_OBJECTS) $(microbenchs_sync_tasks_overhead_LDADD) $(LIBS) microbenchs/tasks_overhead$(EXEEXT): $(microbenchs_tasks_overhead_OBJECTS) $(microbenchs_tasks_overhead_DEPENDENCIES) $(EXTRA_microbenchs_tasks_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/tasks_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_tasks_overhead_OBJECTS) $(microbenchs_tasks_overhead_LDADD) $(LIBS) microbenchs/tasks_size_overhead$(EXEEXT): $(microbenchs_tasks_size_overhead_OBJECTS) $(microbenchs_tasks_size_overhead_DEPENDENCIES) $(EXTRA_microbenchs_tasks_size_overhead_DEPENDENCIES) microbenchs/$(am__dirstamp) @rm -f microbenchs/tasks_size_overhead$(EXEEXT) $(AM_V_CCLD)$(LINK) $(microbenchs_tasks_size_overhead_OBJECTS) $(microbenchs_tasks_size_overhead_LDADD) $(LIBS) overlap/$(am__dirstamp): @$(MKDIR_P) overlap @: > overlap/$(am__dirstamp) overlap/overlap$(EXEEXT): $(overlap_overlap_OBJECTS) $(overlap_overlap_DEPENDENCIES) $(EXTRA_overlap_overlap_DEPENDENCIES) overlap/$(am__dirstamp) @rm -f overlap/overlap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(overlap_overlap_OBJECTS) $(overlap_overlap_LDADD) $(LIBS) parallel_tasks/$(am__dirstamp): @$(MKDIR_P) parallel_tasks @: > parallel_tasks/$(am__dirstamp) parallel_tasks/cuda_only$(EXEEXT): $(parallel_tasks_cuda_only_OBJECTS) $(parallel_tasks_cuda_only_DEPENDENCIES) $(EXTRA_parallel_tasks_cuda_only_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/cuda_only$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_cuda_only_OBJECTS) $(parallel_tasks_cuda_only_LDADD) $(LIBS) parallel_tasks/explicit_combined_worker$(EXEEXT): $(parallel_tasks_explicit_combined_worker_OBJECTS) $(parallel_tasks_explicit_combined_worker_DEPENDENCIES) $(EXTRA_parallel_tasks_explicit_combined_worker_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/explicit_combined_worker$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_explicit_combined_worker_OBJECTS) $(parallel_tasks_explicit_combined_worker_LDADD) $(LIBS) parallel_tasks/parallel_kernels$(EXEEXT): $(parallel_tasks_parallel_kernels_OBJECTS) $(parallel_tasks_parallel_kernels_DEPENDENCIES) $(EXTRA_parallel_tasks_parallel_kernels_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/parallel_kernels$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_parallel_kernels_OBJECTS) $(parallel_tasks_parallel_kernels_LDADD) $(LIBS) parallel_tasks/parallel_kernels_spmd$(EXEEXT): $(parallel_tasks_parallel_kernels_spmd_OBJECTS) $(parallel_tasks_parallel_kernels_spmd_DEPENDENCIES) $(EXTRA_parallel_tasks_parallel_kernels_spmd_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/parallel_kernels_spmd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_parallel_kernels_spmd_OBJECTS) $(parallel_tasks_parallel_kernels_spmd_LDADD) $(LIBS) parallel_tasks/spmd_peager$(EXEEXT): $(parallel_tasks_spmd_peager_OBJECTS) $(parallel_tasks_spmd_peager_DEPENDENCIES) $(EXTRA_parallel_tasks_spmd_peager_DEPENDENCIES) parallel_tasks/$(am__dirstamp) @rm -f parallel_tasks/spmd_peager$(EXEEXT) $(AM_V_CCLD)$(LINK) $(parallel_tasks_spmd_peager_OBJECTS) $(parallel_tasks_spmd_peager_LDADD) $(LIBS) perfmodels/$(am__dirstamp): @$(MKDIR_P) perfmodels @: > perfmodels/$(am__dirstamp) perfmodels/feed$(EXEEXT): $(perfmodels_feed_OBJECTS) $(perfmodels_feed_DEPENDENCIES) $(EXTRA_perfmodels_feed_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/feed$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_feed_OBJECTS) $(perfmodels_feed_LDADD) $(LIBS) perfmodels/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/valid_model$(EXEEXT): $(perfmodels_valid_model_OBJECTS) $(perfmodels_valid_model_DEPENDENCIES) $(EXTRA_perfmodels_valid_model_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/valid_model$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_valid_model_OBJECTS) $(perfmodels_valid_model_LDADD) $(LIBS) perfmodels/value_nan$(EXEEXT): $(perfmodels_value_nan_OBJECTS) $(perfmodels_value_nan_DEPENDENCIES) $(EXTRA_perfmodels_value_nan_DEPENDENCIES) perfmodels/$(am__dirstamp) @rm -f perfmodels/value_nan$(EXEEXT) $(AM_V_CCLD)$(LINK) $(perfmodels_value_nan_OBJECTS) $(perfmodels_value_nan_LDADD) $(LIBS) sched_policies/$(am__dirstamp): @$(MKDIR_P) sched_policies @: > sched_policies/$(am__dirstamp) sched_policies/data_locality$(EXEEXT): $(sched_policies_data_locality_OBJECTS) $(sched_policies_data_locality_DEPENDENCIES) $(EXTRA_sched_policies_data_locality_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/data_locality$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_data_locality_OBJECTS) $(sched_policies_data_locality_LDADD) $(LIBS) sched_policies/execute_all_tasks$(EXEEXT): $(sched_policies_execute_all_tasks_OBJECTS) $(sched_policies_execute_all_tasks_DEPENDENCIES) $(EXTRA_sched_policies_execute_all_tasks_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/execute_all_tasks$(EXEEXT) $(AM_V_CCLD)$(sched_policies_execute_all_tasks_LINK) $(sched_policies_execute_all_tasks_OBJECTS) $(sched_policies_execute_all_tasks_LDADD) $(LIBS) sched_policies/prio$(EXEEXT): $(sched_policies_prio_OBJECTS) $(sched_policies_prio_DEPENDENCIES) $(EXTRA_sched_policies_prio_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/prio$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_prio_OBJECTS) $(sched_policies_prio_LDADD) $(LIBS) sched_policies/simple_cpu_gpu_sched$(EXEEXT): $(sched_policies_simple_cpu_gpu_sched_OBJECTS) $(sched_policies_simple_cpu_gpu_sched_DEPENDENCIES) $(EXTRA_sched_policies_simple_cpu_gpu_sched_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/simple_cpu_gpu_sched$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_simple_cpu_gpu_sched_OBJECTS) $(sched_policies_simple_cpu_gpu_sched_LDADD) $(LIBS) sched_policies/simple_deps$(EXEEXT): $(sched_policies_simple_deps_OBJECTS) $(sched_policies_simple_deps_DEPENDENCIES) $(EXTRA_sched_policies_simple_deps_DEPENDENCIES) sched_policies/$(am__dirstamp) @rm -f sched_policies/simple_deps$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sched_policies_simple_deps_OBJECTS) $(sched_policies_simple_deps_LDADD) $(LIBS) install-examplebinSCRIPTS: $(examplebin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(examplebin_SCRIPTS)'; test -n "$(examplebindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(examplebindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(examplebindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(examplebindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(examplebindir)$$dir" || exit $$?; \ } \ ; done uninstall-examplebinSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(examplebin_SCRIPTS)'; test -n "$(examplebindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(examplebindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f datawizard/*.$(OBJEXT) -rm -f datawizard/interfaces/bcsr/*.$(OBJEXT) -rm -f datawizard/interfaces/block/*.$(OBJEXT) -rm -f datawizard/interfaces/coo/*.$(OBJEXT) -rm -f datawizard/interfaces/csr/*.$(OBJEXT) -rm -f datawizard/interfaces/matrix/*.$(OBJEXT) -rm -f datawizard/interfaces/multiformat/*.$(OBJEXT) -rm -f datawizard/interfaces/variable/*.$(OBJEXT) -rm -f datawizard/interfaces/vector/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_cb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_cb_insert.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire_release_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/allocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async_tasks_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bcsr_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coo_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy_interfaces.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/critical_section_with_void_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csr_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cublas_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cuda_only.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_implicit_deps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_invalidation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_locality.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data_lookup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_after_submission.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_after_submission_synchronous.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/declare_deps_in_callback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deploop.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dining_philosophers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/double_parameter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsm_stress.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_chain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_sync_point.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/empty_task_sync_point_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_all_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_on_a_specific_worker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/execute_on_all.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explicit_combined_worker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feed.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_current_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_ptr_register.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_register.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/handle_to_pointer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/in_place_partition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux_lazy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/increment_redux_v2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_run_deinit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_array.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/insert_task_nullcodelet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalid_blocking_calls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/invalid_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lazy_allocation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lazy_unregister.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/local_pingpong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main_deprecated_func-deprecated_func.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/manual_reduction.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_as_vector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_like.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi_like_async.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_conversion_codelets_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_cuda_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_data_release.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_handle_conversion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiformat_worker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multithreaded.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multithreaded_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/no_unregister.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/non_linear_regression_based.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nowhere.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl_codelet_unsigned_inc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opencl_memset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overlap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parallel_kernels_spmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/partition_lazy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pause_resume.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pinned_memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefetch_data_on_node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readers_and_writers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readonly.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reclaim.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redundant_buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenerate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenerate_pipeline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regression_based.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/restart.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run_driver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/same_handle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scratch_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_cpu_gpu_sched.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_deps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/specific_node.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spmd_peager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_create_sync_task.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_data_cpy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_init.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_init_noworker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_bundle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_wait.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_task_wait_for_all.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/starpu_worker_exists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/static_restartable_using_initializer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subgraph_repeat_regenerate_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/submit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_and_notify_data_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_tasks_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem_non_blocking.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sync_with_data_with_mem_non_blocking_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_task_data_deps.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_wait_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_wait_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/task_with_multiple_time_the_same_handle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tasks_size_overhead.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_interfaces.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vector_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_vector_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unpartition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_interaction_implicit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/valid_model.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/value_nan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable_opencl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/void_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait_all_regenerable_tasks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write_only_tmp_buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wt_broadcast.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wt_host.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< acquire_cb.o: datawizard/acquire_cb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb.o -MD -MP -MF $(DEPDIR)/acquire_cb.Tpo -c -o acquire_cb.o `test -f 'datawizard/acquire_cb.c' || echo '$(srcdir)/'`datawizard/acquire_cb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb.Tpo $(DEPDIR)/acquire_cb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb.c' object='acquire_cb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb.o `test -f 'datawizard/acquire_cb.c' || echo '$(srcdir)/'`datawizard/acquire_cb.c acquire_cb.obj: datawizard/acquire_cb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb.obj -MD -MP -MF $(DEPDIR)/acquire_cb.Tpo -c -o acquire_cb.obj `if test -f 'datawizard/acquire_cb.c'; then $(CYGPATH_W) 'datawizard/acquire_cb.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb.Tpo $(DEPDIR)/acquire_cb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb.c' object='acquire_cb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb.obj `if test -f 'datawizard/acquire_cb.c'; then $(CYGPATH_W) 'datawizard/acquire_cb.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb.c'; fi` acquire_cb_insert.o: datawizard/acquire_cb_insert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb_insert.o -MD -MP -MF $(DEPDIR)/acquire_cb_insert.Tpo -c -o acquire_cb_insert.o `test -f 'datawizard/acquire_cb_insert.c' || echo '$(srcdir)/'`datawizard/acquire_cb_insert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb_insert.Tpo $(DEPDIR)/acquire_cb_insert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb_insert.c' object='acquire_cb_insert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb_insert.o `test -f 'datawizard/acquire_cb_insert.c' || echo '$(srcdir)/'`datawizard/acquire_cb_insert.c acquire_cb_insert.obj: datawizard/acquire_cb_insert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_cb_insert.obj -MD -MP -MF $(DEPDIR)/acquire_cb_insert.Tpo -c -o acquire_cb_insert.obj `if test -f 'datawizard/acquire_cb_insert.c'; then $(CYGPATH_W) 'datawizard/acquire_cb_insert.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb_insert.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_cb_insert.Tpo $(DEPDIR)/acquire_cb_insert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_cb_insert.c' object='acquire_cb_insert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_cb_insert.obj `if test -f 'datawizard/acquire_cb_insert.c'; then $(CYGPATH_W) 'datawizard/acquire_cb_insert.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_cb_insert.c'; fi` acquire_release.o: datawizard/acquire_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release.o -MD -MP -MF $(DEPDIR)/acquire_release.Tpo -c -o acquire_release.o `test -f 'datawizard/acquire_release.c' || echo '$(srcdir)/'`datawizard/acquire_release.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release.Tpo $(DEPDIR)/acquire_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release.c' object='acquire_release.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release.o `test -f 'datawizard/acquire_release.c' || echo '$(srcdir)/'`datawizard/acquire_release.c acquire_release.obj: datawizard/acquire_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release.obj -MD -MP -MF $(DEPDIR)/acquire_release.Tpo -c -o acquire_release.obj `if test -f 'datawizard/acquire_release.c'; then $(CYGPATH_W) 'datawizard/acquire_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release.Tpo $(DEPDIR)/acquire_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release.c' object='acquire_release.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release.obj `if test -f 'datawizard/acquire_release.c'; then $(CYGPATH_W) 'datawizard/acquire_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release.c'; fi` acquire_release_opencl.o: datawizard/acquire_release_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release_opencl.o -MD -MP -MF $(DEPDIR)/acquire_release_opencl.Tpo -c -o acquire_release_opencl.o `test -f 'datawizard/acquire_release_opencl.c' || echo '$(srcdir)/'`datawizard/acquire_release_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release_opencl.Tpo $(DEPDIR)/acquire_release_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release_opencl.c' object='acquire_release_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release_opencl.o `test -f 'datawizard/acquire_release_opencl.c' || echo '$(srcdir)/'`datawizard/acquire_release_opencl.c acquire_release_opencl.obj: datawizard/acquire_release_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release_opencl.obj -MD -MP -MF $(DEPDIR)/acquire_release_opencl.Tpo -c -o acquire_release_opencl.obj `if test -f 'datawizard/acquire_release_opencl.c'; then $(CYGPATH_W) 'datawizard/acquire_release_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release_opencl.Tpo $(DEPDIR)/acquire_release_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release_opencl.c' object='acquire_release_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release_opencl.obj `if test -f 'datawizard/acquire_release_opencl.c'; then $(CYGPATH_W) 'datawizard/acquire_release_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release_opencl.c'; fi` acquire_release2.o: datawizard/acquire_release2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release2.o -MD -MP -MF $(DEPDIR)/acquire_release2.Tpo -c -o acquire_release2.o `test -f 'datawizard/acquire_release2.c' || echo '$(srcdir)/'`datawizard/acquire_release2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release2.Tpo $(DEPDIR)/acquire_release2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release2.c' object='acquire_release2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release2.o `test -f 'datawizard/acquire_release2.c' || echo '$(srcdir)/'`datawizard/acquire_release2.c acquire_release2.obj: datawizard/acquire_release2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT acquire_release2.obj -MD -MP -MF $(DEPDIR)/acquire_release2.Tpo -c -o acquire_release2.obj `if test -f 'datawizard/acquire_release2.c'; then $(CYGPATH_W) 'datawizard/acquire_release2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/acquire_release2.Tpo $(DEPDIR)/acquire_release2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/acquire_release2.c' object='acquire_release2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o acquire_release2.obj `if test -f 'datawizard/acquire_release2.c'; then $(CYGPATH_W) 'datawizard/acquire_release2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/acquire_release2.c'; fi` allocate.o: datawizard/allocate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT allocate.o -MD -MP -MF $(DEPDIR)/allocate.Tpo -c -o allocate.o `test -f 'datawizard/allocate.c' || echo '$(srcdir)/'`datawizard/allocate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/allocate.Tpo $(DEPDIR)/allocate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/allocate.c' object='allocate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o allocate.o `test -f 'datawizard/allocate.c' || echo '$(srcdir)/'`datawizard/allocate.c allocate.obj: datawizard/allocate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT allocate.obj -MD -MP -MF $(DEPDIR)/allocate.Tpo -c -o allocate.obj `if test -f 'datawizard/allocate.c'; then $(CYGPATH_W) 'datawizard/allocate.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/allocate.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/allocate.Tpo $(DEPDIR)/allocate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/allocate.c' object='allocate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o allocate.obj `if test -f 'datawizard/allocate.c'; then $(CYGPATH_W) 'datawizard/allocate.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/allocate.c'; fi` cache.o: datawizard/cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cache.o -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.o `test -f 'datawizard/cache.c' || echo '$(srcdir)/'`datawizard/cache.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/cache.c' object='cache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cache.o `test -f 'datawizard/cache.c' || echo '$(srcdir)/'`datawizard/cache.c cache.obj: datawizard/cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cache.obj -MD -MP -MF $(DEPDIR)/cache.Tpo -c -o cache.obj `if test -f 'datawizard/cache.c'; then $(CYGPATH_W) 'datawizard/cache.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/cache.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cache.Tpo $(DEPDIR)/cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/cache.c' object='cache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cache.obj `if test -f 'datawizard/cache.c'; then $(CYGPATH_W) 'datawizard/cache.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/cache.c'; fi` copy.o: datawizard/copy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy.o -MD -MP -MF $(DEPDIR)/copy.Tpo -c -o copy.o `test -f 'datawizard/copy.c' || echo '$(srcdir)/'`datawizard/copy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy.Tpo $(DEPDIR)/copy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/copy.c' object='copy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy.o `test -f 'datawizard/copy.c' || echo '$(srcdir)/'`datawizard/copy.c copy.obj: datawizard/copy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy.obj -MD -MP -MF $(DEPDIR)/copy.Tpo -c -o copy.obj `if test -f 'datawizard/copy.c'; then $(CYGPATH_W) 'datawizard/copy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/copy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy.Tpo $(DEPDIR)/copy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/copy.c' object='copy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy.obj `if test -f 'datawizard/copy.c'; then $(CYGPATH_W) 'datawizard/copy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/copy.c'; fi` critical_section_with_void_interface.o: datawizard/critical_section_with_void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT critical_section_with_void_interface.o -MD -MP -MF $(DEPDIR)/critical_section_with_void_interface.Tpo -c -o critical_section_with_void_interface.o `test -f 'datawizard/critical_section_with_void_interface.c' || echo '$(srcdir)/'`datawizard/critical_section_with_void_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/critical_section_with_void_interface.Tpo $(DEPDIR)/critical_section_with_void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/critical_section_with_void_interface.c' object='critical_section_with_void_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o critical_section_with_void_interface.o `test -f 'datawizard/critical_section_with_void_interface.c' || echo '$(srcdir)/'`datawizard/critical_section_with_void_interface.c critical_section_with_void_interface.obj: datawizard/critical_section_with_void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT critical_section_with_void_interface.obj -MD -MP -MF $(DEPDIR)/critical_section_with_void_interface.Tpo -c -o critical_section_with_void_interface.obj `if test -f 'datawizard/critical_section_with_void_interface.c'; then $(CYGPATH_W) 'datawizard/critical_section_with_void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/critical_section_with_void_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/critical_section_with_void_interface.Tpo $(DEPDIR)/critical_section_with_void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/critical_section_with_void_interface.c' object='critical_section_with_void_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o critical_section_with_void_interface.obj `if test -f 'datawizard/critical_section_with_void_interface.c'; then $(CYGPATH_W) 'datawizard/critical_section_with_void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/critical_section_with_void_interface.c'; fi` data_implicit_deps.o: datawizard/data_implicit_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_implicit_deps.o -MD -MP -MF $(DEPDIR)/data_implicit_deps.Tpo -c -o data_implicit_deps.o `test -f 'datawizard/data_implicit_deps.c' || echo '$(srcdir)/'`datawizard/data_implicit_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_implicit_deps.Tpo $(DEPDIR)/data_implicit_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_implicit_deps.c' object='data_implicit_deps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_implicit_deps.o `test -f 'datawizard/data_implicit_deps.c' || echo '$(srcdir)/'`datawizard/data_implicit_deps.c data_implicit_deps.obj: datawizard/data_implicit_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_implicit_deps.obj -MD -MP -MF $(DEPDIR)/data_implicit_deps.Tpo -c -o data_implicit_deps.obj `if test -f 'datawizard/data_implicit_deps.c'; then $(CYGPATH_W) 'datawizard/data_implicit_deps.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_implicit_deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_implicit_deps.Tpo $(DEPDIR)/data_implicit_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_implicit_deps.c' object='data_implicit_deps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_implicit_deps.obj `if test -f 'datawizard/data_implicit_deps.c'; then $(CYGPATH_W) 'datawizard/data_implicit_deps.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_implicit_deps.c'; fi` data_invalidation.o: datawizard/data_invalidation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_invalidation.o -MD -MP -MF $(DEPDIR)/data_invalidation.Tpo -c -o data_invalidation.o `test -f 'datawizard/data_invalidation.c' || echo '$(srcdir)/'`datawizard/data_invalidation.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_invalidation.Tpo $(DEPDIR)/data_invalidation.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_invalidation.c' object='data_invalidation.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_invalidation.o `test -f 'datawizard/data_invalidation.c' || echo '$(srcdir)/'`datawizard/data_invalidation.c data_invalidation.obj: datawizard/data_invalidation.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_invalidation.obj -MD -MP -MF $(DEPDIR)/data_invalidation.Tpo -c -o data_invalidation.obj `if test -f 'datawizard/data_invalidation.c'; then $(CYGPATH_W) 'datawizard/data_invalidation.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_invalidation.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_invalidation.Tpo $(DEPDIR)/data_invalidation.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_invalidation.c' object='data_invalidation.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_invalidation.obj `if test -f 'datawizard/data_invalidation.c'; then $(CYGPATH_W) 'datawizard/data_invalidation.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_invalidation.c'; fi` data_lookup.o: datawizard/data_lookup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_lookup.o -MD -MP -MF $(DEPDIR)/data_lookup.Tpo -c -o data_lookup.o `test -f 'datawizard/data_lookup.c' || echo '$(srcdir)/'`datawizard/data_lookup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_lookup.Tpo $(DEPDIR)/data_lookup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_lookup.c' object='data_lookup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_lookup.o `test -f 'datawizard/data_lookup.c' || echo '$(srcdir)/'`datawizard/data_lookup.c data_lookup.obj: datawizard/data_lookup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_lookup.obj -MD -MP -MF $(DEPDIR)/data_lookup.Tpo -c -o data_lookup.obj `if test -f 'datawizard/data_lookup.c'; then $(CYGPATH_W) 'datawizard/data_lookup.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_lookup.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_lookup.Tpo $(DEPDIR)/data_lookup.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/data_lookup.c' object='data_lookup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_lookup.obj `if test -f 'datawizard/data_lookup.c'; then $(CYGPATH_W) 'datawizard/data_lookup.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/data_lookup.c'; fi` dining_philosophers.o: datawizard/dining_philosophers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dining_philosophers.o -MD -MP -MF $(DEPDIR)/dining_philosophers.Tpo -c -o dining_philosophers.o `test -f 'datawizard/dining_philosophers.c' || echo '$(srcdir)/'`datawizard/dining_philosophers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dining_philosophers.Tpo $(DEPDIR)/dining_philosophers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dining_philosophers.c' object='dining_philosophers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dining_philosophers.o `test -f 'datawizard/dining_philosophers.c' || echo '$(srcdir)/'`datawizard/dining_philosophers.c dining_philosophers.obj: datawizard/dining_philosophers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dining_philosophers.obj -MD -MP -MF $(DEPDIR)/dining_philosophers.Tpo -c -o dining_philosophers.obj `if test -f 'datawizard/dining_philosophers.c'; then $(CYGPATH_W) 'datawizard/dining_philosophers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dining_philosophers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dining_philosophers.Tpo $(DEPDIR)/dining_philosophers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dining_philosophers.c' object='dining_philosophers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dining_philosophers.obj `if test -f 'datawizard/dining_philosophers.c'; then $(CYGPATH_W) 'datawizard/dining_philosophers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dining_philosophers.c'; fi` double_parameter.o: datawizard/double_parameter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT double_parameter.o -MD -MP -MF $(DEPDIR)/double_parameter.Tpo -c -o double_parameter.o `test -f 'datawizard/double_parameter.c' || echo '$(srcdir)/'`datawizard/double_parameter.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/double_parameter.Tpo $(DEPDIR)/double_parameter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/double_parameter.c' object='double_parameter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o double_parameter.o `test -f 'datawizard/double_parameter.c' || echo '$(srcdir)/'`datawizard/double_parameter.c double_parameter.obj: datawizard/double_parameter.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT double_parameter.obj -MD -MP -MF $(DEPDIR)/double_parameter.Tpo -c -o double_parameter.obj `if test -f 'datawizard/double_parameter.c'; then $(CYGPATH_W) 'datawizard/double_parameter.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/double_parameter.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/double_parameter.Tpo $(DEPDIR)/double_parameter.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/double_parameter.c' object='double_parameter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o double_parameter.obj `if test -f 'datawizard/double_parameter.c'; then $(CYGPATH_W) 'datawizard/double_parameter.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/double_parameter.c'; fi` dsm_stress.o: datawizard/dsm_stress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsm_stress.o -MD -MP -MF $(DEPDIR)/dsm_stress.Tpo -c -o dsm_stress.o `test -f 'datawizard/dsm_stress.c' || echo '$(srcdir)/'`datawizard/dsm_stress.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dsm_stress.Tpo $(DEPDIR)/dsm_stress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dsm_stress.c' object='dsm_stress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsm_stress.o `test -f 'datawizard/dsm_stress.c' || echo '$(srcdir)/'`datawizard/dsm_stress.c dsm_stress.obj: datawizard/dsm_stress.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dsm_stress.obj -MD -MP -MF $(DEPDIR)/dsm_stress.Tpo -c -o dsm_stress.obj `if test -f 'datawizard/dsm_stress.c'; then $(CYGPATH_W) 'datawizard/dsm_stress.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dsm_stress.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dsm_stress.Tpo $(DEPDIR)/dsm_stress.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/dsm_stress.c' object='dsm_stress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dsm_stress.obj `if test -f 'datawizard/dsm_stress.c'; then $(CYGPATH_W) 'datawizard/dsm_stress.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/dsm_stress.c'; fi` gpu_ptr_register.o: datawizard/gpu_ptr_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_ptr_register.o -MD -MP -MF $(DEPDIR)/gpu_ptr_register.Tpo -c -o gpu_ptr_register.o `test -f 'datawizard/gpu_ptr_register.c' || echo '$(srcdir)/'`datawizard/gpu_ptr_register.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_ptr_register.Tpo $(DEPDIR)/gpu_ptr_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_ptr_register.c' object='gpu_ptr_register.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_ptr_register.o `test -f 'datawizard/gpu_ptr_register.c' || echo '$(srcdir)/'`datawizard/gpu_ptr_register.c gpu_ptr_register.obj: datawizard/gpu_ptr_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_ptr_register.obj -MD -MP -MF $(DEPDIR)/gpu_ptr_register.Tpo -c -o gpu_ptr_register.obj `if test -f 'datawizard/gpu_ptr_register.c'; then $(CYGPATH_W) 'datawizard/gpu_ptr_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_ptr_register.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_ptr_register.Tpo $(DEPDIR)/gpu_ptr_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_ptr_register.c' object='gpu_ptr_register.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_ptr_register.obj `if test -f 'datawizard/gpu_ptr_register.c'; then $(CYGPATH_W) 'datawizard/gpu_ptr_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_ptr_register.c'; fi` scal.o: datawizard/scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scal.o -MD -MP -MF $(DEPDIR)/scal.Tpo -c -o scal.o `test -f 'datawizard/scal.c' || echo '$(srcdir)/'`datawizard/scal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scal.Tpo $(DEPDIR)/scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scal.c' object='scal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scal.o `test -f 'datawizard/scal.c' || echo '$(srcdir)/'`datawizard/scal.c scal.obj: datawizard/scal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT scal.obj -MD -MP -MF $(DEPDIR)/scal.Tpo -c -o scal.obj `if test -f 'datawizard/scal.c'; then $(CYGPATH_W) 'datawizard/scal.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/scal.Tpo $(DEPDIR)/scal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/scal.c' object='scal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o scal.obj `if test -f 'datawizard/scal.c'; then $(CYGPATH_W) 'datawizard/scal.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/scal.c'; fi` gpu_register.o: datawizard/gpu_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_register.o -MD -MP -MF $(DEPDIR)/gpu_register.Tpo -c -o gpu_register.o `test -f 'datawizard/gpu_register.c' || echo '$(srcdir)/'`datawizard/gpu_register.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_register.Tpo $(DEPDIR)/gpu_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_register.c' object='gpu_register.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_register.o `test -f 'datawizard/gpu_register.c' || echo '$(srcdir)/'`datawizard/gpu_register.c gpu_register.obj: datawizard/gpu_register.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpu_register.obj -MD -MP -MF $(DEPDIR)/gpu_register.Tpo -c -o gpu_register.obj `if test -f 'datawizard/gpu_register.c'; then $(CYGPATH_W) 'datawizard/gpu_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_register.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gpu_register.Tpo $(DEPDIR)/gpu_register.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/gpu_register.c' object='gpu_register.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpu_register.obj `if test -f 'datawizard/gpu_register.c'; then $(CYGPATH_W) 'datawizard/gpu_register.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/gpu_register.c'; fi` handle_to_pointer.o: datawizard/handle_to_pointer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT handle_to_pointer.o -MD -MP -MF $(DEPDIR)/handle_to_pointer.Tpo -c -o handle_to_pointer.o `test -f 'datawizard/handle_to_pointer.c' || echo '$(srcdir)/'`datawizard/handle_to_pointer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/handle_to_pointer.Tpo $(DEPDIR)/handle_to_pointer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/handle_to_pointer.c' object='handle_to_pointer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o handle_to_pointer.o `test -f 'datawizard/handle_to_pointer.c' || echo '$(srcdir)/'`datawizard/handle_to_pointer.c handle_to_pointer.obj: datawizard/handle_to_pointer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT handle_to_pointer.obj -MD -MP -MF $(DEPDIR)/handle_to_pointer.Tpo -c -o handle_to_pointer.obj `if test -f 'datawizard/handle_to_pointer.c'; then $(CYGPATH_W) 'datawizard/handle_to_pointer.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/handle_to_pointer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/handle_to_pointer.Tpo $(DEPDIR)/handle_to_pointer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/handle_to_pointer.c' object='handle_to_pointer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o handle_to_pointer.obj `if test -f 'datawizard/handle_to_pointer.c'; then $(CYGPATH_W) 'datawizard/handle_to_pointer.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/handle_to_pointer.c'; fi` in_place_partition.o: datawizard/in_place_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT in_place_partition.o -MD -MP -MF $(DEPDIR)/in_place_partition.Tpo -c -o in_place_partition.o `test -f 'datawizard/in_place_partition.c' || echo '$(srcdir)/'`datawizard/in_place_partition.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/in_place_partition.Tpo $(DEPDIR)/in_place_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/in_place_partition.c' object='in_place_partition.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_place_partition.o `test -f 'datawizard/in_place_partition.c' || echo '$(srcdir)/'`datawizard/in_place_partition.c in_place_partition.obj: datawizard/in_place_partition.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT in_place_partition.obj -MD -MP -MF $(DEPDIR)/in_place_partition.Tpo -c -o in_place_partition.obj `if test -f 'datawizard/in_place_partition.c'; then $(CYGPATH_W) 'datawizard/in_place_partition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/in_place_partition.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/in_place_partition.Tpo $(DEPDIR)/in_place_partition.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/in_place_partition.c' object='in_place_partition.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_place_partition.obj `if test -f 'datawizard/in_place_partition.c'; then $(CYGPATH_W) 'datawizard/in_place_partition.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/in_place_partition.c'; fi` increment_init.o: datawizard/increment_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_init.o -MD -MP -MF $(DEPDIR)/increment_init.Tpo -c -o increment_init.o `test -f 'datawizard/increment_init.c' || echo '$(srcdir)/'`datawizard/increment_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_init.Tpo $(DEPDIR)/increment_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_init.c' object='increment_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_init.o `test -f 'datawizard/increment_init.c' || echo '$(srcdir)/'`datawizard/increment_init.c increment_init.obj: datawizard/increment_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_init.obj -MD -MP -MF $(DEPDIR)/increment_init.Tpo -c -o increment_init.obj `if test -f 'datawizard/increment_init.c'; then $(CYGPATH_W) 'datawizard/increment_init.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_init.Tpo $(DEPDIR)/increment_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_init.c' object='increment_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_init.obj `if test -f 'datawizard/increment_init.c'; then $(CYGPATH_W) 'datawizard/increment_init.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_init.c'; fi` increment_redux.o: datawizard/increment_redux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux.o -MD -MP -MF $(DEPDIR)/increment_redux.Tpo -c -o increment_redux.o `test -f 'datawizard/increment_redux.c' || echo '$(srcdir)/'`datawizard/increment_redux.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux.Tpo $(DEPDIR)/increment_redux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux.c' object='increment_redux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux.o `test -f 'datawizard/increment_redux.c' || echo '$(srcdir)/'`datawizard/increment_redux.c increment_redux.obj: datawizard/increment_redux.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux.obj -MD -MP -MF $(DEPDIR)/increment_redux.Tpo -c -o increment_redux.obj `if test -f 'datawizard/increment_redux.c'; then $(CYGPATH_W) 'datawizard/increment_redux.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux.Tpo $(DEPDIR)/increment_redux.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux.c' object='increment_redux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux.obj `if test -f 'datawizard/increment_redux.c'; then $(CYGPATH_W) 'datawizard/increment_redux.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux.c'; fi` increment_redux_lazy.o: datawizard/increment_redux_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_lazy.o -MD -MP -MF $(DEPDIR)/increment_redux_lazy.Tpo -c -o increment_redux_lazy.o `test -f 'datawizard/increment_redux_lazy.c' || echo '$(srcdir)/'`datawizard/increment_redux_lazy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_lazy.Tpo $(DEPDIR)/increment_redux_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_lazy.c' object='increment_redux_lazy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_lazy.o `test -f 'datawizard/increment_redux_lazy.c' || echo '$(srcdir)/'`datawizard/increment_redux_lazy.c increment_redux_lazy.obj: datawizard/increment_redux_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_lazy.obj -MD -MP -MF $(DEPDIR)/increment_redux_lazy.Tpo -c -o increment_redux_lazy.obj `if test -f 'datawizard/increment_redux_lazy.c'; then $(CYGPATH_W) 'datawizard/increment_redux_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_lazy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_lazy.Tpo $(DEPDIR)/increment_redux_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_lazy.c' object='increment_redux_lazy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_lazy.obj `if test -f 'datawizard/increment_redux_lazy.c'; then $(CYGPATH_W) 'datawizard/increment_redux_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_lazy.c'; fi` increment_redux_v2.o: datawizard/increment_redux_v2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_v2.o -MD -MP -MF $(DEPDIR)/increment_redux_v2.Tpo -c -o increment_redux_v2.o `test -f 'datawizard/increment_redux_v2.c' || echo '$(srcdir)/'`datawizard/increment_redux_v2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_v2.Tpo $(DEPDIR)/increment_redux_v2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_v2.c' object='increment_redux_v2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_v2.o `test -f 'datawizard/increment_redux_v2.c' || echo '$(srcdir)/'`datawizard/increment_redux_v2.c increment_redux_v2.obj: datawizard/increment_redux_v2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT increment_redux_v2.obj -MD -MP -MF $(DEPDIR)/increment_redux_v2.Tpo -c -o increment_redux_v2.obj `if test -f 'datawizard/increment_redux_v2.c'; then $(CYGPATH_W) 'datawizard/increment_redux_v2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_v2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/increment_redux_v2.Tpo $(DEPDIR)/increment_redux_v2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/increment_redux_v2.c' object='increment_redux_v2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o increment_redux_v2.obj `if test -f 'datawizard/increment_redux_v2.c'; then $(CYGPATH_W) 'datawizard/increment_redux_v2.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/increment_redux_v2.c'; fi` test_interfaces.o: datawizard/interfaces/test_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_interfaces.o -MD -MP -MF $(DEPDIR)/test_interfaces.Tpo -c -o test_interfaces.o `test -f 'datawizard/interfaces/test_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/test_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_interfaces.Tpo $(DEPDIR)/test_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/test_interfaces.c' object='test_interfaces.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_interfaces.o `test -f 'datawizard/interfaces/test_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/test_interfaces.c test_interfaces.obj: datawizard/interfaces/test_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_interfaces.obj -MD -MP -MF $(DEPDIR)/test_interfaces.Tpo -c -o test_interfaces.obj `if test -f 'datawizard/interfaces/test_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/test_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/test_interfaces.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_interfaces.Tpo $(DEPDIR)/test_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/test_interfaces.c' object='test_interfaces.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_interfaces.obj `if test -f 'datawizard/interfaces/test_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/test_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/test_interfaces.c'; fi` bcsr_interface.o: datawizard/interfaces/bcsr/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_interface.o -MD -MP -MF $(DEPDIR)/bcsr_interface.Tpo -c -o bcsr_interface.o `test -f 'datawizard/interfaces/bcsr/bcsr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_interface.Tpo $(DEPDIR)/bcsr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_interface.c' object='bcsr_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_interface.o `test -f 'datawizard/interfaces/bcsr/bcsr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_interface.c bcsr_interface.obj: datawizard/interfaces/bcsr/bcsr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_interface.obj -MD -MP -MF $(DEPDIR)/bcsr_interface.Tpo -c -o bcsr_interface.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_interface.Tpo $(DEPDIR)/bcsr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_interface.c' object='bcsr_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_interface.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_interface.c'; fi` bcsr_opencl.o: datawizard/interfaces/bcsr/bcsr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_opencl.o -MD -MP -MF $(DEPDIR)/bcsr_opencl.Tpo -c -o bcsr_opencl.o `test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_opencl.Tpo $(DEPDIR)/bcsr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_opencl.c' object='bcsr_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_opencl.o `test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/bcsr/bcsr_opencl.c bcsr_opencl.obj: datawizard/interfaces/bcsr/bcsr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bcsr_opencl.obj -MD -MP -MF $(DEPDIR)/bcsr_opencl.Tpo -c -o bcsr_opencl.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bcsr_opencl.Tpo $(DEPDIR)/bcsr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/bcsr/bcsr_opencl.c' object='bcsr_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o bcsr_opencl.obj `if test -f 'datawizard/interfaces/bcsr/bcsr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/bcsr/bcsr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/bcsr/bcsr_opencl.c'; fi` block_interface.o: datawizard/interfaces/block/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_interface.o -MD -MP -MF $(DEPDIR)/block_interface.Tpo -c -o block_interface.o `test -f 'datawizard/interfaces/block/block_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_interface.Tpo $(DEPDIR)/block_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_interface.c' object='block_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_interface.o `test -f 'datawizard/interfaces/block/block_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_interface.c block_interface.obj: datawizard/interfaces/block/block_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_interface.obj -MD -MP -MF $(DEPDIR)/block_interface.Tpo -c -o block_interface.obj `if test -f 'datawizard/interfaces/block/block_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_interface.Tpo $(DEPDIR)/block_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_interface.c' object='block_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_interface.obj `if test -f 'datawizard/interfaces/block/block_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_interface.c'; fi` block_opencl.o: datawizard/interfaces/block/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_opencl.o -MD -MP -MF $(DEPDIR)/block_opencl.Tpo -c -o block_opencl.o `test -f 'datawizard/interfaces/block/block_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_opencl.Tpo $(DEPDIR)/block_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_opencl.c' object='block_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_opencl.o `test -f 'datawizard/interfaces/block/block_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/block/block_opencl.c block_opencl.obj: datawizard/interfaces/block/block_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT block_opencl.obj -MD -MP -MF $(DEPDIR)/block_opencl.Tpo -c -o block_opencl.obj `if test -f 'datawizard/interfaces/block/block_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/block_opencl.Tpo $(DEPDIR)/block_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/block/block_opencl.c' object='block_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o block_opencl.obj `if test -f 'datawizard/interfaces/block/block_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/block/block_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/block/block_opencl.c'; fi` coo_interface.o: datawizard/interfaces/coo/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_interface.o -MD -MP -MF $(DEPDIR)/coo_interface.Tpo -c -o coo_interface.o `test -f 'datawizard/interfaces/coo/coo_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_interface.Tpo $(DEPDIR)/coo_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_interface.c' object='coo_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_interface.o `test -f 'datawizard/interfaces/coo/coo_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_interface.c coo_interface.obj: datawizard/interfaces/coo/coo_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_interface.obj -MD -MP -MF $(DEPDIR)/coo_interface.Tpo -c -o coo_interface.obj `if test -f 'datawizard/interfaces/coo/coo_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_interface.Tpo $(DEPDIR)/coo_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_interface.c' object='coo_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_interface.obj `if test -f 'datawizard/interfaces/coo/coo_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_interface.c'; fi` coo_opencl.o: datawizard/interfaces/coo/coo_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_opencl.o -MD -MP -MF $(DEPDIR)/coo_opencl.Tpo -c -o coo_opencl.o `test -f 'datawizard/interfaces/coo/coo_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_opencl.Tpo $(DEPDIR)/coo_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_opencl.c' object='coo_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_opencl.o `test -f 'datawizard/interfaces/coo/coo_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/coo/coo_opencl.c coo_opencl.obj: datawizard/interfaces/coo/coo_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT coo_opencl.obj -MD -MP -MF $(DEPDIR)/coo_opencl.Tpo -c -o coo_opencl.obj `if test -f 'datawizard/interfaces/coo/coo_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/coo_opencl.Tpo $(DEPDIR)/coo_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/coo/coo_opencl.c' object='coo_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o coo_opencl.obj `if test -f 'datawizard/interfaces/coo/coo_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/coo/coo_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/coo/coo_opencl.c'; fi` copy_interfaces.o: datawizard/interfaces/copy_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy_interfaces.o -MD -MP -MF $(DEPDIR)/copy_interfaces.Tpo -c -o copy_interfaces.o `test -f 'datawizard/interfaces/copy_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/copy_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy_interfaces.Tpo $(DEPDIR)/copy_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/copy_interfaces.c' object='copy_interfaces.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy_interfaces.o `test -f 'datawizard/interfaces/copy_interfaces.c' || echo '$(srcdir)/'`datawizard/interfaces/copy_interfaces.c copy_interfaces.obj: datawizard/interfaces/copy_interfaces.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT copy_interfaces.obj -MD -MP -MF $(DEPDIR)/copy_interfaces.Tpo -c -o copy_interfaces.obj `if test -f 'datawizard/interfaces/copy_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/copy_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/copy_interfaces.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/copy_interfaces.Tpo $(DEPDIR)/copy_interfaces.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/copy_interfaces.c' object='copy_interfaces.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o copy_interfaces.obj `if test -f 'datawizard/interfaces/copy_interfaces.c'; then $(CYGPATH_W) 'datawizard/interfaces/copy_interfaces.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/copy_interfaces.c'; fi` csr_interface.o: datawizard/interfaces/csr/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_interface.o -MD -MP -MF $(DEPDIR)/csr_interface.Tpo -c -o csr_interface.o `test -f 'datawizard/interfaces/csr/csr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_interface.Tpo $(DEPDIR)/csr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_interface.c' object='csr_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_interface.o `test -f 'datawizard/interfaces/csr/csr_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_interface.c csr_interface.obj: datawizard/interfaces/csr/csr_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_interface.obj -MD -MP -MF $(DEPDIR)/csr_interface.Tpo -c -o csr_interface.obj `if test -f 'datawizard/interfaces/csr/csr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_interface.Tpo $(DEPDIR)/csr_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_interface.c' object='csr_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_interface.obj `if test -f 'datawizard/interfaces/csr/csr_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_interface.c'; fi` csr_opencl.o: datawizard/interfaces/csr/csr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_opencl.o -MD -MP -MF $(DEPDIR)/csr_opencl.Tpo -c -o csr_opencl.o `test -f 'datawizard/interfaces/csr/csr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_opencl.Tpo $(DEPDIR)/csr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_opencl.c' object='csr_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_opencl.o `test -f 'datawizard/interfaces/csr/csr_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/csr/csr_opencl.c csr_opencl.obj: datawizard/interfaces/csr/csr_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT csr_opencl.obj -MD -MP -MF $(DEPDIR)/csr_opencl.Tpo -c -o csr_opencl.obj `if test -f 'datawizard/interfaces/csr/csr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/csr_opencl.Tpo $(DEPDIR)/csr_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/csr/csr_opencl.c' object='csr_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o csr_opencl.obj `if test -f 'datawizard/interfaces/csr/csr_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/csr/csr_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/csr/csr_opencl.c'; fi` matrix_interface.o: datawizard/interfaces/matrix/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_interface.o -MD -MP -MF $(DEPDIR)/matrix_interface.Tpo -c -o matrix_interface.o `test -f 'datawizard/interfaces/matrix/matrix_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_interface.Tpo $(DEPDIR)/matrix_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_interface.c' object='matrix_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_interface.o `test -f 'datawizard/interfaces/matrix/matrix_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_interface.c matrix_interface.obj: datawizard/interfaces/matrix/matrix_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_interface.obj -MD -MP -MF $(DEPDIR)/matrix_interface.Tpo -c -o matrix_interface.obj `if test -f 'datawizard/interfaces/matrix/matrix_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_interface.Tpo $(DEPDIR)/matrix_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_interface.c' object='matrix_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_interface.obj `if test -f 'datawizard/interfaces/matrix/matrix_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_interface.c'; fi` matrix_opencl.o: datawizard/interfaces/matrix/matrix_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_opencl.o -MD -MP -MF $(DEPDIR)/matrix_opencl.Tpo -c -o matrix_opencl.o `test -f 'datawizard/interfaces/matrix/matrix_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_opencl.Tpo $(DEPDIR)/matrix_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_opencl.c' object='matrix_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_opencl.o `test -f 'datawizard/interfaces/matrix/matrix_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/matrix/matrix_opencl.c matrix_opencl.obj: datawizard/interfaces/matrix/matrix_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_opencl.obj -MD -MP -MF $(DEPDIR)/matrix_opencl.Tpo -c -o matrix_opencl.obj `if test -f 'datawizard/interfaces/matrix/matrix_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_opencl.Tpo $(DEPDIR)/matrix_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/matrix/matrix_opencl.c' object='matrix_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_opencl.obj `if test -f 'datawizard/interfaces/matrix/matrix_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/matrix/matrix_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/matrix/matrix_opencl.c'; fi` generic.o: datawizard/interfaces/multiformat/advanced/generic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT generic.o -MD -MP -MF $(DEPDIR)/generic.Tpo -c -o generic.o `test -f 'datawizard/interfaces/multiformat/advanced/generic.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/generic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generic.Tpo $(DEPDIR)/generic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/generic.c' object='generic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o generic.o `test -f 'datawizard/interfaces/multiformat/advanced/generic.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/generic.c generic.obj: datawizard/interfaces/multiformat/advanced/generic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT generic.obj -MD -MP -MF $(DEPDIR)/generic.Tpo -c -o generic.obj `if test -f 'datawizard/interfaces/multiformat/advanced/generic.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/generic.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/generic.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generic.Tpo $(DEPDIR)/generic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/generic.c' object='generic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o generic.obj `if test -f 'datawizard/interfaces/multiformat/advanced/generic.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/generic.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/generic.c'; fi` multiformat_cuda_opencl.o: datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_cuda_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_cuda_opencl.Tpo -c -o multiformat_cuda_opencl.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_cuda_opencl.Tpo $(DEPDIR)/multiformat_cuda_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' object='multiformat_cuda_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_cuda_opencl.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c multiformat_cuda_opencl.obj: datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_cuda_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_cuda_opencl.Tpo -c -o multiformat_cuda_opencl.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_cuda_opencl.Tpo $(DEPDIR)/multiformat_cuda_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c' object='multiformat_cuda_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_cuda_opencl.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c'; fi` multiformat_data_release.o: datawizard/interfaces/multiformat/advanced/multiformat_data_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_data_release.o -MD -MP -MF $(DEPDIR)/multiformat_data_release.Tpo -c -o multiformat_data_release.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_data_release.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_data_release.Tpo $(DEPDIR)/multiformat_data_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' object='multiformat_data_release.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_data_release.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_data_release.c multiformat_data_release.obj: datawizard/interfaces/multiformat/advanced/multiformat_data_release.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_data_release.obj -MD -MP -MF $(DEPDIR)/multiformat_data_release.Tpo -c -o multiformat_data_release.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_data_release.Tpo $(DEPDIR)/multiformat_data_release.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_data_release.c' object='multiformat_data_release.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_data_release.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c'; fi` multiformat_handle_conversion.o: datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_handle_conversion.o -MD -MP -MF $(DEPDIR)/multiformat_handle_conversion.Tpo -c -o multiformat_handle_conversion.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_handle_conversion.Tpo $(DEPDIR)/multiformat_handle_conversion.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' object='multiformat_handle_conversion.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_handle_conversion.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c multiformat_handle_conversion.obj: datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_handle_conversion.obj -MD -MP -MF $(DEPDIR)/multiformat_handle_conversion.Tpo -c -o multiformat_handle_conversion.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_handle_conversion.Tpo $(DEPDIR)/multiformat_handle_conversion.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c' object='multiformat_handle_conversion.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_handle_conversion.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c'; fi` multiformat_worker.o: datawizard/interfaces/multiformat/advanced/multiformat_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_worker.o -MD -MP -MF $(DEPDIR)/multiformat_worker.Tpo -c -o multiformat_worker.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_worker.Tpo $(DEPDIR)/multiformat_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_worker.c' object='multiformat_worker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_worker.o `test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/multiformat_worker.c multiformat_worker.obj: datawizard/interfaces/multiformat/advanced/multiformat_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_worker.obj -MD -MP -MF $(DEPDIR)/multiformat_worker.Tpo -c -o multiformat_worker.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_worker.Tpo $(DEPDIR)/multiformat_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/multiformat_worker.c' object='multiformat_worker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_worker.obj `if test -f 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/multiformat_worker.c'; fi` same_handle.o: datawizard/interfaces/multiformat/advanced/same_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT same_handle.o -MD -MP -MF $(DEPDIR)/same_handle.Tpo -c -o same_handle.o `test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/same_handle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/same_handle.Tpo $(DEPDIR)/same_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/same_handle.c' object='same_handle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o same_handle.o `test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/advanced/same_handle.c same_handle.obj: datawizard/interfaces/multiformat/advanced/same_handle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT same_handle.obj -MD -MP -MF $(DEPDIR)/same_handle.Tpo -c -o same_handle.obj `if test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/same_handle.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/same_handle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/same_handle.Tpo $(DEPDIR)/same_handle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/advanced/same_handle.c' object='same_handle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o same_handle.obj `if test -f 'datawizard/interfaces/multiformat/advanced/same_handle.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/advanced/same_handle.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/advanced/same_handle.c'; fi` multiformat_interface.o: datawizard/interfaces/multiformat/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_interface.o -MD -MP -MF $(DEPDIR)/multiformat_interface.Tpo -c -o multiformat_interface.o `test -f 'datawizard/interfaces/multiformat/multiformat_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_interface.Tpo $(DEPDIR)/multiformat_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_interface.c' object='multiformat_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_interface.o `test -f 'datawizard/interfaces/multiformat/multiformat_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_interface.c multiformat_interface.obj: datawizard/interfaces/multiformat/multiformat_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_interface.obj -MD -MP -MF $(DEPDIR)/multiformat_interface.Tpo -c -o multiformat_interface.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_interface.Tpo $(DEPDIR)/multiformat_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_interface.c' object='multiformat_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_interface.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_interface.c'; fi` multiformat_conversion_codelets.o: datawizard/interfaces/multiformat/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets.o -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets.Tpo -c -o multiformat_conversion_codelets.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets.Tpo $(DEPDIR)/multiformat_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' object='multiformat_conversion_codelets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets.c multiformat_conversion_codelets.obj: datawizard/interfaces/multiformat/multiformat_conversion_codelets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets.obj -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets.Tpo -c -o multiformat_conversion_codelets.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets.Tpo $(DEPDIR)/multiformat_conversion_codelets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets.c' object='multiformat_conversion_codelets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c'; fi` multiformat_opencl.o: datawizard/interfaces/multiformat/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_opencl.Tpo -c -o multiformat_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_opencl.Tpo $(DEPDIR)/multiformat_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_opencl.c' object='multiformat_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_opencl.c multiformat_opencl.obj: datawizard/interfaces/multiformat/multiformat_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_opencl.Tpo -c -o multiformat_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_opencl.Tpo $(DEPDIR)/multiformat_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_opencl.c' object='multiformat_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_opencl.c'; fi` multiformat_conversion_codelets_opencl.o: datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets_opencl.o -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo -c -o multiformat_conversion_codelets_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo $(DEPDIR)/multiformat_conversion_codelets_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' object='multiformat_conversion_codelets_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets_opencl.o `test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c multiformat_conversion_codelets_opencl.obj: datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiformat_conversion_codelets_opencl.obj -MD -MP -MF $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo -c -o multiformat_conversion_codelets_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiformat_conversion_codelets_opencl.Tpo $(DEPDIR)/multiformat_conversion_codelets_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c' object='multiformat_conversion_codelets_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multiformat_conversion_codelets_opencl.obj `if test -f 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c'; fi` variable_interface.o: datawizard/interfaces/variable/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_interface.o -MD -MP -MF $(DEPDIR)/variable_interface.Tpo -c -o variable_interface.o `test -f 'datawizard/interfaces/variable/variable_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_interface.Tpo $(DEPDIR)/variable_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_interface.c' object='variable_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_interface.o `test -f 'datawizard/interfaces/variable/variable_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_interface.c variable_interface.obj: datawizard/interfaces/variable/variable_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_interface.obj -MD -MP -MF $(DEPDIR)/variable_interface.Tpo -c -o variable_interface.obj `if test -f 'datawizard/interfaces/variable/variable_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_interface.Tpo $(DEPDIR)/variable_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_interface.c' object='variable_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_interface.obj `if test -f 'datawizard/interfaces/variable/variable_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_interface.c'; fi` variable_opencl.o: datawizard/interfaces/variable/variable_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_opencl.o -MD -MP -MF $(DEPDIR)/variable_opencl.Tpo -c -o variable_opencl.o `test -f 'datawizard/interfaces/variable/variable_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_opencl.Tpo $(DEPDIR)/variable_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_opencl.c' object='variable_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_opencl.o `test -f 'datawizard/interfaces/variable/variable_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/variable/variable_opencl.c variable_opencl.obj: datawizard/interfaces/variable/variable_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT variable_opencl.obj -MD -MP -MF $(DEPDIR)/variable_opencl.Tpo -c -o variable_opencl.obj `if test -f 'datawizard/interfaces/variable/variable_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/variable_opencl.Tpo $(DEPDIR)/variable_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/variable/variable_opencl.c' object='variable_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o variable_opencl.obj `if test -f 'datawizard/interfaces/variable/variable_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/variable/variable_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/variable/variable_opencl.c'; fi` test_vector_interface.o: datawizard/interfaces/vector/test_vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_interface.o -MD -MP -MF $(DEPDIR)/test_vector_interface.Tpo -c -o test_vector_interface.o `test -f 'datawizard/interfaces/vector/test_vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_interface.Tpo $(DEPDIR)/test_vector_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_interface.c' object='test_vector_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_interface.o `test -f 'datawizard/interfaces/vector/test_vector_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_interface.c test_vector_interface.obj: datawizard/interfaces/vector/test_vector_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_interface.obj -MD -MP -MF $(DEPDIR)/test_vector_interface.Tpo -c -o test_vector_interface.obj `if test -f 'datawizard/interfaces/vector/test_vector_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_interface.Tpo $(DEPDIR)/test_vector_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_interface.c' object='test_vector_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_interface.obj `if test -f 'datawizard/interfaces/vector/test_vector_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_interface.c'; fi` test_vector_opencl.o: datawizard/interfaces/vector/test_vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_opencl.o -MD -MP -MF $(DEPDIR)/test_vector_opencl.Tpo -c -o test_vector_opencl.o `test -f 'datawizard/interfaces/vector/test_vector_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_opencl.Tpo $(DEPDIR)/test_vector_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_opencl.c' object='test_vector_opencl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_opencl.o `test -f 'datawizard/interfaces/vector/test_vector_opencl.c' || echo '$(srcdir)/'`datawizard/interfaces/vector/test_vector_opencl.c test_vector_opencl.obj: datawizard/interfaces/vector/test_vector_opencl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_vector_opencl.obj -MD -MP -MF $(DEPDIR)/test_vector_opencl.Tpo -c -o test_vector_opencl.obj `if test -f 'datawizard/interfaces/vector/test_vector_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_opencl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_vector_opencl.Tpo $(DEPDIR)/test_vector_opencl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/vector/test_vector_opencl.c' object='test_vector_opencl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_vector_opencl.obj `if test -f 'datawizard/interfaces/vector/test_vector_opencl.c'; then $(CYGPATH_W) 'datawizard/interfaces/vector/test_vector_opencl.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/vector/test_vector_opencl.c'; fi` void_interface.o: datawizard/interfaces/void/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT void_interface.o -MD -MP -MF $(DEPDIR)/void_interface.Tpo -c -o void_interface.o `test -f 'datawizard/interfaces/void/void_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/void/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/void_interface.Tpo $(DEPDIR)/void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/void/void_interface.c' object='void_interface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o void_interface.o `test -f 'datawizard/interfaces/void/void_interface.c' || echo '$(srcdir)/'`datawizard/interfaces/void/void_interface.c void_interface.obj: datawizard/interfaces/void/void_interface.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT void_interface.obj -MD -MP -MF $(DEPDIR)/void_interface.Tpo -c -o void_interface.obj `if test -f 'datawizard/interfaces/void/void_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/void/void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/void/void_interface.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/void_interface.Tpo $(DEPDIR)/void_interface.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/interfaces/void/void_interface.c' object='void_interface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o void_interface.obj `if test -f 'datawizard/interfaces/void/void_interface.c'; then $(CYGPATH_W) 'datawizard/interfaces/void/void_interface.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/interfaces/void/void_interface.c'; fi` 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` 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` nowhere.o: datawizard/nowhere.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nowhere.o -MD -MP -MF $(DEPDIR)/nowhere.Tpo -c -o nowhere.o `test -f 'datawizard/nowhere.c' || echo '$(srcdir)/'`datawizard/nowhere.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nowhere.Tpo $(DEPDIR)/nowhere.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/nowhere.c' object='nowhere.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nowhere.o `test -f 'datawizard/nowhere.c' || echo '$(srcdir)/'`datawizard/nowhere.c nowhere.obj: datawizard/nowhere.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT nowhere.obj -MD -MP -MF $(DEPDIR)/nowhere.Tpo -c -o nowhere.obj `if test -f 'datawizard/nowhere.c'; then $(CYGPATH_W) 'datawizard/nowhere.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/nowhere.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/nowhere.Tpo $(DEPDIR)/nowhere.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/nowhere.c' object='nowhere.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o nowhere.obj `if test -f 'datawizard/nowhere.c'; then $(CYGPATH_W) 'datawizard/nowhere.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/nowhere.c'; fi` partition_lazy.o: datawizard/partition_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_lazy.o -MD -MP -MF $(DEPDIR)/partition_lazy.Tpo -c -o partition_lazy.o `test -f 'datawizard/partition_lazy.c' || echo '$(srcdir)/'`datawizard/partition_lazy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_lazy.Tpo $(DEPDIR)/partition_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_lazy.c' object='partition_lazy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partition_lazy.o `test -f 'datawizard/partition_lazy.c' || echo '$(srcdir)/'`datawizard/partition_lazy.c partition_lazy.obj: datawizard/partition_lazy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT partition_lazy.obj -MD -MP -MF $(DEPDIR)/partition_lazy.Tpo -c -o partition_lazy.obj `if test -f 'datawizard/partition_lazy.c'; then $(CYGPATH_W) 'datawizard/partition_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_lazy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/partition_lazy.Tpo $(DEPDIR)/partition_lazy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/partition_lazy.c' object='partition_lazy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o partition_lazy.obj `if test -f 'datawizard/partition_lazy.c'; then $(CYGPATH_W) 'datawizard/partition_lazy.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/partition_lazy.c'; fi` readers_and_writers.o: datawizard/readers_and_writers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readers_and_writers.o -MD -MP -MF $(DEPDIR)/readers_and_writers.Tpo -c -o readers_and_writers.o `test -f 'datawizard/readers_and_writers.c' || echo '$(srcdir)/'`datawizard/readers_and_writers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readers_and_writers.Tpo $(DEPDIR)/readers_and_writers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readers_and_writers.c' object='readers_and_writers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readers_and_writers.o `test -f 'datawizard/readers_and_writers.c' || echo '$(srcdir)/'`datawizard/readers_and_writers.c readers_and_writers.obj: datawizard/readers_and_writers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readers_and_writers.obj -MD -MP -MF $(DEPDIR)/readers_and_writers.Tpo -c -o readers_and_writers.obj `if test -f 'datawizard/readers_and_writers.c'; then $(CYGPATH_W) 'datawizard/readers_and_writers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readers_and_writers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readers_and_writers.Tpo $(DEPDIR)/readers_and_writers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readers_and_writers.c' object='readers_and_writers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readers_and_writers.obj `if test -f 'datawizard/readers_and_writers.c'; then $(CYGPATH_W) 'datawizard/readers_and_writers.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readers_and_writers.c'; fi` readonly.o: datawizard/readonly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readonly.o -MD -MP -MF $(DEPDIR)/readonly.Tpo -c -o readonly.o `test -f 'datawizard/readonly.c' || echo '$(srcdir)/'`datawizard/readonly.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readonly.Tpo $(DEPDIR)/readonly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readonly.c' object='readonly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readonly.o `test -f 'datawizard/readonly.c' || echo '$(srcdir)/'`datawizard/readonly.c readonly.obj: datawizard/readonly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT readonly.obj -MD -MP -MF $(DEPDIR)/readonly.Tpo -c -o readonly.obj `if test -f 'datawizard/readonly.c'; then $(CYGPATH_W) 'datawizard/readonly.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readonly.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readonly.Tpo $(DEPDIR)/readonly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/readonly.c' object='readonly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o readonly.obj `if test -f 'datawizard/readonly.c'; then $(CYGPATH_W) 'datawizard/readonly.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/readonly.c'; fi` reclaim.o: datawizard/reclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT reclaim.o -MD -MP -MF $(DEPDIR)/reclaim.Tpo -c -o reclaim.o `test -f 'datawizard/reclaim.c' || echo '$(srcdir)/'`datawizard/reclaim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reclaim.Tpo $(DEPDIR)/reclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/reclaim.c' object='reclaim.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o reclaim.o `test -f 'datawizard/reclaim.c' || echo '$(srcdir)/'`datawizard/reclaim.c reclaim.obj: datawizard/reclaim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT reclaim.obj -MD -MP -MF $(DEPDIR)/reclaim.Tpo -c -o reclaim.obj `if test -f 'datawizard/reclaim.c'; then $(CYGPATH_W) 'datawizard/reclaim.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/reclaim.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/reclaim.Tpo $(DEPDIR)/reclaim.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='datawizard/reclaim.c' object='reclaim.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o reclaim.obj `if test -f 'datawizard/reclaim.c'; then $(CYGPATH_W) 'datawizard/reclaim.c'; else $(CYGPATH_W) '$(srcdir)/datawizard/reclaim.c'; fi` 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` 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` 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` 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` invalid_blocking_calls.o: errorcheck/invalid_blocking_calls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_blocking_calls.o -MD -MP -MF $(DEPDIR)/invalid_blocking_calls.Tpo -c -o invalid_blocking_calls.o `test -f 'errorcheck/invalid_blocking_calls.c' || echo '$(srcdir)/'`errorcheck/invalid_blocking_calls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_blocking_calls.Tpo $(DEPDIR)/invalid_blocking_calls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_blocking_calls.c' object='invalid_blocking_calls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_blocking_calls.o `test -f 'errorcheck/invalid_blocking_calls.c' || echo '$(srcdir)/'`errorcheck/invalid_blocking_calls.c invalid_blocking_calls.obj: errorcheck/invalid_blocking_calls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_blocking_calls.obj -MD -MP -MF $(DEPDIR)/invalid_blocking_calls.Tpo -c -o invalid_blocking_calls.obj `if test -f 'errorcheck/invalid_blocking_calls.c'; then $(CYGPATH_W) 'errorcheck/invalid_blocking_calls.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_blocking_calls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_blocking_calls.Tpo $(DEPDIR)/invalid_blocking_calls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_blocking_calls.c' object='invalid_blocking_calls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_blocking_calls.obj `if test -f 'errorcheck/invalid_blocking_calls.c'; then $(CYGPATH_W) 'errorcheck/invalid_blocking_calls.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_blocking_calls.c'; fi` invalid_tasks.o: errorcheck/invalid_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_tasks.o -MD -MP -MF $(DEPDIR)/invalid_tasks.Tpo -c -o invalid_tasks.o `test -f 'errorcheck/invalid_tasks.c' || echo '$(srcdir)/'`errorcheck/invalid_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_tasks.Tpo $(DEPDIR)/invalid_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_tasks.c' object='invalid_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_tasks.o `test -f 'errorcheck/invalid_tasks.c' || echo '$(srcdir)/'`errorcheck/invalid_tasks.c invalid_tasks.obj: errorcheck/invalid_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT invalid_tasks.obj -MD -MP -MF $(DEPDIR)/invalid_tasks.Tpo -c -o invalid_tasks.obj `if test -f 'errorcheck/invalid_tasks.c'; then $(CYGPATH_W) 'errorcheck/invalid_tasks.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/invalid_tasks.Tpo $(DEPDIR)/invalid_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/invalid_tasks.c' object='invalid_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o invalid_tasks.obj `if test -f 'errorcheck/invalid_tasks.c'; then $(CYGPATH_W) 'errorcheck/invalid_tasks.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/invalid_tasks.c'; fi` starpu_init_noworker.o: errorcheck/starpu_init_noworker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init_noworker.o -MD -MP -MF $(DEPDIR)/starpu_init_noworker.Tpo -c -o starpu_init_noworker.o `test -f 'errorcheck/starpu_init_noworker.c' || echo '$(srcdir)/'`errorcheck/starpu_init_noworker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init_noworker.Tpo $(DEPDIR)/starpu_init_noworker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/starpu_init_noworker.c' object='starpu_init_noworker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init_noworker.o `test -f 'errorcheck/starpu_init_noworker.c' || echo '$(srcdir)/'`errorcheck/starpu_init_noworker.c starpu_init_noworker.obj: errorcheck/starpu_init_noworker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init_noworker.obj -MD -MP -MF $(DEPDIR)/starpu_init_noworker.Tpo -c -o starpu_init_noworker.obj `if test -f 'errorcheck/starpu_init_noworker.c'; then $(CYGPATH_W) 'errorcheck/starpu_init_noworker.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/starpu_init_noworker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init_noworker.Tpo $(DEPDIR)/starpu_init_noworker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='errorcheck/starpu_init_noworker.c' object='starpu_init_noworker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init_noworker.obj `if test -f 'errorcheck/starpu_init_noworker.c'; then $(CYGPATH_W) 'errorcheck/starpu_init_noworker.c'; else $(CYGPATH_W) '$(srcdir)/errorcheck/starpu_init_noworker.c'; fi` cublas_init.o: helper/cublas_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cublas_init.o -MD -MP -MF $(DEPDIR)/cublas_init.Tpo -c -o cublas_init.o `test -f 'helper/cublas_init.c' || echo '$(srcdir)/'`helper/cublas_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cublas_init.Tpo $(DEPDIR)/cublas_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/cublas_init.c' object='cublas_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cublas_init.o `test -f 'helper/cublas_init.c' || echo '$(srcdir)/'`helper/cublas_init.c cublas_init.obj: helper/cublas_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cublas_init.obj -MD -MP -MF $(DEPDIR)/cublas_init.Tpo -c -o cublas_init.obj `if test -f 'helper/cublas_init.c'; then $(CYGPATH_W) 'helper/cublas_init.c'; else $(CYGPATH_W) '$(srcdir)/helper/cublas_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cublas_init.Tpo $(DEPDIR)/cublas_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='helper/cublas_init.c' object='cublas_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cublas_init.obj `if test -f 'helper/cublas_init.c'; then $(CYGPATH_W) 'helper/cublas_init.c'; else $(CYGPATH_W) '$(srcdir)/helper/cublas_init.c'; fi` 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` 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_buffer-deprecated_buffer.o: main/deprecated_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_buffer_CFLAGS) $(CFLAGS) -MT main_deprecated_buffer-deprecated_buffer.o -MD -MP -MF $(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Tpo -c -o main_deprecated_buffer-deprecated_buffer.o `test -f 'main/deprecated_buffer.c' || echo '$(srcdir)/'`main/deprecated_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Tpo $(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deprecated_buffer.c' object='main_deprecated_buffer-deprecated_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) $(main_deprecated_buffer_CFLAGS) $(CFLAGS) -c -o main_deprecated_buffer-deprecated_buffer.o `test -f 'main/deprecated_buffer.c' || echo '$(srcdir)/'`main/deprecated_buffer.c main_deprecated_buffer-deprecated_buffer.obj: main/deprecated_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_buffer_CFLAGS) $(CFLAGS) -MT main_deprecated_buffer-deprecated_buffer.obj -MD -MP -MF $(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Tpo -c -o main_deprecated_buffer-deprecated_buffer.obj `if test -f 'main/deprecated_buffer.c'; then $(CYGPATH_W) 'main/deprecated_buffer.c'; else $(CYGPATH_W) '$(srcdir)/main/deprecated_buffer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Tpo $(DEPDIR)/main_deprecated_buffer-deprecated_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deprecated_buffer.c' object='main_deprecated_buffer-deprecated_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) $(main_deprecated_buffer_CFLAGS) $(CFLAGS) -c -o main_deprecated_buffer-deprecated_buffer.obj `if test -f 'main/deprecated_buffer.c'; then $(CYGPATH_W) 'main/deprecated_buffer.c'; else $(CYGPATH_W) '$(srcdir)/main/deprecated_buffer.c'; fi` main_deprecated_func-deprecated_func.o: main/deprecated_func.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -MT main_deprecated_func-deprecated_func.o -MD -MP -MF $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo -c -o main_deprecated_func-deprecated_func.o `test -f 'main/deprecated_func.c' || echo '$(srcdir)/'`main/deprecated_func.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo $(DEPDIR)/main_deprecated_func-deprecated_func.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deprecated_func.c' object='main_deprecated_func-deprecated_func.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -c -o main_deprecated_func-deprecated_func.o `test -f 'main/deprecated_func.c' || echo '$(srcdir)/'`main/deprecated_func.c main_deprecated_func-deprecated_func.obj: main/deprecated_func.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -MT main_deprecated_func-deprecated_func.obj -MD -MP -MF $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo -c -o main_deprecated_func-deprecated_func.obj `if test -f 'main/deprecated_func.c'; then $(CYGPATH_W) 'main/deprecated_func.c'; else $(CYGPATH_W) '$(srcdir)/main/deprecated_func.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/main_deprecated_func-deprecated_func.Tpo $(DEPDIR)/main_deprecated_func-deprecated_func.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/deprecated_func.c' object='main_deprecated_func-deprecated_func.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(main_deprecated_func_CFLAGS) $(CFLAGS) -c -o main_deprecated_func-deprecated_func.obj `if test -f 'main/deprecated_func.c'; then $(CYGPATH_W) 'main/deprecated_func.c'; else $(CYGPATH_W) '$(srcdir)/main/deprecated_func.c'; fi` init_run_deinit.o: main/driver_api/init_run_deinit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_run_deinit.o -MD -MP -MF $(DEPDIR)/init_run_deinit.Tpo -c -o init_run_deinit.o `test -f 'main/driver_api/init_run_deinit.c' || echo '$(srcdir)/'`main/driver_api/init_run_deinit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_run_deinit.Tpo $(DEPDIR)/init_run_deinit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/init_run_deinit.c' object='init_run_deinit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_run_deinit.o `test -f 'main/driver_api/init_run_deinit.c' || echo '$(srcdir)/'`main/driver_api/init_run_deinit.c init_run_deinit.obj: main/driver_api/init_run_deinit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT init_run_deinit.obj -MD -MP -MF $(DEPDIR)/init_run_deinit.Tpo -c -o init_run_deinit.obj `if test -f 'main/driver_api/init_run_deinit.c'; then $(CYGPATH_W) 'main/driver_api/init_run_deinit.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/init_run_deinit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/init_run_deinit.Tpo $(DEPDIR)/init_run_deinit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/init_run_deinit.c' object='init_run_deinit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o init_run_deinit.obj `if test -f 'main/driver_api/init_run_deinit.c'; then $(CYGPATH_W) 'main/driver_api/init_run_deinit.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/init_run_deinit.c'; fi` run_driver.o: main/driver_api/run_driver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT run_driver.o -MD -MP -MF $(DEPDIR)/run_driver.Tpo -c -o run_driver.o `test -f 'main/driver_api/run_driver.c' || echo '$(srcdir)/'`main/driver_api/run_driver.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/run_driver.Tpo $(DEPDIR)/run_driver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/run_driver.c' object='run_driver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o run_driver.o `test -f 'main/driver_api/run_driver.c' || echo '$(srcdir)/'`main/driver_api/run_driver.c run_driver.obj: main/driver_api/run_driver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT run_driver.obj -MD -MP -MF $(DEPDIR)/run_driver.Tpo -c -o run_driver.obj `if test -f 'main/driver_api/run_driver.c'; then $(CYGPATH_W) 'main/driver_api/run_driver.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/run_driver.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/run_driver.Tpo $(DEPDIR)/run_driver.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/driver_api/run_driver.c' object='run_driver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o run_driver.obj `if test -f 'main/driver_api/run_driver.c'; then $(CYGPATH_W) 'main/driver_api/run_driver.c'; else $(CYGPATH_W) '$(srcdir)/main/driver_api/run_driver.c'; fi` empty_task.o: main/empty_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task.o -MD -MP -MF $(DEPDIR)/empty_task.Tpo -c -o empty_task.o `test -f 'main/empty_task.c' || echo '$(srcdir)/'`main/empty_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task.Tpo $(DEPDIR)/empty_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task.c' object='empty_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task.o `test -f 'main/empty_task.c' || echo '$(srcdir)/'`main/empty_task.c empty_task.obj: main/empty_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task.obj -MD -MP -MF $(DEPDIR)/empty_task.Tpo -c -o empty_task.obj `if test -f 'main/empty_task.c'; then $(CYGPATH_W) 'main/empty_task.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task.Tpo $(DEPDIR)/empty_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task.c' object='empty_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task.obj `if test -f 'main/empty_task.c'; then $(CYGPATH_W) 'main/empty_task.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task.c'; fi` empty_task_chain.o: main/empty_task_chain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_chain.o -MD -MP -MF $(DEPDIR)/empty_task_chain.Tpo -c -o empty_task_chain.o `test -f 'main/empty_task_chain.c' || echo '$(srcdir)/'`main/empty_task_chain.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_chain.Tpo $(DEPDIR)/empty_task_chain.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_chain.c' object='empty_task_chain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_chain.o `test -f 'main/empty_task_chain.c' || echo '$(srcdir)/'`main/empty_task_chain.c empty_task_chain.obj: main/empty_task_chain.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_chain.obj -MD -MP -MF $(DEPDIR)/empty_task_chain.Tpo -c -o empty_task_chain.obj `if test -f 'main/empty_task_chain.c'; then $(CYGPATH_W) 'main/empty_task_chain.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_chain.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_chain.Tpo $(DEPDIR)/empty_task_chain.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_chain.c' object='empty_task_chain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_chain.obj `if test -f 'main/empty_task_chain.c'; then $(CYGPATH_W) 'main/empty_task_chain.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_chain.c'; fi` empty_task_sync_point.o: main/empty_task_sync_point.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point.o -MD -MP -MF $(DEPDIR)/empty_task_sync_point.Tpo -c -o empty_task_sync_point.o `test -f 'main/empty_task_sync_point.c' || echo '$(srcdir)/'`main/empty_task_sync_point.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point.Tpo $(DEPDIR)/empty_task_sync_point.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point.c' object='empty_task_sync_point.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point.o `test -f 'main/empty_task_sync_point.c' || echo '$(srcdir)/'`main/empty_task_sync_point.c empty_task_sync_point.obj: main/empty_task_sync_point.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point.obj -MD -MP -MF $(DEPDIR)/empty_task_sync_point.Tpo -c -o empty_task_sync_point.obj `if test -f 'main/empty_task_sync_point.c'; then $(CYGPATH_W) 'main/empty_task_sync_point.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point.Tpo $(DEPDIR)/empty_task_sync_point.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point.c' object='empty_task_sync_point.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point.obj `if test -f 'main/empty_task_sync_point.c'; then $(CYGPATH_W) 'main/empty_task_sync_point.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point.c'; fi` empty_task_sync_point_tasks.o: main/empty_task_sync_point_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point_tasks.o -MD -MP -MF $(DEPDIR)/empty_task_sync_point_tasks.Tpo -c -o empty_task_sync_point_tasks.o `test -f 'main/empty_task_sync_point_tasks.c' || echo '$(srcdir)/'`main/empty_task_sync_point_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point_tasks.Tpo $(DEPDIR)/empty_task_sync_point_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point_tasks.c' object='empty_task_sync_point_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point_tasks.o `test -f 'main/empty_task_sync_point_tasks.c' || echo '$(srcdir)/'`main/empty_task_sync_point_tasks.c empty_task_sync_point_tasks.obj: main/empty_task_sync_point_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT empty_task_sync_point_tasks.obj -MD -MP -MF $(DEPDIR)/empty_task_sync_point_tasks.Tpo -c -o empty_task_sync_point_tasks.obj `if test -f 'main/empty_task_sync_point_tasks.c'; then $(CYGPATH_W) 'main/empty_task_sync_point_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/empty_task_sync_point_tasks.Tpo $(DEPDIR)/empty_task_sync_point_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/empty_task_sync_point_tasks.c' object='empty_task_sync_point_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o empty_task_sync_point_tasks.obj `if test -f 'main/empty_task_sync_point_tasks.c'; then $(CYGPATH_W) 'main/empty_task_sync_point_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/empty_task_sync_point_tasks.c'; fi` execute_on_a_specific_worker.o: main/execute_on_a_specific_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_on_a_specific_worker.o -MD -MP -MF $(DEPDIR)/execute_on_a_specific_worker.Tpo -c -o execute_on_a_specific_worker.o `test -f 'main/execute_on_a_specific_worker.c' || echo '$(srcdir)/'`main/execute_on_a_specific_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_on_a_specific_worker.Tpo $(DEPDIR)/execute_on_a_specific_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/execute_on_a_specific_worker.c' object='execute_on_a_specific_worker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_on_a_specific_worker.o `test -f 'main/execute_on_a_specific_worker.c' || echo '$(srcdir)/'`main/execute_on_a_specific_worker.c execute_on_a_specific_worker.obj: main/execute_on_a_specific_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_on_a_specific_worker.obj -MD -MP -MF $(DEPDIR)/execute_on_a_specific_worker.Tpo -c -o execute_on_a_specific_worker.obj `if test -f 'main/execute_on_a_specific_worker.c'; then $(CYGPATH_W) 'main/execute_on_a_specific_worker.c'; else $(CYGPATH_W) '$(srcdir)/main/execute_on_a_specific_worker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_on_a_specific_worker.Tpo $(DEPDIR)/execute_on_a_specific_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/execute_on_a_specific_worker.c' object='execute_on_a_specific_worker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_on_a_specific_worker.obj `if test -f 'main/execute_on_a_specific_worker.c'; then $(CYGPATH_W) 'main/execute_on_a_specific_worker.c'; else $(CYGPATH_W) '$(srcdir)/main/execute_on_a_specific_worker.c'; fi` get_current_task.o: main/get_current_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_current_task.o -MD -MP -MF $(DEPDIR)/get_current_task.Tpo -c -o get_current_task.o `test -f 'main/get_current_task.c' || echo '$(srcdir)/'`main/get_current_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_current_task.Tpo $(DEPDIR)/get_current_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/get_current_task.c' object='get_current_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_current_task.o `test -f 'main/get_current_task.c' || echo '$(srcdir)/'`main/get_current_task.c get_current_task.obj: main/get_current_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT get_current_task.obj -MD -MP -MF $(DEPDIR)/get_current_task.Tpo -c -o get_current_task.obj `if test -f 'main/get_current_task.c'; then $(CYGPATH_W) 'main/get_current_task.c'; else $(CYGPATH_W) '$(srcdir)/main/get_current_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/get_current_task.Tpo $(DEPDIR)/get_current_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/get_current_task.c' object='get_current_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o get_current_task.obj `if test -f 'main/get_current_task.c'; then $(CYGPATH_W) 'main/get_current_task.c'; else $(CYGPATH_W) '$(srcdir)/main/get_current_task.c'; fi` insert_task.o: main/insert_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task.o -MD -MP -MF $(DEPDIR)/insert_task.Tpo -c -o insert_task.o `test -f 'main/insert_task.c' || echo '$(srcdir)/'`main/insert_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task.Tpo $(DEPDIR)/insert_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task.c' object='insert_task.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task.o `test -f 'main/insert_task.c' || echo '$(srcdir)/'`main/insert_task.c insert_task.obj: main/insert_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task.obj -MD -MP -MF $(DEPDIR)/insert_task.Tpo -c -o insert_task.obj `if test -f 'main/insert_task.c'; then $(CYGPATH_W) 'main/insert_task.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task.Tpo $(DEPDIR)/insert_task.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task.c' object='insert_task.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task.obj `if test -f 'main/insert_task.c'; then $(CYGPATH_W) 'main/insert_task.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task.c'; fi` insert_task_array.o: main/insert_task_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_array.o -MD -MP -MF $(DEPDIR)/insert_task_array.Tpo -c -o insert_task_array.o `test -f 'main/insert_task_array.c' || echo '$(srcdir)/'`main/insert_task_array.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_array.Tpo $(DEPDIR)/insert_task_array.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_array.c' object='insert_task_array.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_array.o `test -f 'main/insert_task_array.c' || echo '$(srcdir)/'`main/insert_task_array.c insert_task_array.obj: main/insert_task_array.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT insert_task_array.obj -MD -MP -MF $(DEPDIR)/insert_task_array.Tpo -c -o insert_task_array.obj `if test -f 'main/insert_task_array.c'; then $(CYGPATH_W) 'main/insert_task_array.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_array.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/insert_task_array.Tpo $(DEPDIR)/insert_task_array.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/insert_task_array.c' object='insert_task_array.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o insert_task_array.obj `if test -f 'main/insert_task_array.c'; then $(CYGPATH_W) 'main/insert_task_array.c'; else $(CYGPATH_W) '$(srcdir)/main/insert_task_array.c'; fi` insert_task_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` multithreaded.o: main/multithreaded.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded.o -MD -MP -MF $(DEPDIR)/multithreaded.Tpo -c -o multithreaded.o `test -f 'main/multithreaded.c' || echo '$(srcdir)/'`main/multithreaded.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded.Tpo $(DEPDIR)/multithreaded.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded.c' object='multithreaded.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded.o `test -f 'main/multithreaded.c' || echo '$(srcdir)/'`main/multithreaded.c multithreaded.obj: main/multithreaded.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded.obj -MD -MP -MF $(DEPDIR)/multithreaded.Tpo -c -o multithreaded.obj `if test -f 'main/multithreaded.c'; then $(CYGPATH_W) 'main/multithreaded.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded.Tpo $(DEPDIR)/multithreaded.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded.c' object='multithreaded.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded.obj `if test -f 'main/multithreaded.c'; then $(CYGPATH_W) 'main/multithreaded.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded.c'; fi` multithreaded_init.o: main/multithreaded_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded_init.o -MD -MP -MF $(DEPDIR)/multithreaded_init.Tpo -c -o multithreaded_init.o `test -f 'main/multithreaded_init.c' || echo '$(srcdir)/'`main/multithreaded_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded_init.Tpo $(DEPDIR)/multithreaded_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded_init.c' object='multithreaded_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded_init.o `test -f 'main/multithreaded_init.c' || echo '$(srcdir)/'`main/multithreaded_init.c multithreaded_init.obj: main/multithreaded_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multithreaded_init.obj -MD -MP -MF $(DEPDIR)/multithreaded_init.Tpo -c -o multithreaded_init.obj `if test -f 'main/multithreaded_init.c'; then $(CYGPATH_W) 'main/multithreaded_init.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multithreaded_init.Tpo $(DEPDIR)/multithreaded_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/multithreaded_init.c' object='multithreaded_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o multithreaded_init.obj `if test -f 'main/multithreaded_init.c'; then $(CYGPATH_W) 'main/multithreaded_init.c'; else $(CYGPATH_W) '$(srcdir)/main/multithreaded_init.c'; fi` pack.o: main/pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pack.o -MD -MP -MF $(DEPDIR)/pack.Tpo -c -o pack.o `test -f 'main/pack.c' || echo '$(srcdir)/'`main/pack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pack.Tpo $(DEPDIR)/pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pack.c' object='pack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pack.o `test -f 'main/pack.c' || echo '$(srcdir)/'`main/pack.c pack.obj: main/pack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pack.obj -MD -MP -MF $(DEPDIR)/pack.Tpo -c -o pack.obj `if test -f 'main/pack.c'; then $(CYGPATH_W) 'main/pack.c'; else $(CYGPATH_W) '$(srcdir)/main/pack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pack.Tpo $(DEPDIR)/pack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pack.c' object='pack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pack.obj `if test -f 'main/pack.c'; then $(CYGPATH_W) 'main/pack.c'; else $(CYGPATH_W) '$(srcdir)/main/pack.c'; fi` pause_resume.o: main/pause_resume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pause_resume.o -MD -MP -MF $(DEPDIR)/pause_resume.Tpo -c -o pause_resume.o `test -f 'main/pause_resume.c' || echo '$(srcdir)/'`main/pause_resume.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pause_resume.Tpo $(DEPDIR)/pause_resume.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pause_resume.c' object='pause_resume.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pause_resume.o `test -f 'main/pause_resume.c' || echo '$(srcdir)/'`main/pause_resume.c pause_resume.obj: main/pause_resume.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT pause_resume.obj -MD -MP -MF $(DEPDIR)/pause_resume.Tpo -c -o pause_resume.obj `if test -f 'main/pause_resume.c'; then $(CYGPATH_W) 'main/pause_resume.c'; else $(CYGPATH_W) '$(srcdir)/main/pause_resume.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pause_resume.Tpo $(DEPDIR)/pause_resume.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/pause_resume.c' object='pause_resume.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o pause_resume.obj `if test -f 'main/pause_resume.c'; then $(CYGPATH_W) 'main/pause_resume.c'; else $(CYGPATH_W) '$(srcdir)/main/pause_resume.c'; fi` regenerate.o: main/regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate.o -MD -MP -MF $(DEPDIR)/regenerate.Tpo -c -o regenerate.o `test -f 'main/regenerate.c' || echo '$(srcdir)/'`main/regenerate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate.Tpo $(DEPDIR)/regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate.c' object='regenerate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate.o `test -f 'main/regenerate.c' || echo '$(srcdir)/'`main/regenerate.c regenerate.obj: main/regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate.obj -MD -MP -MF $(DEPDIR)/regenerate.Tpo -c -o regenerate.obj `if test -f 'main/regenerate.c'; then $(CYGPATH_W) 'main/regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate.Tpo $(DEPDIR)/regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate.c' object='regenerate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate.obj `if test -f 'main/regenerate.c'; then $(CYGPATH_W) 'main/regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate.c'; fi` regenerate_pipeline.o: main/regenerate_pipeline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate_pipeline.o -MD -MP -MF $(DEPDIR)/regenerate_pipeline.Tpo -c -o regenerate_pipeline.o `test -f 'main/regenerate_pipeline.c' || echo '$(srcdir)/'`main/regenerate_pipeline.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate_pipeline.Tpo $(DEPDIR)/regenerate_pipeline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate_pipeline.c' object='regenerate_pipeline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate_pipeline.o `test -f 'main/regenerate_pipeline.c' || echo '$(srcdir)/'`main/regenerate_pipeline.c regenerate_pipeline.obj: main/regenerate_pipeline.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT regenerate_pipeline.obj -MD -MP -MF $(DEPDIR)/regenerate_pipeline.Tpo -c -o regenerate_pipeline.obj `if test -f 'main/regenerate_pipeline.c'; then $(CYGPATH_W) 'main/regenerate_pipeline.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate_pipeline.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/regenerate_pipeline.Tpo $(DEPDIR)/regenerate_pipeline.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/regenerate_pipeline.c' object='regenerate_pipeline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o regenerate_pipeline.obj `if test -f 'main/regenerate_pipeline.c'; then $(CYGPATH_W) 'main/regenerate_pipeline.c'; else $(CYGPATH_W) '$(srcdir)/main/regenerate_pipeline.c'; fi` restart.o: main/restart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT restart.o -MD -MP -MF $(DEPDIR)/restart.Tpo -c -o restart.o `test -f 'main/restart.c' || echo '$(srcdir)/'`main/restart.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/restart.Tpo $(DEPDIR)/restart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/restart.c' object='restart.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o restart.o `test -f 'main/restart.c' || echo '$(srcdir)/'`main/restart.c restart.obj: main/restart.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT restart.obj -MD -MP -MF $(DEPDIR)/restart.Tpo -c -o restart.obj `if test -f 'main/restart.c'; then $(CYGPATH_W) 'main/restart.c'; else $(CYGPATH_W) '$(srcdir)/main/restart.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/restart.Tpo $(DEPDIR)/restart.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/restart.c' object='restart.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o restart.obj `if test -f 'main/restart.c'; then $(CYGPATH_W) 'main/restart.c'; else $(CYGPATH_W) '$(srcdir)/main/restart.c'; fi` starpu_init.o: main/starpu_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init.o -MD -MP -MF $(DEPDIR)/starpu_init.Tpo -c -o starpu_init.o `test -f 'main/starpu_init.c' || echo '$(srcdir)/'`main/starpu_init.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init.Tpo $(DEPDIR)/starpu_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_init.c' object='starpu_init.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init.o `test -f 'main/starpu_init.c' || echo '$(srcdir)/'`main/starpu_init.c starpu_init.obj: main/starpu_init.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_init.obj -MD -MP -MF $(DEPDIR)/starpu_init.Tpo -c -o starpu_init.obj `if test -f 'main/starpu_init.c'; then $(CYGPATH_W) 'main/starpu_init.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_init.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_init.Tpo $(DEPDIR)/starpu_init.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_init.c' object='starpu_init.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_init.obj `if test -f 'main/starpu_init.c'; then $(CYGPATH_W) 'main/starpu_init.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_init.c'; fi` starpu_task_bundle.o: main/starpu_task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_bundle.o -MD -MP -MF $(DEPDIR)/starpu_task_bundle.Tpo -c -o starpu_task_bundle.o `test -f 'main/starpu_task_bundle.c' || echo '$(srcdir)/'`main/starpu_task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_bundle.Tpo $(DEPDIR)/starpu_task_bundle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_bundle.c' object='starpu_task_bundle.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_bundle.o `test -f 'main/starpu_task_bundle.c' || echo '$(srcdir)/'`main/starpu_task_bundle.c starpu_task_bundle.obj: main/starpu_task_bundle.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_bundle.obj -MD -MP -MF $(DEPDIR)/starpu_task_bundle.Tpo -c -o starpu_task_bundle.obj `if test -f 'main/starpu_task_bundle.c'; then $(CYGPATH_W) 'main/starpu_task_bundle.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_bundle.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_bundle.Tpo $(DEPDIR)/starpu_task_bundle.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_bundle.c' object='starpu_task_bundle.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_bundle.obj `if test -f 'main/starpu_task_bundle.c'; then $(CYGPATH_W) 'main/starpu_task_bundle.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_bundle.c'; fi` starpu_task_wait.o: main/starpu_task_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait.o -MD -MP -MF $(DEPDIR)/starpu_task_wait.Tpo -c -o starpu_task_wait.o `test -f 'main/starpu_task_wait.c' || echo '$(srcdir)/'`main/starpu_task_wait.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait.Tpo $(DEPDIR)/starpu_task_wait.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait.c' object='starpu_task_wait.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait.o `test -f 'main/starpu_task_wait.c' || echo '$(srcdir)/'`main/starpu_task_wait.c starpu_task_wait.obj: main/starpu_task_wait.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait.obj -MD -MP -MF $(DEPDIR)/starpu_task_wait.Tpo -c -o starpu_task_wait.obj `if test -f 'main/starpu_task_wait.c'; then $(CYGPATH_W) 'main/starpu_task_wait.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait.Tpo $(DEPDIR)/starpu_task_wait.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait.c' object='starpu_task_wait.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait.obj `if test -f 'main/starpu_task_wait.c'; then $(CYGPATH_W) 'main/starpu_task_wait.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait.c'; fi` starpu_task_wait_for_all.o: main/starpu_task_wait_for_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait_for_all.o -MD -MP -MF $(DEPDIR)/starpu_task_wait_for_all.Tpo -c -o starpu_task_wait_for_all.o `test -f 'main/starpu_task_wait_for_all.c' || echo '$(srcdir)/'`main/starpu_task_wait_for_all.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait_for_all.Tpo $(DEPDIR)/starpu_task_wait_for_all.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait_for_all.c' object='starpu_task_wait_for_all.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait_for_all.o `test -f 'main/starpu_task_wait_for_all.c' || echo '$(srcdir)/'`main/starpu_task_wait_for_all.c starpu_task_wait_for_all.obj: main/starpu_task_wait_for_all.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_task_wait_for_all.obj -MD -MP -MF $(DEPDIR)/starpu_task_wait_for_all.Tpo -c -o starpu_task_wait_for_all.obj `if test -f 'main/starpu_task_wait_for_all.c'; then $(CYGPATH_W) 'main/starpu_task_wait_for_all.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait_for_all.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_task_wait_for_all.Tpo $(DEPDIR)/starpu_task_wait_for_all.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_task_wait_for_all.c' object='starpu_task_wait_for_all.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_task_wait_for_all.obj `if test -f 'main/starpu_task_wait_for_all.c'; then $(CYGPATH_W) 'main/starpu_task_wait_for_all.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_task_wait_for_all.c'; fi` starpu_worker_exists.o: main/starpu_worker_exists.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_worker_exists.o -MD -MP -MF $(DEPDIR)/starpu_worker_exists.Tpo -c -o starpu_worker_exists.o `test -f 'main/starpu_worker_exists.c' || echo '$(srcdir)/'`main/starpu_worker_exists.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_worker_exists.Tpo $(DEPDIR)/starpu_worker_exists.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_worker_exists.c' object='starpu_worker_exists.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_worker_exists.o `test -f 'main/starpu_worker_exists.c' || echo '$(srcdir)/'`main/starpu_worker_exists.c starpu_worker_exists.obj: main/starpu_worker_exists.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT starpu_worker_exists.obj -MD -MP -MF $(DEPDIR)/starpu_worker_exists.Tpo -c -o starpu_worker_exists.obj `if test -f 'main/starpu_worker_exists.c'; then $(CYGPATH_W) 'main/starpu_worker_exists.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_worker_exists.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/starpu_worker_exists.Tpo $(DEPDIR)/starpu_worker_exists.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/starpu_worker_exists.c' object='starpu_worker_exists.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o starpu_worker_exists.obj `if test -f 'main/starpu_worker_exists.c'; then $(CYGPATH_W) 'main/starpu_worker_exists.c'; else $(CYGPATH_W) '$(srcdir)/main/starpu_worker_exists.c'; fi` static_restartable.o: main/static_restartable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable.o -MD -MP -MF $(DEPDIR)/static_restartable.Tpo -c -o static_restartable.o `test -f 'main/static_restartable.c' || echo '$(srcdir)/'`main/static_restartable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable.Tpo $(DEPDIR)/static_restartable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable.c' object='static_restartable.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable.o `test -f 'main/static_restartable.c' || echo '$(srcdir)/'`main/static_restartable.c static_restartable.obj: main/static_restartable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable.obj -MD -MP -MF $(DEPDIR)/static_restartable.Tpo -c -o static_restartable.obj `if test -f 'main/static_restartable.c'; then $(CYGPATH_W) 'main/static_restartable.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable.Tpo $(DEPDIR)/static_restartable.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable.c' object='static_restartable.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable.obj `if test -f 'main/static_restartable.c'; then $(CYGPATH_W) 'main/static_restartable.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable.c'; fi` static_restartable_tag.o: main/static_restartable_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_tag.o -MD -MP -MF $(DEPDIR)/static_restartable_tag.Tpo -c -o static_restartable_tag.o `test -f 'main/static_restartable_tag.c' || echo '$(srcdir)/'`main/static_restartable_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_tag.Tpo $(DEPDIR)/static_restartable_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_tag.c' object='static_restartable_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_tag.o `test -f 'main/static_restartable_tag.c' || echo '$(srcdir)/'`main/static_restartable_tag.c static_restartable_tag.obj: main/static_restartable_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_tag.obj -MD -MP -MF $(DEPDIR)/static_restartable_tag.Tpo -c -o static_restartable_tag.obj `if test -f 'main/static_restartable_tag.c'; then $(CYGPATH_W) 'main/static_restartable_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_tag.Tpo $(DEPDIR)/static_restartable_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_tag.c' object='static_restartable_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_tag.obj `if test -f 'main/static_restartable_tag.c'; then $(CYGPATH_W) 'main/static_restartable_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_tag.c'; fi` static_restartable_using_initializer.o: main/static_restartable_using_initializer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_using_initializer.o -MD -MP -MF $(DEPDIR)/static_restartable_using_initializer.Tpo -c -o static_restartable_using_initializer.o `test -f 'main/static_restartable_using_initializer.c' || echo '$(srcdir)/'`main/static_restartable_using_initializer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_using_initializer.Tpo $(DEPDIR)/static_restartable_using_initializer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_using_initializer.c' object='static_restartable_using_initializer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_using_initializer.o `test -f 'main/static_restartable_using_initializer.c' || echo '$(srcdir)/'`main/static_restartable_using_initializer.c static_restartable_using_initializer.obj: main/static_restartable_using_initializer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT static_restartable_using_initializer.obj -MD -MP -MF $(DEPDIR)/static_restartable_using_initializer.Tpo -c -o static_restartable_using_initializer.obj `if test -f 'main/static_restartable_using_initializer.c'; then $(CYGPATH_W) 'main/static_restartable_using_initializer.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_using_initializer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/static_restartable_using_initializer.Tpo $(DEPDIR)/static_restartable_using_initializer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/static_restartable_using_initializer.c' object='static_restartable_using_initializer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o static_restartable_using_initializer.obj `if test -f 'main/static_restartable_using_initializer.c'; then $(CYGPATH_W) 'main/static_restartable_using_initializer.c'; else $(CYGPATH_W) '$(srcdir)/main/static_restartable_using_initializer.c'; fi` subgraph_repeat.o: main/subgraph_repeat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat.o -MD -MP -MF $(DEPDIR)/subgraph_repeat.Tpo -c -o subgraph_repeat.o `test -f 'main/subgraph_repeat.c' || echo '$(srcdir)/'`main/subgraph_repeat.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat.Tpo $(DEPDIR)/subgraph_repeat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat.c' object='subgraph_repeat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat.o `test -f 'main/subgraph_repeat.c' || echo '$(srcdir)/'`main/subgraph_repeat.c subgraph_repeat.obj: main/subgraph_repeat.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat.Tpo -c -o subgraph_repeat.obj `if test -f 'main/subgraph_repeat.c'; then $(CYGPATH_W) 'main/subgraph_repeat.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat.Tpo $(DEPDIR)/subgraph_repeat.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat.c' object='subgraph_repeat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat.obj `if test -f 'main/subgraph_repeat.c'; then $(CYGPATH_W) 'main/subgraph_repeat.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat.c'; fi` subgraph_repeat_regenerate.o: main/subgraph_repeat_regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate.o -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate.Tpo -c -o subgraph_repeat_regenerate.o `test -f 'main/subgraph_repeat_regenerate.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate.Tpo $(DEPDIR)/subgraph_repeat_regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate.c' object='subgraph_repeat_regenerate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate.o `test -f 'main/subgraph_repeat_regenerate.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate.c subgraph_repeat_regenerate.obj: main/subgraph_repeat_regenerate.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate.Tpo -c -o subgraph_repeat_regenerate.obj `if test -f 'main/subgraph_repeat_regenerate.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate.Tpo $(DEPDIR)/subgraph_repeat_regenerate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate.c' object='subgraph_repeat_regenerate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate.obj `if test -f 'main/subgraph_repeat_regenerate.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate.c'; fi` subgraph_repeat_regenerate_tag.o: main/subgraph_repeat_regenerate_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate_tag.o -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo -c -o subgraph_repeat_regenerate_tag.o `test -f 'main/subgraph_repeat_regenerate_tag.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate_tag.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo $(DEPDIR)/subgraph_repeat_regenerate_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate_tag.c' object='subgraph_repeat_regenerate_tag.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate_tag.o `test -f 'main/subgraph_repeat_regenerate_tag.c' || echo '$(srcdir)/'`main/subgraph_repeat_regenerate_tag.c subgraph_repeat_regenerate_tag.obj: main/subgraph_repeat_regenerate_tag.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subgraph_repeat_regenerate_tag.obj -MD -MP -MF $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo -c -o subgraph_repeat_regenerate_tag.obj `if test -f 'main/subgraph_repeat_regenerate_tag.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate_tag.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/subgraph_repeat_regenerate_tag.Tpo $(DEPDIR)/subgraph_repeat_regenerate_tag.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/subgraph_repeat_regenerate_tag.c' object='subgraph_repeat_regenerate_tag.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subgraph_repeat_regenerate_tag.obj `if test -f 'main/subgraph_repeat_regenerate_tag.c'; then $(CYGPATH_W) 'main/subgraph_repeat_regenerate_tag.c'; else $(CYGPATH_W) '$(srcdir)/main/subgraph_repeat_regenerate_tag.c'; fi` submit.o: main/submit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT submit.o -MD -MP -MF $(DEPDIR)/submit.Tpo -c -o submit.o `test -f 'main/submit.c' || echo '$(srcdir)/'`main/submit.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/submit.Tpo $(DEPDIR)/submit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/submit.c' object='submit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o submit.o `test -f 'main/submit.c' || echo '$(srcdir)/'`main/submit.c submit.obj: main/submit.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT submit.obj -MD -MP -MF $(DEPDIR)/submit.Tpo -c -o submit.obj `if test -f 'main/submit.c'; then $(CYGPATH_W) 'main/submit.c'; else $(CYGPATH_W) '$(srcdir)/main/submit.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/submit.Tpo $(DEPDIR)/submit.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/submit.c' object='submit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o submit.obj `if test -f 'main/submit.c'; then $(CYGPATH_W) 'main/submit.c'; else $(CYGPATH_W) '$(srcdir)/main/submit.c'; fi` tag_task_data_deps.o: main/tag_task_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_task_data_deps.o -MD -MP -MF $(DEPDIR)/tag_task_data_deps.Tpo -c -o tag_task_data_deps.o `test -f 'main/tag_task_data_deps.c' || echo '$(srcdir)/'`main/tag_task_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_task_data_deps.Tpo $(DEPDIR)/tag_task_data_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_task_data_deps.c' object='tag_task_data_deps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_task_data_deps.o `test -f 'main/tag_task_data_deps.c' || echo '$(srcdir)/'`main/tag_task_data_deps.c tag_task_data_deps.obj: main/tag_task_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_task_data_deps.obj -MD -MP -MF $(DEPDIR)/tag_task_data_deps.Tpo -c -o tag_task_data_deps.obj `if test -f 'main/tag_task_data_deps.c'; then $(CYGPATH_W) 'main/tag_task_data_deps.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_task_data_deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_task_data_deps.Tpo $(DEPDIR)/tag_task_data_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_task_data_deps.c' object='tag_task_data_deps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_task_data_deps.obj `if test -f 'main/tag_task_data_deps.c'; then $(CYGPATH_W) 'main/tag_task_data_deps.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_task_data_deps.c'; fi` tag_wait_api.o: main/tag_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_wait_api.o -MD -MP -MF $(DEPDIR)/tag_wait_api.Tpo -c -o tag_wait_api.o `test -f 'main/tag_wait_api.c' || echo '$(srcdir)/'`main/tag_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_wait_api.Tpo $(DEPDIR)/tag_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_wait_api.c' object='tag_wait_api.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_wait_api.o `test -f 'main/tag_wait_api.c' || echo '$(srcdir)/'`main/tag_wait_api.c tag_wait_api.obj: main/tag_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tag_wait_api.obj -MD -MP -MF $(DEPDIR)/tag_wait_api.Tpo -c -o tag_wait_api.obj `if test -f 'main/tag_wait_api.c'; then $(CYGPATH_W) 'main/tag_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_wait_api.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tag_wait_api.Tpo $(DEPDIR)/tag_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/tag_wait_api.c' object='tag_wait_api.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tag_wait_api.obj `if test -f 'main/tag_wait_api.c'; then $(CYGPATH_W) 'main/tag_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/tag_wait_api.c'; fi` task_wait_api.o: main/task_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_wait_api.o -MD -MP -MF $(DEPDIR)/task_wait_api.Tpo -c -o task_wait_api.o `test -f 'main/task_wait_api.c' || echo '$(srcdir)/'`main/task_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_wait_api.Tpo $(DEPDIR)/task_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/task_wait_api.c' object='task_wait_api.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_wait_api.o `test -f 'main/task_wait_api.c' || echo '$(srcdir)/'`main/task_wait_api.c task_wait_api.obj: main/task_wait_api.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT task_wait_api.obj -MD -MP -MF $(DEPDIR)/task_wait_api.Tpo -c -o task_wait_api.obj `if test -f 'main/task_wait_api.c'; then $(CYGPATH_W) 'main/task_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/task_wait_api.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/task_wait_api.Tpo $(DEPDIR)/task_wait_api.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/task_wait_api.c' object='task_wait_api.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o task_wait_api.obj `if test -f 'main/task_wait_api.c'; then $(CYGPATH_W) 'main/task_wait_api.c'; else $(CYGPATH_W) '$(srcdir)/main/task_wait_api.c'; fi` wait_all_regenerable_tasks.o: main/wait_all_regenerable_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wait_all_regenerable_tasks.o -MD -MP -MF $(DEPDIR)/wait_all_regenerable_tasks.Tpo -c -o wait_all_regenerable_tasks.o `test -f 'main/wait_all_regenerable_tasks.c' || echo '$(srcdir)/'`main/wait_all_regenerable_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wait_all_regenerable_tasks.Tpo $(DEPDIR)/wait_all_regenerable_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/wait_all_regenerable_tasks.c' object='wait_all_regenerable_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wait_all_regenerable_tasks.o `test -f 'main/wait_all_regenerable_tasks.c' || echo '$(srcdir)/'`main/wait_all_regenerable_tasks.c wait_all_regenerable_tasks.obj: main/wait_all_regenerable_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT wait_all_regenerable_tasks.obj -MD -MP -MF $(DEPDIR)/wait_all_regenerable_tasks.Tpo -c -o wait_all_regenerable_tasks.obj `if test -f 'main/wait_all_regenerable_tasks.c'; then $(CYGPATH_W) 'main/wait_all_regenerable_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/wait_all_regenerable_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/wait_all_regenerable_tasks.Tpo $(DEPDIR)/wait_all_regenerable_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main/wait_all_regenerable_tasks.c' object='wait_all_regenerable_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o wait_all_regenerable_tasks.obj `if test -f 'main/wait_all_regenerable_tasks.c'; then $(CYGPATH_W) 'main/wait_all_regenerable_tasks.c'; else $(CYGPATH_W) '$(srcdir)/main/wait_all_regenerable_tasks.c'; fi` async_tasks_overhead.o: microbenchs/async_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT async_tasks_overhead.o -MD -MP -MF $(DEPDIR)/async_tasks_overhead.Tpo -c -o async_tasks_overhead.o `test -f 'microbenchs/async_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/async_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/async_tasks_overhead.Tpo $(DEPDIR)/async_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/async_tasks_overhead.c' object='async_tasks_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o async_tasks_overhead.o `test -f 'microbenchs/async_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/async_tasks_overhead.c async_tasks_overhead.obj: microbenchs/async_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT async_tasks_overhead.obj -MD -MP -MF $(DEPDIR)/async_tasks_overhead.Tpo -c -o async_tasks_overhead.obj `if test -f 'microbenchs/async_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/async_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/async_tasks_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/async_tasks_overhead.Tpo $(DEPDIR)/async_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/async_tasks_overhead.c' object='async_tasks_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o async_tasks_overhead.obj `if test -f 'microbenchs/async_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/async_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/async_tasks_overhead.c'; fi` local_pingpong.o: microbenchs/local_pingpong.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT local_pingpong.o -MD -MP -MF $(DEPDIR)/local_pingpong.Tpo -c -o local_pingpong.o `test -f 'microbenchs/local_pingpong.c' || echo '$(srcdir)/'`microbenchs/local_pingpong.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/local_pingpong.Tpo $(DEPDIR)/local_pingpong.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/local_pingpong.c' object='local_pingpong.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o local_pingpong.o `test -f 'microbenchs/local_pingpong.c' || echo '$(srcdir)/'`microbenchs/local_pingpong.c local_pingpong.obj: microbenchs/local_pingpong.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT local_pingpong.obj -MD -MP -MF $(DEPDIR)/local_pingpong.Tpo -c -o local_pingpong.obj `if test -f 'microbenchs/local_pingpong.c'; then $(CYGPATH_W) 'microbenchs/local_pingpong.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/local_pingpong.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/local_pingpong.Tpo $(DEPDIR)/local_pingpong.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/local_pingpong.c' object='local_pingpong.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o local_pingpong.obj `if test -f 'microbenchs/local_pingpong.c'; then $(CYGPATH_W) 'microbenchs/local_pingpong.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/local_pingpong.c'; fi` matrix_as_vector.o: microbenchs/matrix_as_vector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_as_vector.o -MD -MP -MF $(DEPDIR)/matrix_as_vector.Tpo -c -o matrix_as_vector.o `test -f 'microbenchs/matrix_as_vector.c' || echo '$(srcdir)/'`microbenchs/matrix_as_vector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_as_vector.Tpo $(DEPDIR)/matrix_as_vector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/matrix_as_vector.c' object='matrix_as_vector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_as_vector.o `test -f 'microbenchs/matrix_as_vector.c' || echo '$(srcdir)/'`microbenchs/matrix_as_vector.c matrix_as_vector.obj: microbenchs/matrix_as_vector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT matrix_as_vector.obj -MD -MP -MF $(DEPDIR)/matrix_as_vector.Tpo -c -o matrix_as_vector.obj `if test -f 'microbenchs/matrix_as_vector.c'; then $(CYGPATH_W) 'microbenchs/matrix_as_vector.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/matrix_as_vector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/matrix_as_vector.Tpo $(DEPDIR)/matrix_as_vector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/matrix_as_vector.c' object='matrix_as_vector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o matrix_as_vector.obj `if test -f 'microbenchs/matrix_as_vector.c'; then $(CYGPATH_W) 'microbenchs/matrix_as_vector.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/matrix_as_vector.c'; fi` prefetch_data_on_node.o: microbenchs/prefetch_data_on_node.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prefetch_data_on_node.o -MD -MP -MF $(DEPDIR)/prefetch_data_on_node.Tpo -c -o prefetch_data_on_node.o `test -f 'microbenchs/prefetch_data_on_node.c' || echo '$(srcdir)/'`microbenchs/prefetch_data_on_node.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prefetch_data_on_node.Tpo $(DEPDIR)/prefetch_data_on_node.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/prefetch_data_on_node.c' object='prefetch_data_on_node.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prefetch_data_on_node.o `test -f 'microbenchs/prefetch_data_on_node.c' || echo '$(srcdir)/'`microbenchs/prefetch_data_on_node.c prefetch_data_on_node.obj: microbenchs/prefetch_data_on_node.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prefetch_data_on_node.obj -MD -MP -MF $(DEPDIR)/prefetch_data_on_node.Tpo -c -o prefetch_data_on_node.obj `if test -f 'microbenchs/prefetch_data_on_node.c'; then $(CYGPATH_W) 'microbenchs/prefetch_data_on_node.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/prefetch_data_on_node.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prefetch_data_on_node.Tpo $(DEPDIR)/prefetch_data_on_node.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/prefetch_data_on_node.c' object='prefetch_data_on_node.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prefetch_data_on_node.obj `if test -f 'microbenchs/prefetch_data_on_node.c'; then $(CYGPATH_W) 'microbenchs/prefetch_data_on_node.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/prefetch_data_on_node.c'; fi` redundant_buffer.o: microbenchs/redundant_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT redundant_buffer.o -MD -MP -MF $(DEPDIR)/redundant_buffer.Tpo -c -o redundant_buffer.o `test -f 'microbenchs/redundant_buffer.c' || echo '$(srcdir)/'`microbenchs/redundant_buffer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/redundant_buffer.Tpo $(DEPDIR)/redundant_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/redundant_buffer.c' object='redundant_buffer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o redundant_buffer.o `test -f 'microbenchs/redundant_buffer.c' || echo '$(srcdir)/'`microbenchs/redundant_buffer.c redundant_buffer.obj: microbenchs/redundant_buffer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT redundant_buffer.obj -MD -MP -MF $(DEPDIR)/redundant_buffer.Tpo -c -o redundant_buffer.obj `if test -f 'microbenchs/redundant_buffer.c'; then $(CYGPATH_W) 'microbenchs/redundant_buffer.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/redundant_buffer.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/redundant_buffer.Tpo $(DEPDIR)/redundant_buffer.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/redundant_buffer.c' object='redundant_buffer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o redundant_buffer.obj `if test -f 'microbenchs/redundant_buffer.c'; then $(CYGPATH_W) 'microbenchs/redundant_buffer.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/redundant_buffer.c'; fi` sync_tasks_overhead.o: microbenchs/sync_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_tasks_overhead.o -MD -MP -MF $(DEPDIR)/sync_tasks_overhead.Tpo -c -o sync_tasks_overhead.o `test -f 'microbenchs/sync_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/sync_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_tasks_overhead.Tpo $(DEPDIR)/sync_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/sync_tasks_overhead.c' object='sync_tasks_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_tasks_overhead.o `test -f 'microbenchs/sync_tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/sync_tasks_overhead.c sync_tasks_overhead.obj: microbenchs/sync_tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sync_tasks_overhead.obj -MD -MP -MF $(DEPDIR)/sync_tasks_overhead.Tpo -c -o sync_tasks_overhead.obj `if test -f 'microbenchs/sync_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/sync_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/sync_tasks_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sync_tasks_overhead.Tpo $(DEPDIR)/sync_tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/sync_tasks_overhead.c' object='sync_tasks_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sync_tasks_overhead.obj `if test -f 'microbenchs/sync_tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/sync_tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/sync_tasks_overhead.c'; fi` tasks_overhead.o: microbenchs/tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_overhead.o -MD -MP -MF $(DEPDIR)/tasks_overhead.Tpo -c -o tasks_overhead.o `test -f 'microbenchs/tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_overhead.Tpo $(DEPDIR)/tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_overhead.c' object='tasks_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_overhead.o `test -f 'microbenchs/tasks_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_overhead.c tasks_overhead.obj: microbenchs/tasks_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_overhead.obj -MD -MP -MF $(DEPDIR)/tasks_overhead.Tpo -c -o tasks_overhead.obj `if test -f 'microbenchs/tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_overhead.Tpo $(DEPDIR)/tasks_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_overhead.c' object='tasks_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_overhead.obj `if test -f 'microbenchs/tasks_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_overhead.c'; fi` tasks_size_overhead.o: microbenchs/tasks_size_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_size_overhead.o -MD -MP -MF $(DEPDIR)/tasks_size_overhead.Tpo -c -o tasks_size_overhead.o `test -f 'microbenchs/tasks_size_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_size_overhead.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_size_overhead.Tpo $(DEPDIR)/tasks_size_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_size_overhead.c' object='tasks_size_overhead.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_size_overhead.o `test -f 'microbenchs/tasks_size_overhead.c' || echo '$(srcdir)/'`microbenchs/tasks_size_overhead.c tasks_size_overhead.obj: microbenchs/tasks_size_overhead.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tasks_size_overhead.obj -MD -MP -MF $(DEPDIR)/tasks_size_overhead.Tpo -c -o tasks_size_overhead.obj `if test -f 'microbenchs/tasks_size_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_size_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_size_overhead.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tasks_size_overhead.Tpo $(DEPDIR)/tasks_size_overhead.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='microbenchs/tasks_size_overhead.c' object='tasks_size_overhead.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tasks_size_overhead.obj `if test -f 'microbenchs/tasks_size_overhead.c'; then $(CYGPATH_W) 'microbenchs/tasks_size_overhead.c'; else $(CYGPATH_W) '$(srcdir)/microbenchs/tasks_size_overhead.c'; fi` overlap.o: overlap/overlap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT overlap.o -MD -MP -MF $(DEPDIR)/overlap.Tpo -c -o overlap.o `test -f 'overlap/overlap.c' || echo '$(srcdir)/'`overlap/overlap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/overlap.Tpo $(DEPDIR)/overlap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlap/overlap.c' object='overlap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o overlap.o `test -f 'overlap/overlap.c' || echo '$(srcdir)/'`overlap/overlap.c overlap.obj: overlap/overlap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT overlap.obj -MD -MP -MF $(DEPDIR)/overlap.Tpo -c -o overlap.obj `if test -f 'overlap/overlap.c'; then $(CYGPATH_W) 'overlap/overlap.c'; else $(CYGPATH_W) '$(srcdir)/overlap/overlap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/overlap.Tpo $(DEPDIR)/overlap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='overlap/overlap.c' object='overlap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o overlap.obj `if test -f 'overlap/overlap.c'; then $(CYGPATH_W) 'overlap/overlap.c'; else $(CYGPATH_W) '$(srcdir)/overlap/overlap.c'; fi` cuda_only.o: parallel_tasks/cuda_only.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cuda_only.o -MD -MP -MF $(DEPDIR)/cuda_only.Tpo -c -o cuda_only.o `test -f 'parallel_tasks/cuda_only.c' || echo '$(srcdir)/'`parallel_tasks/cuda_only.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cuda_only.Tpo $(DEPDIR)/cuda_only.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/cuda_only.c' object='cuda_only.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cuda_only.o `test -f 'parallel_tasks/cuda_only.c' || echo '$(srcdir)/'`parallel_tasks/cuda_only.c cuda_only.obj: parallel_tasks/cuda_only.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cuda_only.obj -MD -MP -MF $(DEPDIR)/cuda_only.Tpo -c -o cuda_only.obj `if test -f 'parallel_tasks/cuda_only.c'; then $(CYGPATH_W) 'parallel_tasks/cuda_only.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/cuda_only.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cuda_only.Tpo $(DEPDIR)/cuda_only.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/cuda_only.c' object='cuda_only.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cuda_only.obj `if test -f 'parallel_tasks/cuda_only.c'; then $(CYGPATH_W) 'parallel_tasks/cuda_only.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/cuda_only.c'; fi` explicit_combined_worker.o: parallel_tasks/explicit_combined_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT explicit_combined_worker.o -MD -MP -MF $(DEPDIR)/explicit_combined_worker.Tpo -c -o explicit_combined_worker.o `test -f 'parallel_tasks/explicit_combined_worker.c' || echo '$(srcdir)/'`parallel_tasks/explicit_combined_worker.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/explicit_combined_worker.Tpo $(DEPDIR)/explicit_combined_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/explicit_combined_worker.c' object='explicit_combined_worker.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o explicit_combined_worker.o `test -f 'parallel_tasks/explicit_combined_worker.c' || echo '$(srcdir)/'`parallel_tasks/explicit_combined_worker.c explicit_combined_worker.obj: parallel_tasks/explicit_combined_worker.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT explicit_combined_worker.obj -MD -MP -MF $(DEPDIR)/explicit_combined_worker.Tpo -c -o explicit_combined_worker.obj `if test -f 'parallel_tasks/explicit_combined_worker.c'; then $(CYGPATH_W) 'parallel_tasks/explicit_combined_worker.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/explicit_combined_worker.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/explicit_combined_worker.Tpo $(DEPDIR)/explicit_combined_worker.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/explicit_combined_worker.c' object='explicit_combined_worker.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o explicit_combined_worker.obj `if test -f 'parallel_tasks/explicit_combined_worker.c'; then $(CYGPATH_W) 'parallel_tasks/explicit_combined_worker.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/explicit_combined_worker.c'; fi` parallel_kernels.o: parallel_tasks/parallel_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels.o -MD -MP -MF $(DEPDIR)/parallel_kernels.Tpo -c -o parallel_kernels.o `test -f 'parallel_tasks/parallel_kernels.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels.Tpo $(DEPDIR)/parallel_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels.c' object='parallel_kernels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels.o `test -f 'parallel_tasks/parallel_kernels.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels.c parallel_kernels.obj: parallel_tasks/parallel_kernels.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels.obj -MD -MP -MF $(DEPDIR)/parallel_kernels.Tpo -c -o parallel_kernels.obj `if test -f 'parallel_tasks/parallel_kernels.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels.Tpo $(DEPDIR)/parallel_kernels.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels.c' object='parallel_kernels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels.obj `if test -f 'parallel_tasks/parallel_kernels.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels.c'; fi` parallel_kernels_spmd.o: parallel_tasks/parallel_kernels_spmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels_spmd.o -MD -MP -MF $(DEPDIR)/parallel_kernels_spmd.Tpo -c -o parallel_kernels_spmd.o `test -f 'parallel_tasks/parallel_kernels_spmd.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels_spmd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels_spmd.Tpo $(DEPDIR)/parallel_kernels_spmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels_spmd.c' object='parallel_kernels_spmd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels_spmd.o `test -f 'parallel_tasks/parallel_kernels_spmd.c' || echo '$(srcdir)/'`parallel_tasks/parallel_kernels_spmd.c parallel_kernels_spmd.obj: parallel_tasks/parallel_kernels_spmd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parallel_kernels_spmd.obj -MD -MP -MF $(DEPDIR)/parallel_kernels_spmd.Tpo -c -o parallel_kernels_spmd.obj `if test -f 'parallel_tasks/parallel_kernels_spmd.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels_spmd.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels_spmd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parallel_kernels_spmd.Tpo $(DEPDIR)/parallel_kernels_spmd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/parallel_kernels_spmd.c' object='parallel_kernels_spmd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o parallel_kernels_spmd.obj `if test -f 'parallel_tasks/parallel_kernels_spmd.c'; then $(CYGPATH_W) 'parallel_tasks/parallel_kernels_spmd.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/parallel_kernels_spmd.c'; fi` spmd_peager.o: parallel_tasks/spmd_peager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmd_peager.o -MD -MP -MF $(DEPDIR)/spmd_peager.Tpo -c -o spmd_peager.o `test -f 'parallel_tasks/spmd_peager.c' || echo '$(srcdir)/'`parallel_tasks/spmd_peager.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmd_peager.Tpo $(DEPDIR)/spmd_peager.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/spmd_peager.c' object='spmd_peager.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmd_peager.o `test -f 'parallel_tasks/spmd_peager.c' || echo '$(srcdir)/'`parallel_tasks/spmd_peager.c spmd_peager.obj: parallel_tasks/spmd_peager.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT spmd_peager.obj -MD -MP -MF $(DEPDIR)/spmd_peager.Tpo -c -o spmd_peager.obj `if test -f 'parallel_tasks/spmd_peager.c'; then $(CYGPATH_W) 'parallel_tasks/spmd_peager.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/spmd_peager.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/spmd_peager.Tpo $(DEPDIR)/spmd_peager.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallel_tasks/spmd_peager.c' object='spmd_peager.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o spmd_peager.obj `if test -f 'parallel_tasks/spmd_peager.c'; then $(CYGPATH_W) 'parallel_tasks/spmd_peager.c'; else $(CYGPATH_W) '$(srcdir)/parallel_tasks/spmd_peager.c'; fi` feed.o: perfmodels/feed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feed.o -MD -MP -MF $(DEPDIR)/feed.Tpo -c -o feed.o `test -f 'perfmodels/feed.c' || echo '$(srcdir)/'`perfmodels/feed.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/feed.Tpo $(DEPDIR)/feed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/feed.c' object='feed.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feed.o `test -f 'perfmodels/feed.c' || echo '$(srcdir)/'`perfmodels/feed.c feed.obj: perfmodels/feed.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT feed.obj -MD -MP -MF $(DEPDIR)/feed.Tpo -c -o feed.obj `if test -f 'perfmodels/feed.c'; then $(CYGPATH_W) 'perfmodels/feed.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/feed.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/feed.Tpo $(DEPDIR)/feed.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/feed.c' object='feed.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o feed.obj `if test -f 'perfmodels/feed.c'; then $(CYGPATH_W) 'perfmodels/feed.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/feed.c'; fi` 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` valid_model.o: perfmodels/valid_model.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT valid_model.o -MD -MP -MF $(DEPDIR)/valid_model.Tpo -c -o valid_model.o `test -f 'perfmodels/valid_model.c' || echo '$(srcdir)/'`perfmodels/valid_model.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/valid_model.Tpo $(DEPDIR)/valid_model.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/valid_model.c' object='valid_model.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o valid_model.o `test -f 'perfmodels/valid_model.c' || echo '$(srcdir)/'`perfmodels/valid_model.c valid_model.obj: perfmodels/valid_model.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT valid_model.obj -MD -MP -MF $(DEPDIR)/valid_model.Tpo -c -o valid_model.obj `if test -f 'perfmodels/valid_model.c'; then $(CYGPATH_W) 'perfmodels/valid_model.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/valid_model.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/valid_model.Tpo $(DEPDIR)/valid_model.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/valid_model.c' object='valid_model.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o valid_model.obj `if test -f 'perfmodels/valid_model.c'; then $(CYGPATH_W) 'perfmodels/valid_model.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/valid_model.c'; fi` value_nan.o: perfmodels/value_nan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT value_nan.o -MD -MP -MF $(DEPDIR)/value_nan.Tpo -c -o value_nan.o `test -f 'perfmodels/value_nan.c' || echo '$(srcdir)/'`perfmodels/value_nan.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/value_nan.Tpo $(DEPDIR)/value_nan.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/value_nan.c' object='value_nan.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o value_nan.o `test -f 'perfmodels/value_nan.c' || echo '$(srcdir)/'`perfmodels/value_nan.c value_nan.obj: perfmodels/value_nan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT value_nan.obj -MD -MP -MF $(DEPDIR)/value_nan.Tpo -c -o value_nan.obj `if test -f 'perfmodels/value_nan.c'; then $(CYGPATH_W) 'perfmodels/value_nan.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/value_nan.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/value_nan.Tpo $(DEPDIR)/value_nan.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perfmodels/value_nan.c' object='value_nan.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o value_nan.obj `if test -f 'perfmodels/value_nan.c'; then $(CYGPATH_W) 'perfmodels/value_nan.c'; else $(CYGPATH_W) '$(srcdir)/perfmodels/value_nan.c'; fi` data_locality.o: sched_policies/data_locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_locality.o -MD -MP -MF $(DEPDIR)/data_locality.Tpo -c -o data_locality.o `test -f 'sched_policies/data_locality.c' || echo '$(srcdir)/'`sched_policies/data_locality.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_locality.Tpo $(DEPDIR)/data_locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/data_locality.c' object='data_locality.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_locality.o `test -f 'sched_policies/data_locality.c' || echo '$(srcdir)/'`sched_policies/data_locality.c data_locality.obj: sched_policies/data_locality.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT data_locality.obj -MD -MP -MF $(DEPDIR)/data_locality.Tpo -c -o data_locality.obj `if test -f 'sched_policies/data_locality.c'; then $(CYGPATH_W) 'sched_policies/data_locality.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/data_locality.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/data_locality.Tpo $(DEPDIR)/data_locality.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/data_locality.c' object='data_locality.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o data_locality.obj `if test -f 'sched_policies/data_locality.c'; then $(CYGPATH_W) 'sched_policies/data_locality.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/data_locality.c'; fi` execute_all_tasks.o: sched_policies/execute_all_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_all_tasks.o -MD -MP -MF $(DEPDIR)/execute_all_tasks.Tpo -c -o execute_all_tasks.o `test -f 'sched_policies/execute_all_tasks.c' || echo '$(srcdir)/'`sched_policies/execute_all_tasks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_all_tasks.Tpo $(DEPDIR)/execute_all_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/execute_all_tasks.c' object='execute_all_tasks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_all_tasks.o `test -f 'sched_policies/execute_all_tasks.c' || echo '$(srcdir)/'`sched_policies/execute_all_tasks.c execute_all_tasks.obj: sched_policies/execute_all_tasks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT execute_all_tasks.obj -MD -MP -MF $(DEPDIR)/execute_all_tasks.Tpo -c -o execute_all_tasks.obj `if test -f 'sched_policies/execute_all_tasks.c'; then $(CYGPATH_W) 'sched_policies/execute_all_tasks.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/execute_all_tasks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/execute_all_tasks.Tpo $(DEPDIR)/execute_all_tasks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/execute_all_tasks.c' object='execute_all_tasks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o execute_all_tasks.obj `if test -f 'sched_policies/execute_all_tasks.c'; then $(CYGPATH_W) 'sched_policies/execute_all_tasks.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/execute_all_tasks.c'; fi` prio.o: sched_policies/prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio.o -MD -MP -MF $(DEPDIR)/prio.Tpo -c -o prio.o `test -f 'sched_policies/prio.c' || echo '$(srcdir)/'`sched_policies/prio.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio.Tpo $(DEPDIR)/prio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/prio.c' object='prio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prio.o `test -f 'sched_policies/prio.c' || echo '$(srcdir)/'`sched_policies/prio.c prio.obj: sched_policies/prio.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prio.obj -MD -MP -MF $(DEPDIR)/prio.Tpo -c -o prio.obj `if test -f 'sched_policies/prio.c'; then $(CYGPATH_W) 'sched_policies/prio.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/prio.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/prio.Tpo $(DEPDIR)/prio.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/prio.c' object='prio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prio.obj `if test -f 'sched_policies/prio.c'; then $(CYGPATH_W) 'sched_policies/prio.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/prio.c'; fi` simple_cpu_gpu_sched.o: sched_policies/simple_cpu_gpu_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_cpu_gpu_sched.o -MD -MP -MF $(DEPDIR)/simple_cpu_gpu_sched.Tpo -c -o simple_cpu_gpu_sched.o `test -f 'sched_policies/simple_cpu_gpu_sched.c' || echo '$(srcdir)/'`sched_policies/simple_cpu_gpu_sched.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_cpu_gpu_sched.Tpo $(DEPDIR)/simple_cpu_gpu_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_cpu_gpu_sched.c' object='simple_cpu_gpu_sched.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_cpu_gpu_sched.o `test -f 'sched_policies/simple_cpu_gpu_sched.c' || echo '$(srcdir)/'`sched_policies/simple_cpu_gpu_sched.c simple_cpu_gpu_sched.obj: sched_policies/simple_cpu_gpu_sched.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_cpu_gpu_sched.obj -MD -MP -MF $(DEPDIR)/simple_cpu_gpu_sched.Tpo -c -o simple_cpu_gpu_sched.obj `if test -f 'sched_policies/simple_cpu_gpu_sched.c'; then $(CYGPATH_W) 'sched_policies/simple_cpu_gpu_sched.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_cpu_gpu_sched.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_cpu_gpu_sched.Tpo $(DEPDIR)/simple_cpu_gpu_sched.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_cpu_gpu_sched.c' object='simple_cpu_gpu_sched.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_cpu_gpu_sched.obj `if test -f 'sched_policies/simple_cpu_gpu_sched.c'; then $(CYGPATH_W) 'sched_policies/simple_cpu_gpu_sched.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_cpu_gpu_sched.c'; fi` simple_deps.o: sched_policies/simple_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_deps.o -MD -MP -MF $(DEPDIR)/simple_deps.Tpo -c -o simple_deps.o `test -f 'sched_policies/simple_deps.c' || echo '$(srcdir)/'`sched_policies/simple_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_deps.Tpo $(DEPDIR)/simple_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_deps.c' object='simple_deps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_deps.o `test -f 'sched_policies/simple_deps.c' || echo '$(srcdir)/'`sched_policies/simple_deps.c simple_deps.obj: sched_policies/simple_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple_deps.obj -MD -MP -MF $(DEPDIR)/simple_deps.Tpo -c -o simple_deps.obj `if test -f 'sched_policies/simple_deps.c'; then $(CYGPATH_W) 'sched_policies/simple_deps.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_deps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple_deps.Tpo $(DEPDIR)/simple_deps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/simple_deps.c' object='simple_deps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple_deps.obj `if test -f 'sched_policies/simple_deps.c'; then $(CYGPATH_W) 'sched_policies/simple_deps.c'; else $(CYGPATH_W) '$(srcdir)/sched_policies/simple_deps.c'; fi` .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 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 overlap/.libs overlap/_libs -rm -rf parallel_tasks/.libs parallel_tasks/_libs -rm -rf perfmodels/.libs perfmodels/_libs -rm -rf sched_policies/.libs sched_policies/_libs install-nobase_STARPU_OPENCL_DATADATA: $(nobase_STARPU_OPENCL_DATA_DATA) @$(NORMAL_INSTALL) @list='$(nobase_STARPU_OPENCL_DATA_DATA)'; test -n "$(STARPU_OPENCL_DATAdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_OPENCL_DATAdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_OPENCL_DATAdir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(STARPU_OPENCL_DATAdir)/$$dir" || exit $$?; }; \ done uninstall-nobase_STARPU_OPENCL_DATADATA: @$(NORMAL_UNINSTALL) @list='$(nobase_STARPU_OPENCL_DATA_DATA)'; test -n "$(STARPU_OPENCL_DATAdir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(STARPU_OPENCL_DATAdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? main/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/deprecated_buffer.log: main/deprecated_buffer$(EXEEXT) @p='main/deprecated_buffer$(EXEEXT)'; \ b='main/deprecated_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) 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/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/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_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/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/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/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/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/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_regenerate.log: main/subgraph_repeat_regenerate$(EXEEXT) @p='main/subgraph_repeat_regenerate$(EXEEXT)'; \ b='main/subgraph_repeat_regenerate'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/subgraph_repeat_regenerate_tag.log: main/subgraph_repeat_regenerate_tag$(EXEEXT) @p='main/subgraph_repeat_regenerate_tag$(EXEEXT)'; \ b='main/subgraph_repeat_regenerate_tag'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/empty_task.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_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/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/tag_wait_api.log: main/tag_wait_api$(EXEEXT) @p='main/tag_wait_api$(EXEEXT)'; \ b='main/tag_wait_api'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/task_wait_api.log: main/task_wait_api$(EXEEXT) @p='main/task_wait_api$(EXEEXT)'; \ b='main/task_wait_api'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/declare_deps_in_callback.log: main/declare_deps_in_callback$(EXEEXT) @p='main/declare_deps_in_callback$(EXEEXT)'; \ b='main/declare_deps_in_callback'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/declare_deps_after_submission.log: main/declare_deps_after_submission$(EXEEXT) @p='main/declare_deps_after_submission$(EXEEXT)'; \ b='main/declare_deps_after_submission'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/declare_deps_after_submission_synchronous.log: main/declare_deps_after_submission_synchronous$(EXEEXT) @p='main/declare_deps_after_submission_synchronous$(EXEEXT)'; \ b='main/declare_deps_after_submission_synchronous'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/get_current_task.log: main/get_current_task$(EXEEXT) @p='main/get_current_task$(EXEEXT)'; \ b='main/get_current_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/starpu_init.log: main/starpu_init$(EXEEXT) @p='main/starpu_init$(EXEEXT)'; \ b='main/starpu_init'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/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/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) 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/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/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/copy.log: datawizard/copy$(EXEEXT) @p='datawizard/copy$(EXEEXT)'; \ b='datawizard/copy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/data_implicit_deps.log: datawizard/data_implicit_deps$(EXEEXT) @p='datawizard/data_implicit_deps$(EXEEXT)'; \ b='datawizard/data_implicit_deps'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/data_lookup.log: datawizard/data_lookup$(EXEEXT) @p='datawizard/data_lookup$(EXEEXT)'; \ b='datawizard/data_lookup'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/scratch.log: datawizard/scratch$(EXEEXT) @p='datawizard/scratch$(EXEEXT)'; \ b='datawizard/scratch'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_and_notify_data.log: datawizard/sync_and_notify_data$(EXEEXT) @p='datawizard/sync_and_notify_data$(EXEEXT)'; \ b='datawizard/sync_and_notify_data'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/sync_and_notify_data_implicit.log: datawizard/sync_and_notify_data_implicit$(EXEEXT) @p='datawizard/sync_and_notify_data_implicit$(EXEEXT)'; \ b='datawizard/sync_and_notify_data_implicit'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/dsm_stress.log: datawizard/dsm_stress$(EXEEXT) @p='datawizard/dsm_stress$(EXEEXT)'; \ b='datawizard/dsm_stress'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/double_parameter.log: datawizard/double_parameter$(EXEEXT) @p='datawizard/double_parameter$(EXEEXT)'; \ b='datawizard/double_parameter'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/write_only_tmp_buffer.log: datawizard/write_only_tmp_buffer$(EXEEXT) @p='datawizard/write_only_tmp_buffer$(EXEEXT)'; \ b='datawizard/write_only_tmp_buffer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/data_invalidation.log: datawizard/data_invalidation$(EXEEXT) @p='datawizard/data_invalidation$(EXEEXT)'; \ b='datawizard/data_invalidation'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/dining_philosophers.log: datawizard/dining_philosophers$(EXEEXT) @p='datawizard/dining_philosophers$(EXEEXT)'; \ b='datawizard/dining_philosophers'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/manual_reduction.log: datawizard/manual_reduction$(EXEEXT) @p='datawizard/manual_reduction$(EXEEXT)'; \ b='datawizard/manual_reduction'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/readers_and_writers.log: datawizard/readers_and_writers$(EXEEXT) @p='datawizard/readers_and_writers$(EXEEXT)'; \ b='datawizard/readers_and_writers'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/unpartition.log: datawizard/unpartition$(EXEEXT) @p='datawizard/unpartition$(EXEEXT)'; \ b='datawizard/unpartition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/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/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/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/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/interfaces/block/block_interface.log: datawizard/interfaces/block/block_interface$(EXEEXT) @p='datawizard/interfaces/block/block_interface$(EXEEXT)'; \ b='datawizard/interfaces/block/block_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/bcsr/bcsr_interface.log: datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT) @p='datawizard/interfaces/bcsr/bcsr_interface$(EXEEXT)'; \ b='datawizard/interfaces/bcsr/bcsr_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/coo/coo_interface.log: datawizard/interfaces/coo/coo_interface$(EXEEXT) @p='datawizard/interfaces/coo/coo_interface$(EXEEXT)'; \ b='datawizard/interfaces/coo/coo_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/csr/csr_interface.log: datawizard/interfaces/csr/csr_interface$(EXEEXT) @p='datawizard/interfaces/csr/csr_interface$(EXEEXT)'; \ b='datawizard/interfaces/csr/csr_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/matrix/matrix_interface.log: datawizard/interfaces/matrix/matrix_interface$(EXEEXT) @p='datawizard/interfaces/matrix/matrix_interface$(EXEEXT)'; \ b='datawizard/interfaces/matrix/matrix_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/multiformat_interface.log: datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT) @p='datawizard/interfaces/multiformat/multiformat_interface$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/multiformat_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.log: datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_data_release.log: datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_data_release$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_data_release'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_worker.log: datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_worker$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_worker'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.log: datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/multiformat/advanced/same_handle.log: datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT) @p='datawizard/interfaces/multiformat/advanced/same_handle$(EXEEXT)'; \ b='datawizard/interfaces/multiformat/advanced/same_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/variable/variable_interface.log: datawizard/interfaces/variable/variable_interface$(EXEEXT) @p='datawizard/interfaces/variable/variable_interface$(EXEEXT)'; \ b='datawizard/interfaces/variable/variable_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/vector/test_vector_interface.log: datawizard/interfaces/vector/test_vector_interface$(EXEEXT) @p='datawizard/interfaces/vector/test_vector_interface$(EXEEXT)'; \ b='datawizard/interfaces/vector/test_vector_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/interfaces/void/void_interface.log: datawizard/interfaces/void/void_interface$(EXEEXT) @p='datawizard/interfaces/void/void_interface$(EXEEXT)'; \ b='datawizard/interfaces/void/void_interface'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/in_place_partition.log: datawizard/in_place_partition$(EXEEXT) @p='datawizard/in_place_partition$(EXEEXT)'; \ b='datawizard/in_place_partition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/partition_lazy.log: datawizard/partition_lazy$(EXEEXT) @p='datawizard/partition_lazy$(EXEEXT)'; \ b='datawizard/partition_lazy'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/gpu_register.log: datawizard/gpu_register$(EXEEXT) @p='datawizard/gpu_register$(EXEEXT)'; \ b='datawizard/gpu_register'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/gpu_ptr_register.log: datawizard/gpu_ptr_register$(EXEEXT) @p='datawizard/gpu_ptr_register$(EXEEXT)'; \ b='datawizard/gpu_ptr_register'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/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) 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_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/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/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/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) 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/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) 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) 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) parallel_tasks/explicit_combined_worker.log: parallel_tasks/explicit_combined_worker$(EXEEXT) @p='parallel_tasks/explicit_combined_worker$(EXEEXT)'; \ b='parallel_tasks/explicit_combined_worker'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/parallel_kernels.log: parallel_tasks/parallel_kernels$(EXEEXT) @p='parallel_tasks/parallel_kernels$(EXEEXT)'; \ b='parallel_tasks/parallel_kernels'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/parallel_kernels_spmd.log: parallel_tasks/parallel_kernels_spmd$(EXEEXT) @p='parallel_tasks/parallel_kernels_spmd$(EXEEXT)'; \ b='parallel_tasks/parallel_kernels_spmd'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/spmd_peager.log: parallel_tasks/spmd_peager$(EXEEXT) @p='parallel_tasks/spmd_peager$(EXEEXT)'; \ b='parallel_tasks/spmd_peager'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) parallel_tasks/cuda_only.log: parallel_tasks/cuda_only$(EXEEXT) @p='parallel_tasks/cuda_only$(EXEEXT)'; \ b='parallel_tasks/cuda_only'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/regression_based.log: perfmodels/regression_based$(EXEEXT) @p='perfmodels/regression_based$(EXEEXT)'; \ b='perfmodels/regression_based'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/non_linear_regression_based.log: perfmodels/non_linear_regression_based$(EXEEXT) @p='perfmodels/non_linear_regression_based$(EXEEXT)'; \ b='perfmodels/non_linear_regression_based'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/feed.log: perfmodels/feed$(EXEEXT) @p='perfmodels/feed$(EXEEXT)'; \ b='perfmodels/feed'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) perfmodels/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/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) sched_policies/data_locality.log: sched_policies/data_locality$(EXEEXT) @p='sched_policies/data_locality$(EXEEXT)'; \ b='sched_policies/data_locality'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/execute_all_tasks.log: sched_policies/execute_all_tasks$(EXEEXT) @p='sched_policies/execute_all_tasks$(EXEEXT)'; \ b='sched_policies/execute_all_tasks'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/prio.log: sched_policies/prio$(EXEEXT) @p='sched_policies/prio$(EXEEXT)'; \ b='sched_policies/prio'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/simple_deps.log: sched_policies/simple_deps$(EXEEXT) @p='sched_policies/simple_deps$(EXEEXT)'; \ b='sched_policies/simple_deps'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) sched_policies/simple_cpu_gpu_sched.log: sched_policies/simple_cpu_gpu_sched$(EXEEXT) @p='sched_policies/simple_cpu_gpu_sched$(EXEEXT)'; \ b='sched_policies/simple_cpu_gpu_sched'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) fortran90/init_01.log: fortran90/init_01$(EXEEXT) @p='fortran90/init_01$(EXEEXT)'; \ b='fortran90/init_01'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) main/tag_task_data_deps.log: main/tag_task_data_deps$(EXEEXT) @p='main/tag_task_data_deps$(EXEEXT)'; \ b='main/tag_task_data_deps'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) datawizard/reclaim.log: datawizard/reclaim$(EXEEXT) @p='datawizard/reclaim$(EXEEXT)'; \ b='datawizard/reclaim'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) coverage/coverage.sh.log: coverage/coverage.sh @p='coverage/coverage.sh'; \ b='coverage/coverage.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(examplebindir)" "$(DESTDIR)$(examplebindir)" "$(DESTDIR)$(STARPU_OPENCL_DATAdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f datawizard/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/$(am__dirstamp) -rm -f datawizard/interfaces/$(am__dirstamp) -rm -f datawizard/interfaces/bcsr/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/bcsr/$(am__dirstamp) -rm -f datawizard/interfaces/block/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/block/$(am__dirstamp) -rm -f datawizard/interfaces/coo/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/coo/$(am__dirstamp) -rm -f datawizard/interfaces/csr/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/csr/$(am__dirstamp) -rm -f datawizard/interfaces/matrix/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/matrix/$(am__dirstamp) -rm -f datawizard/interfaces/multiformat/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/multiformat/$(am__dirstamp) -rm -f datawizard/interfaces/multiformat/advanced/$(am__dirstamp) -rm -f datawizard/interfaces/variable/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/variable/$(am__dirstamp) -rm -f datawizard/interfaces/vector/$(DEPDIR)/$(am__dirstamp) -rm -f datawizard/interfaces/vector/$(am__dirstamp) -rm -f datawizard/interfaces/void/$(am__dirstamp) -rm -f errorcheck/$(am__dirstamp) -rm -f fortran90/$(am__dirstamp) -rm -f helper/$(am__dirstamp) -rm -f main/$(am__dirstamp) -rm -f main/driver_api/$(am__dirstamp) -rm -f microbenchs/$(am__dirstamp) -rm -f overlap/$(am__dirstamp) -rm -f parallel_tasks/$(am__dirstamp) -rm -f perfmodels/$(am__dirstamp) -rm -f sched_policies/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-checkPROGRAMS clean-examplebinPROGRAMS clean-generic \ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-examplebinPROGRAMS install-examplebinSCRIPTS \ install-nobase_STARPU_OPENCL_DATADATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-examplebinPROGRAMS uninstall-examplebinSCRIPTS \ uninstall-nobase_STARPU_OPENCL_DATADATA .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-TESTS check-am clean clean-checkPROGRAMS \ clean-examplebinPROGRAMS clean-generic clean-libtool \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplebinPROGRAMS \ install-examplebinSCRIPTS install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-nobase_STARPU_OPENCL_DATADATA install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am uninstall-examplebinPROGRAMS \ uninstall-examplebinSCRIPTS \ uninstall-nobase_STARPU_OPENCL_DATADATA # TODO define NVCCFLAGS @STARPU_USE_CUDA_TRUE@NVCC ?= nvcc @STARPU_USE_CUDA_TRUE@.cu.cubin: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) -cubin $< -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) @STARPU_USE_CUDA_TRUE@.cu.o: @STARPU_USE_CUDA_TRUE@ $(MKDIR_P) `dirname $@` @STARPU_USE_CUDA_TRUE@ $(NVCC) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} 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 # 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.1.5/tests/helper/0002755000373600000000000000000012571541162012455 500000000000000starpu-1.1.5/tests/helper/starpu_create_sync_task.c0000644000373600000000000000460612571536543017473 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #define NITER 10 static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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.1.5/tests/helper/pinned_memory.c0000644000373600000000000000240112571536543015410 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #define NITER 10 #define SIZE (4*1024*1024*sizeof(float)) static float *data = NULL; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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.1.5/tests/helper/execute_on_all.c0000644000373600000000000000263712571536543015544 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" void func(void *arg) { int *ptr = (int *) arg; STARPU_ASSERT(*ptr == 0x42); } int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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.1.5/tests/helper/cublas_init.c0000644000373600000000000000350012571536543015040 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" static double start; static double end; //static float *data = NULL; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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.1.5/tests/helper/starpu_data_cpy.c0000644000373600000000000000306312571536543015732 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" int main(int argc, char **argv) { int ret; int var1, var2; starpu_data_handle_t var1_handle, var2_handle; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); var1 = 42; var2 = 12; starpu_variable_data_register(&var1_handle, 0, (uintptr_t)&var1, sizeof(var1)); starpu_variable_data_register(&var2_handle, 0, (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.1.5/tests/datawizard/0002755000373600000000000000000012571541162013330 500000000000000starpu-1.1.5/tests/datawizard/scal_opencl.cl0000644000373600000000000000170312571536547016064 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2011 Université Bordeaux 1 * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 void*) val + offset; if (i < nx) { val[i] *= 2; } } starpu-1.1.5/tests/datawizard/opencl_codelet_unsigned_inc.c0000644000373600000000000000306612571536546021135 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include 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_event event; cl_mem val = (cl_mem) STARPU_VARIABLE_GET_PTR(buffers[0]); id = starpu_worker_get_id(); 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, &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.1.5/tests/datawizard/scratch_opencl.c0000644000373600000000000000473512571536550016417 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include 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; cl_event event; 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(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "increment_vector_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clEnqueueCopyBuffer(queue, val, tmp, 0, /* offset in val */ 0, /* offset in tmp */ n * elemsize, 0, /* num_events_in_wait_list */ NULL, /* event_wait_list */ NULL); /* event */ if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err|= clSetKernelArg(kernel, 1, sizeof(tmp), &tmp); err|= clSetKernelArg(kernel, 2, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &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.1.5/tests/datawizard/sync_and_notify_data_implicit.c0000644000373600000000000001124412571536546021477 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #define N_DEF 100 #define K_DEF 256 static unsigned n=N_DEF; static unsigned k=K_DEF; /* * In this test, we maintain a vector v = (a,b,c). * * Each iteration consists of: * - increment a n times * - sync v in ram * - incrementer b * - notify the modification of v * - incrementer c n times * - sync v * * At the end, we have to make sure that if we did k iterations, * v == (kn, k, kn) */ #ifdef STARPU_USE_CUDA void cuda_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void cuda_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void opencl_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_code; #endif #define VECTORSIZE 16 starpu_data_handle_t v_handle; static unsigned v[VECTORSIZE] STARPU_ATTRIBUTE_ALIGNED(128) = {0, 0, 0, 0}; void cpu_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[0]++; } void cpu_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[2]++; } /* increment a = v[0] */ static struct starpu_codelet cl_inc_a = { .cpu_funcs = {cpu_codelet_incA}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_incA}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incA}, #endif .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}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incC}, #endif .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK n /= 10; k /= 8; #endif 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/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, 0, (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.1.5/tests/datawizard/wt_host.c0000644000373600000000000000737112571536547015124 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" static unsigned var = 0; static starpu_data_handle_t handle; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (uintptr_t)&var, sizeof(unsigned)); /* Copy the handle in main memory every time it is modified */ uint32_t wt_mask = (1<<0); starpu_data_set_wt_mask(handle, wt_mask); #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) { 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.1.5/tests/datawizard/readonly.c0000644000373600000000000000404712571536547015247 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_OPENCL static void codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { FPRINTF(stderr, "codelet\n"); } #endif static struct starpu_codelet cl = { #ifdef STARPU_USE_OPENCL .opencl_funcs = {codelet}, #endif .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; int var = 42; starpu_data_handle_t handle; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); int copy = starpu_asynchronous_copy_disabled(); FPRINTF(stderr, "copy %d\n", copy); starpu_variable_data_register(&handle, 0, (uintptr_t)&var, sizeof(var)); ret = starpu_insert_task(&cl, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_shutdown(); return 0; enodev: starpu_data_unregister(handle); starpu_shutdown(); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ fprintf(stderr, "WARNING: No one can execute this task\n"); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/critical_section_with_void_interface.c0000644000373600000000000000452412571536550023036 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" starpu_data_handle_t void_handle; int critical_var; static void critical_section(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { /* We do not protect this variable because it is only accessed when the * "void_handle" piece of data is accessed. */ critical_var++; } static struct starpu_codelet cl = { .cpu_funcs = {critical_section}, .cuda_funcs = {critical_section}, .opencl_funcs = {critical_section}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { #ifdef STARPU_QUICK_CHECK int ntasks = 10; #else int ntasks = 1000; #endif int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); critical_var = 0; /* Create a void data which will be used as an exclusion mechanism. */ starpu_void_data_register(&void_handle); int i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = void_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(void_handle); ret = (critical_var == ntasks) ? EXIT_SUCCESS : EXIT_FAILURE; starpu_shutdown(); return ret; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/increment_redux.c0000644000373600000000000001643312571536550016621 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" static unsigned var = 0; static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void redux_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned host_dst, host_src; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_src, src, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&host_dst, dst, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_dst += host_src; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } static void neutral_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void redux_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst, h_src; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem d_src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); /* This is a dummy technique of course */ clEnqueueReadBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clEnqueueReadBuffer(queue, d_src, CL_TRUE, 0, sizeof(unsigned), (void *)&h_src, 0, NULL, NULL); h_dst += h_src; clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } static void neutral_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } #endif static void redux_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); *dst = *dst + *src; } static void neutral_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet redux_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_kernel}, #endif .cpu_funcs = {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}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, #endif .cpu_funcs = {neutral_cpu_kernel}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .nbuffers = 1, .modes = {STARPU_REDUX} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (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.1.5/tests/datawizard/gpu_ptr_register.c0000644000373600000000000001547212571536547017022 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014 Université de Bordeaux * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" #if ! (defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA)) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int submit_tasks(starpu_data_handle_t handle, int pieces, int n) { int i, ret; for (i = 0; i < pieces; i++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &scal_codelet; task->execute_on_a_specific_worker = 1; task->workerid = i%n; ret = starpu_task_submit(task); if (ret == -ENODEV) return -ENODEV; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); return 0; } static int find_a_worker(enum starpu_worker_archtype type) { int worker[STARPU_NMAXWORKERS]; int ret = starpu_worker_get_ids_by_type(type, worker, STARPU_NMAXWORKERS); if (ret == 0) return -ENODEV; if (ret == -ERANGE) return worker[STARPU_NMAXWORKERS-1]; return worker[ret-1]; } static int check_result(unsigned *t, size_t size) { unsigned i; for (i = 0; i < size; i++) { if (t[i] != i*2) { FPRINTF(stderr,"t[%d] is %u instead of %u\n", i, t[i], 2*i); return 1; } } return 0; } #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER static int test_cuda(void) { int ret; unsigned *foo_gpu; unsigned *foo; int n, i, size, pieces; int devid; int chosen; cudaError_t cures; starpu_data_handle_t handle; /* Find a CUDA worker */ chosen = find_a_worker(STARPU_CUDA_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; devid = starpu_worker_get_devid(chosen); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(*foo_gpu)); foo = calloc(size, sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; starpu_vector_data_register(&handle, 0, (uintptr_t)foo, size, sizeof(*foo)); starpu_vector_ptr_register(handle, starpu_worker_get_memory_node(chosen), (uintptr_t)foo_gpu, (uintptr_t)foo_gpu, 0); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); /* Even with just one worker, split in at least two */ if (n == 1) pieces = 2; else pieces = n; struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = pieces, }; starpu_data_partition(handle, &f); ret = submit_tasks(handle, pieces, n); if (ret == -ENODEV) return -ENODEV; starpu_data_unpartition(handle, starpu_worker_get_memory_node(chosen)); starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(chosen), 0); starpu_data_unregister(handle); starpu_cuda_set_device(devid); cures = cudaMemcpy(foo, foo_gpu, size * sizeof(*foo_gpu), cudaMemcpyDeviceToHost); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return check_result(foo, size); } #endif #endif #ifdef STARPU_USE_OPENCL static int test_opencl(void) { int i; int ret; int chosen; int n; int size; int pieces; cl_mem foo_gpu; starpu_data_handle_t handle; ret = starpu_opencl_load_opencl_from_file("tests/datawizard/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); /* Find an OpenCL worker */ chosen = find_a_worker(STARPU_OPENCL_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; int devid; cl_int err; cl_context context; cl_command_queue queue; devid = starpu_worker_get_devid(chosen); starpu_opencl_get_context(devid, &context); starpu_opencl_get_queue(devid, &queue); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(int)); unsigned int *foo = malloc(size*sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; starpu_vector_data_register(&handle, 0, (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_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/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER ret = test_cuda(); if (ret == 1) goto fail; else if (ret == 0) skipped_cuda = 0; #endif #endif #ifdef STARPU_USE_OPENCL ret = test_opencl(); if (ret == 1) goto fail; else if (ret == 0) skipped_opencl = 0; #endif starpu_shutdown(); if (skipped_cuda == 1 && skipped_opencl == 1) return STARPU_TEST_SKIPPED; return EXIT_SUCCESS; fail: starpu_shutdown(); return EXIT_FAILURE; } #endif /* defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) */ starpu-1.1.5/tests/datawizard/sync_with_data_with_mem.c0000644000373600000000000000647712571536547020334 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #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]; static void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .nbuffers = 1 }; 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_init(NULL); 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], 0, (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.1.5/tests/datawizard/gpu_register.c0000644000373600000000000001555112571536547016133 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012, 2014 Université de Bordeaux * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" #if ! (defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA)) int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int submit_tasks(starpu_data_handle_t handle, int pieces, int n) { int i, ret; for (i = 0; i < pieces; i++) { struct starpu_task *task = starpu_task_create(); task->handles[0] = starpu_data_get_sub_data(handle, 1, i); task->cl = &scal_codelet; task->execute_on_a_specific_worker = 1; task->workerid = i%n; ret = starpu_task_submit(task); if (ret == -ENODEV) return -ENODEV; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); return 0; } static int find_a_worker(enum starpu_worker_archtype type) { int worker[STARPU_NMAXWORKERS]; int ret = starpu_worker_get_ids_by_type(type, worker, STARPU_NMAXWORKERS); if (ret == 0) return -ENODEV; if (ret == -ERANGE) return worker[STARPU_NMAXWORKERS-1]; return worker[ret-1]; } static int check_result(unsigned *t, size_t size) { unsigned i; for (i = 0; i < size; i++) { if (t[i] != i*2) { FPRINTF(stderr,"t[%d] is %u instead of %u\n", i, t[i], 2*i); return 1; } } return 0; } #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER static int test_cuda(void) { int ret; unsigned *foo_gpu; unsigned *foo; int n, i, size, pieces; int devid; int chosen; cudaError_t cures; starpu_data_handle_t handle; /* Find a CUDA worker */ chosen = find_a_worker(STARPU_CUDA_WORKER); if (chosen == -ENODEV) return -ENODEV; n = starpu_worker_get_count(); size = 10 * n; devid = starpu_worker_get_devid(chosen); foo_gpu = (void*) starpu_malloc_on_node(starpu_worker_get_memory_node(chosen), size * sizeof(*foo_gpu)); foo = calloc(size, sizeof(*foo)); for (i = 0; i < size; i++) foo[i] = i; cures = cudaMemcpy(foo_gpu, foo, size * sizeof(*foo_gpu), cudaMemcpyHostToDevice); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); starpu_vector_data_register(&handle, starpu_worker_get_memory_node(chosen), (uintptr_t)foo_gpu, size, sizeof(*foo_gpu)); /* Broadcast the data to force in-place partitioning */ for (i = 0; i < n; i++) starpu_data_prefetch_on_node(handle, starpu_worker_get_memory_node(i), 0); /* Even with just one worker, split in at least two */ if (n == 1) pieces = 2; else pieces = n; struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = pieces, }; starpu_data_partition(handle, &f); ret = submit_tasks(handle, pieces, n); if (ret == -ENODEV) return -ENODEV; starpu_data_unpartition(handle, starpu_worker_get_memory_node(chosen)); starpu_data_unregister(handle); starpu_cuda_set_device(devid); cures = cudaMemcpy(foo, foo_gpu, size * sizeof(*foo_gpu), cudaMemcpyDeviceToHost); if (STARPU_UNLIKELY(cures)) STARPU_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; 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); 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_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/scal_opencl.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER ret = test_cuda(); if (ret == 1) goto fail; else if (ret == 0) skipped_cuda = 0; #endif #endif #ifdef STARPU_USE_OPENCL ret = test_opencl(); if (ret == 1) goto fail; else if (ret == 0) skipped_opencl = 0; #endif starpu_shutdown(); if (skipped_cuda == 1 && skipped_opencl == 1) return STARPU_TEST_SKIPPED; return EXIT_SUCCESS; fail: starpu_shutdown(); return EXIT_FAILURE; } #endif /* defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) */ starpu-1.1.5/tests/datawizard/sync_and_notify_data.c0000644000373600000000000001145512571536550017604 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" #define N_DEF 100 #define K_DEF 256 static unsigned n=N_DEF; static unsigned k=K_DEF; /* * In this test, we maintain a vector v = (a,b,c). * * Each iteration consists of: * - increment a n times * - sync v in ram * - incrementer b * - notify the modification of v * - incrementer c n times * - sync v * * At the end, we have to make sure that if we did k iterations, * v == (kn, k, kn) */ #ifdef STARPU_USE_CUDA void cuda_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void cuda_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); void opencl_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); struct starpu_opencl_program opencl_code; #endif #define VECTORSIZE 16 starpu_data_handle_t v_handle; static unsigned v[VECTORSIZE] STARPU_ATTRIBUTE_ALIGNED(128) = {0, 0, 0, 0}; void cpu_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[0]++; } void cpu_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *val = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); val[2]++; } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK n /= 10; k /= 16; #endif 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/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, 0, (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}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incA}, #endif .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}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_incC}, #endif .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.1.5/tests/datawizard/sync_with_data_with_mem_non_blocking_implicit.c0000644000373600000000000001014312571536546024730 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 #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]; static void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .nbuffers = 1 }; 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; void callback_sync_data(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); n_synced_buffers++; if (n_synced_buffers == nbuffers) STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK nbuffers /= 4; niter /= 4; vectorsize /= 8; #endif ret = starpu_init(NULL); 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], 0, (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"); } /* 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.1.5/tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl0000644000373600000000000000130412571536550022635 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void _opencl_unsigned_inc(__global unsigned *val) { val[0]++; } starpu-1.1.5/tests/datawizard/allocate.c0000644000373600000000000001410612571536550015205 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 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 int test_prefetch(unsigned memnodes) { int ret; float *buffers[4]; starpu_data_handle_t handles[4]; unsigned i; starpu_ssize_t available_size; buffers[0] = malloc(SIZE_ALLOC*1024*512); STARPU_ASSERT(buffers[0]); starpu_variable_data_register(&handles[0], 0, (uintptr_t)buffers[0], SIZE_ALLOC*1024*512); for(i=1 ; i #include #include #include #include "../helper.h" static 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}, .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_insert_task(&cl, STARPU_W, handle, STARPU_VALUE, &count, sizeof(size_t), 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); /* 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, 0, (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, 0); 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_init(NULL); 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], 0, (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], 0, (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.1.5/tests/datawizard/scratch.c0000644000373600000000000001002112571536550015040 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #ifdef STARPU_QUICK_CHECK # define NLOOPS 8 # define VECTORSIZE 128 #else # define NLOOPS 128 # define VECTORSIZE 1024 #endif static unsigned *A; starpu_data_handle_t A_handle, B_handle; //static unsigned var = 0; #ifdef STARPU_USE_CUDA extern void cuda_f(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void opencl_f(void *buffers[], void *args); #endif static void cpu_f(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned *tmp = (unsigned *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(descr[0]); memcpy(tmp, v, nx*elemsize); unsigned i; for (i = 0; i < nx; i++) { v[i] = tmp[i] + 1; } } static struct starpu_codelet cl_f = { .cpu_funcs = {cpu_f}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_f}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_f}, #endif .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_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/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, 0, (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.1.5/tests/datawizard/scal.h0000644000373600000000000000173712571536547014364 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include extern struct starpu_codelet scal_codelet; extern struct starpu_opencl_program opencl_program; void scal_func_cpu(void *buffers[], void *cl_arg); #ifdef STARPU_USE_CUDA void scal_func_cuda(void *buffers[], void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void scal_func_opencl(void *buffers[], void *_args); #endif starpu-1.1.5/tests/datawizard/copy.c0000644000373600000000000000605312571536546014402 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 static unsigned nloops = 10; #else static unsigned nloops = 1000; #endif static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet cpu_codelet = { .cpu_funcs = {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_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) == 0 && starpu_worker_get_count_by_type(STARPU_OPENCL_WORKER) == 0) { FPRINTF(stderr, "This application requires a CUDA or OpenCL Worker\n"); starpu_shutdown(); return STARPU_TEST_SKIPPED; } foo = 0.0f; starpu_variable_data_register(&float_array_handle, 0, (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.1.5/tests/datawizard/scratch_opencl_kernel.cl0000644000373600000000000000150612571536550020124 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void increment_vector_opencl(__global unsigned *val, __global unsigned *tmp, unsigned nx) { const int id = get_global_id(0); if (id < nx) val[id] = tmp[id] + 1; } starpu-1.1.5/tests/datawizard/user_interaction_implicit.c0000644000373600000000000000434112571536546020675 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #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]; 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_init(NULL); 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, 0, (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.1.5/tests/datawizard/mpi_like_async.c0000644000373600000000000002361712571536547016424 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_QUICK_CHECK # define NTHREADS_DEFAULT 4 # define NITER_DEFAULT 8 #else # define NTHREADS_DEFAULT 16 # define NITER_DEFAULT 128 #endif static unsigned nthreads = NTHREADS_DEFAULT; static unsigned niter = NITER_DEFAULT; //#define DEBUG_MESSAGES 1 //static starpu_pthread_cond_t cond; //static starpu_pthread_mutex_t mutex; struct thread_data { unsigned index; unsigned val; starpu_data_handle_t handle; starpu_pthread_t thread; starpu_pthread_mutex_t recv_mutex; unsigned recv_flag; // set when a message is received unsigned recv_buf; struct thread_data *neighbour; }; struct data_req { int (*test_func)(void *); void *test_arg; struct data_req *next; }; static starpu_pthread_mutex_t data_req_mutex; static starpu_pthread_cond_t data_req_cond; struct data_req *data_req_list; unsigned progress_thread_running; static struct thread_data problem_data[NTHREADS_DEFAULT]; /* We implement some ring transfer, every thread will try to receive a piece of * data from its neighbour and increment it before transmitting it to its * successor. */ #ifdef STARPU_USE_CUDA void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif static void increment_handle_cpu_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1; // FPRINTF(stderr, "VAL %d (&val = %p)\n", *val, val); } static struct starpu_codelet increment_handle_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_handle_cpu_kernel}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_unsigned_inc}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = { opencl_codelet_unsigned_inc}, #endif .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 %d received value %d from thread %d\n", thread_data->index, thread_data->val, (thread_data->index - 1)%nthreads); #endif starpu_data_release(thread_data->handle); } return ret; } static void recv_handle_async(void *_thread_data) { struct thread_data *thread_data = (struct thread_data *) _thread_data; struct data_req *req = (struct data_req *) malloc(sizeof(struct data_req)); req->test_func = test_recv_handle_async; req->test_arg = thread_data; req->next = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); req->next = data_req_list; data_req_list = req; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); } static int test_send_handle_async(void *arg) { int ret; struct thread_data *thread_data = (struct thread_data *) arg; struct thread_data *neighbour_data = thread_data->neighbour; STARPU_PTHREAD_MUTEX_LOCK(&neighbour_data->recv_mutex); ret = (neighbour_data->recv_flag == 0); STARPU_PTHREAD_MUTEX_UNLOCK(&neighbour_data->recv_mutex); if (ret) { #ifdef DEBUG_MESSAGES FPRINTF(stderr, "Thread %d sends value %d to thread %d\n", thread_data->index, thread_data->val, neighbour_data->index); #endif starpu_data_release(thread_data->handle); } return ret; } static void send_handle_async(void *_thread_data) { struct thread_data *thread_data = (struct thread_data *) _thread_data; struct thread_data *neighbour_data = thread_data->neighbour; // FPRINTF(stderr, "send_handle_async\n"); /* send the message */ STARPU_PTHREAD_MUTEX_LOCK(&neighbour_data->recv_mutex); neighbour_data->recv_buf = thread_data->val; neighbour_data->recv_flag = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&neighbour_data->recv_mutex); struct data_req *req = (struct data_req *) malloc(sizeof(struct data_req)); req->test_func = test_send_handle_async; req->test_arg = thread_data; req->next = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); req->next = data_req_list; data_req_list = req; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); } static void *progress_func(void *arg) { STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); progress_thread_running = 1; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); while (progress_thread_running) { struct data_req *req; if (data_req_list == NULL) STARPU_PTHREAD_COND_WAIT(&data_req_cond, &data_req_mutex); req = data_req_list; if (req) { data_req_list = req->next; req->next = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); int ret = req->test_func(req->test_arg); if (ret) { free(req); STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); } else { /* ret = 0 : the request is not finished, we put it back at the end of the list */ STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); struct data_req *req_aux = data_req_list; if (!req_aux) { /* The list is empty */ data_req_list = req; } else { while (req_aux) { if (req_aux->next == NULL) { req_aux->next = req; break; } req_aux = req_aux->next; } } } } } STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); return NULL; } static void *thread_func(void *arg) { unsigned iter; struct thread_data *thread_data = (struct thread_data *) arg; unsigned index = thread_data->index; int ret; starpu_variable_data_register(&thread_data->handle, 0, (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_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 /* Create a thread to perform blocking calls */ starpu_pthread_t progress_thread; STARPU_PTHREAD_MUTEX_INIT(&data_req_mutex, NULL); STARPU_PTHREAD_COND_INIT(&data_req_cond, NULL); data_req_list = NULL; progress_thread_running = 0; unsigned t; for (t = 0; t < nthreads; t++) { problem_data[t].index = t; problem_data[t].val = 0; STARPU_PTHREAD_MUTEX_INIT(&problem_data[t].recv_mutex, NULL); problem_data[t].recv_flag = 0; problem_data[t].neighbour = &problem_data[(t+1)%nthreads]; } starpu_pthread_create(&progress_thread, NULL, progress_func, NULL); STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); while (!progress_thread_running) STARPU_PTHREAD_COND_WAIT(&data_req_cond, &data_req_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); for (t = 0; t < nthreads; t++) { ret = starpu_pthread_create(&problem_data[t].thread, NULL, thread_func, &problem_data[t]); STARPU_ASSERT(!ret); } for (t = 0; t < nthreads; t++) { ret = starpu_pthread_join(problem_data[t].thread, &retval); STARPU_ASSERT(!ret); STARPU_ASSERT(retval == NULL); } STARPU_PTHREAD_MUTEX_LOCK(&data_req_mutex); progress_thread_running = 0; STARPU_PTHREAD_COND_SIGNAL(&data_req_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&data_req_mutex); ret = starpu_pthread_join(progress_thread, &retval); STARPU_ASSERT(!ret); STARPU_ASSERT(retval == NULL); /* We check that the value in the "last" thread is valid */ starpu_data_handle_t last_handle = problem_data[nthreads - 1].handle; starpu_data_acquire(last_handle, STARPU_R); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif ret = EXIT_SUCCESS; if (problem_data[nthreads - 1].val != (nthreads * niter)) { FPRINTF(stderr, "Final value : %u should be %d\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.1.5/tests/datawizard/partition_lazy.c0000644000373600000000000000464312571536550016476 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" struct starpu_codelet mycodelet = { .cpu_funcs = { scal_func_cpu}, #ifdef STARPU_USE_OPENCL .opencl_funcs = { scal_func_opencl}, #endif #ifdef STARPU_USE_CUDA .cuda_funcs = { scal_func_cuda}, #endif .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_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/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_insert_task(&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, 0); 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.1.5/tests/datawizard/acquire_cb.c0000644000373600000000000000252412571536547015525 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" unsigned token = 0; starpu_data_handle_t token_handle; void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { token = 42; starpu_data_release(token_handle); } int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&token_handle, 0, (uintptr_t)&token, sizeof(unsigned)); starpu_data_acquire_cb(token_handle, STARPU_RW, callback, NULL); starpu_data_unregister(token_handle); FPRINTF(stderr, "Token: %u\n", token); starpu_shutdown(); return (token == 42) ? EXIT_SUCCESS : EXIT_FAILURE; } starpu-1.1.5/tests/datawizard/readers_and_writers.c0000644000373600000000000000510312571536550017444 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 unsigned book = 0; static starpu_data_handle_t book_handle; static void dummy_kernel(void *descr[], void *arg) { } static struct starpu_codelet r_cl = { .cuda_funcs = {dummy_kernel}, .cpu_funcs = {dummy_kernel}, .opencl_funcs = {dummy_kernel}, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet w_cl = { .cuda_funcs = {dummy_kernel}, .cpu_funcs = {dummy_kernel}, .opencl_funcs = {dummy_kernel}, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* initialize the resource */ starpu_vector_data_register(&book_handle, 0, (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.1.5/tests/datawizard/mpi_like.c0000644000373600000000000001502512571536547015221 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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 #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. */ #ifdef STARPU_USE_CUDA void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif static void increment_handle_cpu_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val += 1; } static struct starpu_codelet increment_handle_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_handle_cpu_kernel}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_unsigned_inc}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_unsigned_inc}, #endif .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->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, 0, (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_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 unsigned t; for (t = 0; t < NTHREADS; t++) { problem_data[t].index = t; problem_data[t].val = 0; STARPU_PTHREAD_COND_INIT(&problem_data[t].recv_cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&problem_data[t].recv_mutex, NULL); problem_data[t].recv_flag = 0; problem_data[t].neighbour = &problem_data[(t+1)%NTHREADS]; } for (t = 0; t < NTHREADS; t++) { ret = starpu_pthread_create(&problem_data[t].thread, NULL, thread_func, &problem_data[t]); STARPU_ASSERT(!ret); } for (t = 0; t < NTHREADS; t++) { void *retval; ret = starpu_pthread_join(problem_data[t].thread, &retval); STARPU_ASSERT(!ret); STARPU_ASSERT(retval == NULL); } /* We check that the value in the "last" thread is valid */ starpu_data_handle_t last_handle = problem_data[NTHREADS - 1].handle; starpu_data_acquire(last_handle, STARPU_R); starpu_data_release(last_handle); for (t = 0; t < NTHREADS; t++) { starpu_data_unregister(problem_data[t].handle); } #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); #endif starpu_shutdown(); ret = EXIT_SUCCESS; if (problem_data[NTHREADS - 1].val != (NTHREADS * NITER)) { FPRINTF(stderr, "Final value : %u should be %d\n", problem_data[NTHREADS - 1].val, (NTHREADS * NITER)); ret = EXIT_FAILURE; } return ret; } starpu-1.1.5/tests/datawizard/cuda_codelet_unsigned_inc.cu0000644000373600000000000000213012571536547020746 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_unsigned_inc(unsigned *val) { val[0]++; } extern "C" void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); _cuda_unsigned_inc<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/scratch_cuda.cu0000644000373600000000000000325112571536550016230 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #define MAXNBLOCKS 32 #define MAXTHREADSPERBLOCK 128 static __global__ void increment_vector(unsigned *v, unsigned *tmp, int nx) { const int tid = threadIdx.x + blockIdx.x*blockDim.x; const int nthreads = gridDim.x * blockDim.x; int i; for (i = tid; i < nx; i += nthreads) { v[i] = tmp[i] + 1; } } extern "C" void cuda_f(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned *tmp = (unsigned *)STARPU_VECTOR_GET_PTR(descr[1]); unsigned nx = STARPU_VECTOR_GET_NX(descr[0]); size_t elemsize = STARPU_VECTOR_GET_ELEMSIZE(descr[0]); cudaMemcpy(tmp, v, nx*elemsize, cudaMemcpyDeviceToDevice); unsigned nblocks = 128; unsigned nthread_per_block = STARPU_MIN(MAXTHREADSPERBLOCK, (nx / nblocks)); increment_vector<<>>(v, tmp, nx); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/cache.c0000644000373600000000000000521712571536546014474 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_USE_CUDA) || defined(STARPU_USE_OPENCL) static void codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { FPRINTF(stderr, "%lx\n", (unsigned long) STARPU_VARIABLE_GET_PTR(descr[0])); FPRINTF(stderr, "codelet\n"); } #endif #ifdef STARPU_USE_CUDA static struct starpu_codelet cuda_cl = { .cuda_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_R} }; #endif #ifdef STARPU_USE_OPENCL static struct starpu_codelet opencl_cl = { .opencl_funcs = {codelet}, .nbuffers = 1, .modes = {STARPU_R} }; #endif void dotest(struct starpu_codelet *cl) { int ret; int var = 42; starpu_data_handle_t handle; starpu_variable_data_register(&handle, 0, (uintptr_t)&var, sizeof(var)); ret = starpu_insert_task(cl, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); starpu_task_wait_for_all(); starpu_data_unregister(handle); starpu_variable_data_register(&handle, 0, (uintptr_t)&var, sizeof(var)); ret = starpu_insert_task(cl, STARPU_R, handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); starpu_task_wait_for_all(); enodev: starpu_data_unregister(handle); } int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_CUDA dotest(&cuda_cl); #endif #ifdef STARPU_USE_OPENCL dotest(&opencl_cl); #endif starpu_shutdown(); return 0; enodev: 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.1.5/tests/datawizard/acquire_cb_insert.c0000644000373600000000000000671212571536547017114 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 N 16 #define M 4 #define X 2 void which_index_cpu(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); /* A real case would actually compute something */ *x0 = X; } struct starpu_codelet which_index = { .cpu_funcs = {which_index_cpu}, .nbuffers = 1, .modes = {STARPU_W} }; void work_cpu(void *descr[], void *_args) { int i, n = STARPU_VECTOR_GET_NX(descr[0]); float *x0 = (float *)STARPU_VECTOR_GET_PTR(descr[0]); for (i = 0; i < n; i++) x0[i] = i + 1; } struct starpu_codelet work = { .cpu_funcs = {work_cpu}, .nbuffers = 1, .modes = {STARPU_W} }; static int x; static starpu_data_handle_t x_handle, f_handle; void callback(void *arg) { starpu_insert_task(&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_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Declare x */ starpu_variable_data_register(&x_handle, 0, (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, 0, (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_insert_task(&which_index, STARPU_W, x_handle, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); /* And submit the corresponding task */ #ifdef __GCC__ STARPU_DATA_ACQUIRE_CB( x_handle, STARPU_R, starpu_insert_task(&work, STARPU_W, starpu_data_get_sub_data(f_handle, 1, x), 0) ); #else starpu_data_acquire_cb(x_handle, STARPU_W, callback, NULL); #endif ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unpartition(f_handle, 0); starpu_data_unregister(f_handle); starpu_data_unregister(x_handle); FPRINTF(stderr, "VALUES: %d", x); for(i=0 ; i #include #include #include #include #include #include "../helper.h" #ifdef STARPU_QUICK_CHECK # define NLOOPS 100 #else # define NLOOPS 1000 #endif #define VECTORSIZE 1024 static starpu_data_handle_t v_handle; /* * Memset */ #ifdef STARPU_USE_CUDA static void cuda_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(buf, 42, length, starpu_cuda_get_local_stream()); cudaStreamSynchronize(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(); 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 */); clFinish(queue); } #endif /* !STARPU_USE_OPENCL */ static void cpu_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); memset(buf, 42, length * sizeof(*buf)); } static struct starpu_codelet memset_cl = { .cpu_funcs = {cpu_memset_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_memset_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_memset_codelet}, #endif .nbuffers = 1, .modes = {STARPU_W} }; /* * Check content */ static void cpu_check_content_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < length; i++) { if (buf[i] != 42) { FPRINTF(stderr, "buf[%u] is '%c' while it should be '%c'\n", i, buf[i], 42); exit(-1); } } } static struct starpu_codelet check_content_cl = { .cpu_funcs = {cpu_check_content_codelet}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* 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.1.5/tests/datawizard/acquire_release_opencl.c0000644000373600000000000000307312571536547020121 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include 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_event event; cl_mem val = (cl_mem)STARPU_VARIABLE_GET_PTR(buffers[0]); id = starpu_worker_get_id(); 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, &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.1.5/tests/datawizard/lazy_allocation.c0000644000373600000000000001262012571536547016612 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include "../helper.h" #define VECTORSIZE 1024 static starpu_data_handle_t v_handle; /* * Memset */ #ifdef STARPU_USE_CUDA static void cuda_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); cudaMemsetAsync(buf, 42, length, starpu_cuda_get_local_stream()); cudaStreamSynchronize(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(); 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 */); clFinish(queue); } #endif static void cpu_memset_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); memset(buf, 42, length * sizeof(*buf)); } static struct starpu_codelet memset_cl = { .cpu_funcs = {cpu_memset_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_memset_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_memset_codelet}, #endif .nbuffers = 1, .modes = {STARPU_W} }; /* * Check content */ static void cpu_check_content_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < length; i++) { if (buf[i] != 42) { FPRINTF(stderr, "buf[%u] is %c while it should be %c\n", i, buf[i], 42); exit(-1); } } } #ifdef STARPU_USE_CUDA static void cuda_check_content_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); unsigned length = STARPU_VECTOR_GET_NX(descr[0]); unsigned i; for (i = 0; i < length; i++) { char dst; cudaMemcpyAsync(&dst, &buf[i], sizeof(char), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); if (dst != 42) { FPRINTF(stderr, "buf[%u] is %c while it should be %c\n", i, dst, 42); exit(-1); } } } #endif #ifdef STARPU_USE_OPENCL static void opencl_check_content_codelet(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; cl_command_queue queue; int id = starpu_worker_get_id(); 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 .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_vector_data_register(&v_handle, (uint32_t)-1, (uintptr_t)NULL, VECTORSIZE, sizeof(char)); ret = starpu_insert_task(&memset_cl, STARPU_W, v_handle, 0); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); ret = starpu_insert_task(&check_content_cl, STARPU_R, v_handle, 0); STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); 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.1.5/tests/datawizard/in_place_partition.c0000644000373600000000000000540512571536550017266 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include "scal.h" int main(int argc, char **argv) { unsigned *foo; starpu_data_handle_t handle; int ret; unsigned n, i, size; 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/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, 0, (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, 0); 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.1.5/tests/datawizard/dsm_stress.c0000644000373600000000000001430412571536547015615 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 #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) { ANNOTATE_HAPPENS_BEFORE(&cnt); unsigned res = STARPU_ATOMIC_ADD(&cnt, -1); if (res == 0) { ANNOTATE_HAPPENS_AFTER(&cnt); STARPU_PTHREAD_MUTEX_LOCK(&mutex); finished = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } static void cuda_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static void opencl_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static void cpu_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static enum starpu_data_access_mode select_random_mode(void) { int r = rand(); switch (r % 3) { case 0: return STARPU_R; case 1: return STARPU_W; case 2: return STARPU_RW; }; return STARPU_RW; } static struct starpu_codelet cl_r_r = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .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}, .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}, .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}, .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}, .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}, .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}, .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}, .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}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_RW} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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, 0, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&v_handle2, 0, (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_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.1.5/tests/datawizard/acquire_release_opencl_kernel.cl0000644000373600000000000000131112571536546021625 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void _increment_opencl_codelet(__global unsigned *val) { val[0]++; } starpu-1.1.5/tests/datawizard/lazy_unregister.c0000644000373600000000000000376412571536547016665 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" static void dummy_func(void ** buffers, void * args) { (void) buffers; (void) args; } static struct starpu_codelet dummy_cl = { .modes = { STARPU_RW }, .cpu_funcs = { 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, 0, (uintptr_t)buffer, 1024*sizeof(int)); t1 = starpu_task_create(); t2 = starpu_task_create(); t2->cl = &dummy_cl; t2->detach = 0; t2->handles[0] = handle; starpu_task_declare_deps_array(t2, 1, &t1); ret = starpu_task_submit(t2); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_data_unregister_submit(handle); ret = starpu_task_submit(t1); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(t2); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); while (starpu_data_lookup(buffer) != NULL) usleep(100000); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/datawizard/specific_node.c0000644000373600000000000000707312571536550016220 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" starpu_data_handle_t data_handle; unsigned data; void specific_kernel(STARPU_ATTRIBUTE_UNUSED void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { /* We do not protect this variable because it is only accessed when the * "data_handle" piece of data is accessed. */ unsigned *dataptr = (unsigned*) STARPU_VARIABLE_GET_PTR(descr[0]); STARPU_ASSERT(dataptr == &data); (*dataptr)++; } static struct starpu_codelet specific_cl = { .cpu_funcs = {specific_kernel}, .cuda_funcs = {specific_kernel}, .opencl_funcs = {specific_kernel}, .nbuffers = 1, .modes = {STARPU_RW}, .specific_nodes = 1, .nodes = {0}, }; #ifdef STARPU_USE_CUDA void cuda_codelet_unsigned_inc(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg); #endif #ifdef STARPU_USE_OPENCL void opencl_codelet_unsigned_inc(void *buffers[], void *args); #endif static struct starpu_codelet cl = { .cpu_funcs = {specific_kernel}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_unsigned_inc}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_unsigned_inc}, #endif .nbuffers = 1, .modes = {STARPU_RW}, }; #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(STARPU_ATTRIBUTE_UNUSED int argc, STARPU_ATTRIBUTE_UNUSED char **argv) { #ifdef STARPU_QUICK_CHECK unsigned ntasks = 10; #else unsigned ntasks = 1000; #endif int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); #ifdef STARPU_USE_OPENCL ret = starpu_opencl_load_opencl_from_file("tests/datawizard/opencl_codelet_unsigned_inc_kernel.cl", &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); #endif data = 0; /* Create a void data which will be used as an exclusion mechanism. */ starpu_variable_data_register(&data_handle, 0, (uintptr_t) &data, sizeof(data)); unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); if (i%2) task->cl = &specific_cl; else task->cl = &cl; task->handles[0] = data_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } starpu_data_unregister(data_handle); ret = (data == ntasks) ? EXIT_SUCCESS : EXIT_FAILURE; #ifdef STARPU_USE_OPENCL ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "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.1.5/tests/datawizard/no_unregister.c0000644000373600000000000000405212571536547016311 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 not unregistering a data is not too crashy */ #include #include #include #include #include "../helper.h" void dummy_func(void ** buffers, void * args) { (void) buffers; (void) args; } static struct starpu_codelet dummy_cl = { .modes = { STARPU_RW }, .cpu_funcs = { 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 ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (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.1.5/tests/datawizard/acquire_release2.c0000644000373600000000000000737712571536546016655 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 static unsigned ntasks = 40; #else static unsigned ntasks = 40000; #endif #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void increment_opencl(void *buffers[], void *args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*tokenptr)++; } static struct starpu_codelet increment_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl}, #endif .nbuffers = 1 }; unsigned token = 0; starpu_data_handle_t token_handle; 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); } void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { starpu_data_release(token_handle); } #ifdef STARPU_DEVEL # warning TODO add threads #endif #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; #endif int main(int argc, char **argv) { unsigned i; int ret; ret = starpu_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/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, 0, (uintptr_t)&token, sizeof(unsigned)); FPRINTF(stderr, "Token: %u\n", token); for(i=0; i #include "../helper.h" static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet codelet_R_R = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_R, STARPU_R} }; static struct starpu_codelet codelet_R_W = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_R, STARPU_W} }; static struct starpu_codelet codelet_R_RW = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_R, STARPU_RW} }; static struct starpu_codelet codelet_W_R = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_W, STARPU_R} }; static struct starpu_codelet codelet_W_W = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_W, STARPU_W} }; static struct starpu_codelet codelet_W_RW = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_W, STARPU_RW} }; static struct starpu_codelet codelet_RW_R = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R} }; static struct starpu_codelet codelet_RW_W = { .cpu_funcs = { dummy_func}, .model = NULL, .nbuffers = 2, .modes = {STARPU_RW, STARPU_W} }; static struct starpu_codelet codelet_RW_RW = { .cpu_funcs = { 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_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (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.1.5/tests/datawizard/write_only_tmp_buffer.c0000644000373600000000000000755612571536550020040 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #define VECTORSIZE 1024 starpu_data_handle_t v_handle; #ifdef STARPU_USE_OPENCL static void opencl_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; cl_mem buf = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); char ptr = 42; cl_command_queue queue; int id = starpu_worker_get_id(); 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); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void cuda_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); cudaMemsetAsync(buf, 42, 1, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void cpu_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); *buf = 42; } static void display_var(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; char *buf = (char *)STARPU_VECTOR_GET_PTR(descr[0]); if (*buf != 42) { FPRINTF(stderr, "Value = <%c> (should be <%c>)\n", *buf, 42); exit(-1); } } static struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet_null}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_codelet_null}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_codelet_null}, #endif .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet display_cl = { .cpu_funcs = {display_var}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* 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.1.5/tests/datawizard/scal.c0000644000373600000000000000553012571536547014352 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "scal.h" #include "helper.h" void scal_func_cpu(void *buffers[], void *cl_arg) { STARPU_SKIP_IF_VALGRIND; unsigned i; struct starpu_vector_interface *vector = (struct starpu_vector_interface *) buffers[0]; unsigned *val = (unsigned *) STARPU_VECTOR_GET_PTR(vector); unsigned n = STARPU_VECTOR_GET_NX(vector); /* scale the vector */ for (i = 0; i < n; i++) val[i] *= 2; } #ifdef STARPU_USE_OPENCL struct starpu_opencl_program opencl_program; void scal_func_opencl(void *buffers[], void *_args) { STARPU_SKIP_IF_VALGRIND; int id, devid; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; 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(); devid = starpu_worker_get_devid(id); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "vector_mult_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); err |= clSetKernelArg(kernel, 1, sizeof(offset), &offset); err |= clSetKernelArg(kernel, 2, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local=global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } #endif struct starpu_codelet scal_codelet = { .cpu_funcs = { scal_func_cpu}, #ifdef STARPU_USE_OPENCL .opencl_funcs = { scal_func_opencl}, #endif #ifdef STARPU_USE_CUDA .cuda_funcs = { scal_func_cuda}, #endif .modes = { STARPU_RW }, .model = NULL, .nbuffers = 1 }; starpu-1.1.5/tests/datawizard/handle_to_pointer.c0000644000373600000000000001040512571536547017122 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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" static 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()); } cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void opencl_task(void *buffers[], void *args) { cl_command_queue queue; int id = starpu_worker_get_id(); 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 */); } clFinish(queue); } #endif static struct starpu_codelet cl = { .cpu_funcs = {cpu_task}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_task}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {opencl_task}, #endif .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char *argv[]) { int err, ret; int i; int *pointer; starpu_data_handle_t handle; static const int count = 123; ret = starpu_init(NULL); 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, 0, (uintptr_t)pointer, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, 0) == pointer); starpu_data_unregister(handle); starpu_vector_data_register(&handle, 0, (uintptr_t)pointer, count, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, 0) == pointer); starpu_data_unregister(handle); starpu_matrix_data_register(&handle, 0, (uintptr_t)pointer, 0, count, 1, sizeof(int)); STARPU_ASSERT(starpu_data_handle_to_pointer(handle, 0) == 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, 0) == NULL); /* Pass the handle to a task. */ err = starpu_insert_task(&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, 0); if (pointer == NULL) { FPRINTF(stderr, "pointer should be non NULL\n"); ret = EXIT_FAILURE; } else { for(i = 0; i < count; i++) { int *numbers = (int *)pointer; if (numbers[i] != i) { FPRINTF(stderr, "Incorrect value numbers[%d] == %d should be %d\n", (int)i, numbers[i], (int)i); ret = EXIT_FAILURE; } } } starpu_data_release(handle); starpu_data_unregister(handle); starpu_shutdown(); return ret; } starpu-1.1.5/tests/datawizard/nowhere.c0000644000373600000000000000623312571536546015077 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include "../helper.h" static int x, y; static void prod(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *v = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); *v = 1; } static struct starpu_codelet cl_prod = { .cpu_funcs = { prod }, .nbuffers = 1, .modes = { STARPU_W }, }; static void callback(void *callback_arg) { STARPU_ASSERT(x>=1); STARPU_ASSERT(y>=1); } static struct starpu_codelet cl_nowhere = { .where = STARPU_NOWHERE, .nbuffers = 2, .modes = { STARPU_R, STARPU_R }, }; static void cons(void *descr[], void *_args STARPU_ATTRIBUTE_UNUSED) { int *v = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); STARPU_ASSERT(*v == 1); *v = 2; } static struct starpu_codelet cl_cons = { .cpu_funcs = { cons }, .nbuffers = 1, .modes = { STARPU_RW }, }; int main(int argc, char **argv) { starpu_data_handle_t handle_x, handle_y; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle_x, 0, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&handle_y, 0, (uintptr_t)&y, sizeof(y)); ret = starpu_insert_task(&cl_prod, STARPU_W, handle_x, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); ret = starpu_insert_task(&cl_prod, STARPU_W, handle_y, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); ret = starpu_insert_task(&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_insert_task"); ret = starpu_insert_task(&cl_cons, STARPU_RW, handle_x, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); ret = starpu_insert_task(&cl_cons, STARPU_RW, handle_y, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); 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.1.5/tests/datawizard/dining_philosophers.c0000644000373600000000000000513112571536550017466 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" /* number of philosophers */ #define N 16 starpu_data_handle_t fork_handles[N]; unsigned forks[N]; static void eat_kernel(void *descr[], void *arg) { } static struct starpu_codelet eating_cl = { .modes = { STARPU_RW, STARPU_RW }, .cuda_funcs = {eat_kernel}, .cpu_funcs = {eat_kernel}, .opencl_funcs = {eat_kernel}, .nbuffers = 2 }; 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_init(NULL); 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], 0, (uintptr_t)&forks[f], 1, sizeof(unsigned)); } 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.1.5/tests/datawizard/sync_and_notify_data_opencl.c0000644000373600000000000000503112571536550021135 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" extern struct starpu_opencl_program opencl_code; void opencl_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); cl_kernel kernel; cl_command_queue queue; cl_event event; int id, devid, err; id = starpu_worker_get_id(); 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, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); } void opencl_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(descr[0]); cl_kernel kernel; cl_command_queue queue; cl_event event; int id, devid, err; id = starpu_worker_get_id(); 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, &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.1.5/tests/datawizard/manual_reduction.c0000644000373600000000000001604112571536547016760 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 INIT_VALUE 42 #define NTASKS 10000 static unsigned variable; static starpu_data_handle_t variable_handle; static uintptr_t per_worker[STARPU_NMAXWORKERS]; static starpu_data_handle_t per_worker_handle[STARPU_NMAXWORKERS]; /* Create per-worker handles */ static void initialize_per_worker_handle(void *arg STARPU_ATTRIBUTE_UNUSED) { int workerid = starpu_worker_get_id(); /* 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: cudaMalloc((void **)&per_worker[workerid], sizeof(variable)); cudaMemset((void *)per_worker[workerid], 0, sizeof(variable)); break; #endif default: STARPU_ABORT(); break; } STARPU_ASSERT(per_worker[workerid]); } /* * Implement reduction method */ static void cpu_redux_func(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *a = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *b = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); FPRINTF(stderr, "%u = %u + %u\n", *a + *b, *a, *b); *a = *a + *b; } static struct starpu_codelet reduction_codelet = { .cpu_funcs = {cpu_redux_func}, .cuda_funcs = {NULL}, .nbuffers = 2, .modes = {STARPU_RW, STARPU_R}, .model = NULL }; /* * Use per-worker local copy */ static void cpu_func_incr(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *val = *val + 1; } #ifdef STARPU_USE_CUDA /* dummy CUDA implementation */ static void cuda_func_incr(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_val; cudaMemcpyAsync(&h_val, val, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); h_val++; cudaMemcpyAsync(val, &h_val, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void opencl_func_incr(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_val = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_val; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_val, CL_FALSE, 0, sizeof(unsigned), (void *)&h_val, 0, NULL, NULL); clFinish(queue); h_val++; clEnqueueWriteBuffer(queue, d_val, CL_FALSE, 0, sizeof(unsigned), (void *)&h_val, 0, NULL, NULL); clFinish(queue); } #endif static struct starpu_codelet use_data_on_worker_codelet = { .cpu_funcs = {cpu_func_incr}, #ifdef STARPU_USE_CUDA .cuda_funcs = {cuda_func_incr}, #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; variable = INIT_VALUE; ret = starpu_init(NULL); 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, 0, (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 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.1.5/tests/datawizard/sync_and_notify_data_opencl_codelet.cl0000644000373600000000000000160212571536547023016 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/tests/datawizard/interfaces/0002755000373600000000000000000012571541162015453 500000000000000starpu-1.1.5/tests/datawizard/interfaces/matrix/0002755000373600000000000000000012571541162016757 500000000000000starpu-1.1.5/tests/datawizard/interfaces/matrix/matrix_cuda.cu0000644000373600000000000000371512571536547021547 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config matrix_config; __global__ void matrix_cuda(int *val, unsigned n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (val[i] != i*factor) *err = 1; else val[i] = -val[i]; } extern "C" void test_matrix_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; unsigned int nx, ny, n; nx = STARPU_MATRIX_GET_NX(buffers[0]); ny = STARPU_MATRIX_GET_NY(buffers[0]); n = nx * ny; unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_MATRIX_GET_PTR(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &matrix_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); matrix_cuda<<>>(val, n, ret, factor); error = cudaMemcpy(&matrix_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/matrix/matrix_opencl.c0000644000373600000000000000647612571536547021735 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/matrix/matrix_opencl_kernel.cl" extern struct test_config matrix_config; static struct starpu_opencl_program matrix_program; void test_matrix_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, factor, ret; unsigned int n; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_context context; cl_mem val, fail; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &matrix_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); factor = *(int *)args; n = STARPU_MATRIX_GET_NX(buffers[0]); n*= STARPU_MATRIX_GET_NY(buffers[0]); val = (cl_mem)STARPU_MATRIX_GET_DEV_HANDLE(buffers[0]); id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); err = starpu_opencl_load_kernel(&kernel, &queue, &matrix_program, "matrix_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &matrix_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); /* Setting args */ int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(val), &val, sizeof(n), &n, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &matrix_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&matrix_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/matrix/matrix_interface.c0000644000373600000000000000624712571536547022411 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" #define WIDTH 16 #define HEIGHT 16 #ifdef STARPU_USE_CPU static 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 .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, 0, (uintptr_t) matrix, WIDTH, /* ld */ WIDTH, HEIGHT, sizeof(matrix[0])); starpu_matrix_data_register(&matrix2_handle, 0, (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); } static 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(void) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&matrix_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/matrix/matrix_opencl_kernel.cl0000644000373600000000000000164412571536547023441 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/tests/datawizard/interfaces/coo/0002755000373600000000000000000012571541162016233 500000000000000starpu-1.1.5/tests/datawizard/interfaces/coo/coo_interface.c0000644000373600000000000000675112571536547021141 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" #define NX 2 #define NY 2 #define MATRIX_SIZE (NX*NY) #ifdef STARPU_USE_CPU static 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 */ .handle = &coo_handle, .dummy_handle = &coo2_handle, .copy_failed = SUCCESS, .name = "coo_interface" }; static 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, 0, NX, NY, MATRIX_SIZE, columns, rows, (uintptr_t) values, sizeof(values[0])); starpu_coo_data_register(&coo2_handle, 0, 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(void) { struct starpu_conf conf; data_interface_test_summary *summary; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&coo_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); data_interface_test_summary_print(stderr, summary); starpu_shutdown(); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/coo/coo_opencl.c0000644000373600000000000000646012571536547020456 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../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(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); err = starpu_opencl_load_kernel(&kernel, &queue, &coo_program, "test_coo_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &coo_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); /* Setting args */ int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(val), &val, sizeof(n), &n, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &coo_config.copy_failed, 0, NULL, NULL); if (coo_config.copy_failed != 0) { fprintf(stderr, "FUCK copy_failed %d\n", coo_config.copy_failed); } if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&coo_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/coo/coo_cuda.cu0000644000373600000000000000352012571536547020271 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config coo_config; __global__ void coo_cuda(int *val, uint32_t n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (val[i] != i * factor) *err = 1; else val[i] *= -1; } extern "C" void test_coo_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; uint32_t nvalues = STARPU_COO_GET_NVALUES(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (nvalues + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_COO_GET_VALUES(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &coo_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); coo_cuda<<>> (val, nvalues, ret, factor); error = cudaMemcpy(&coo_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/coo/coo_opencl_kernel.cl0000644000373600000000000000161112571536547022163 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void test_coo_opencl(__global int *val, unsigned int nx, __global int *err, int factor) { const int i = get_global_id(0); if (i >= nx) return; if (val[i] != i * factor) *err = val[1]; else val[i] = - val[i]; } starpu-1.1.5/tests/datawizard/interfaces/void/0002755000373600000000000000000012571541162016414 500000000000000starpu-1.1.5/tests/datawizard/interfaces/void/void_interface.c0000644000373600000000000000364412571536547021501 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" #include "../../../helper.h" static 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 .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(void) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&void_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/block/0002755000373600000000000000000012571541162016545 500000000000000starpu-1.1.5/tests/datawizard/interfaces/block/block_interface.c0000644000373600000000000000741212571536550021752 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" #define NX 16 #define NY NX #define NZ NX /* Prototypes */ static void register_data(void); static void unregister_data(void); static 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 .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, 0, (uintptr_t)_block, NX, NX * NY, NX, NY, NZ, sizeof(_block[0])); starpu_block_data_register(&_block2_handle, 0, (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); } static 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(void) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&block_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/block/block_opencl_kernel.cl0000644000373600000000000000231412571536550023002 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ __kernel void block_opencl(__global int *block, int nx, int ny, int nz, int ldy, int ldz, int factor, __global int *err) { const int id = get_global_id(0); if (id > 0) return; unsigned int i, j, k; int val = 0; for (k = 0; k < nz; k++) { for (j = 0; j < ny; j++) { for (i = 0; i < nx; i++) { if (block[(k*ldz)+(j*ldy)+i] != factor * val) { *err = 1; return; } else { block[(k*ldz)+(j*ldy)+i] *= -1; val++; } } } } } starpu-1.1.5/tests/datawizard/interfaces/block/block_opencl.c0000644000373600000000000000637212571536550021276 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/block/block_opencl_kernel.cl" extern struct test_config block_config; static struct starpu_opencl_program opencl_program; void test_block_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); int nx = STARPU_BLOCK_GET_NX(buffers[0]); int ny = STARPU_BLOCK_GET_NY(buffers[0]); int nz = STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); cl_mem block = (cl_mem) STARPU_BLOCK_GET_DEV_HANDLE(buffers[0]); cl_context context; id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &block_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "block_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(block), &block, sizeof(nx), &nx, sizeof(ny), &ny, sizeof(nz), &nz, sizeof(ldy), &ldy, sizeof(ldz), &ldz, sizeof(factor), &factor, sizeof(fail), &fail, 0); if (nargs != 8) { fprintf(stderr, "Failed to set argument #%d\n", nargs); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global = nx * ny * nz; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &block_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/block/block_cuda.cu0000644000373600000000000000441012571536550021106 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config block_config; static __global__ void block_cuda(int *block, int nx, int ny, int nz, unsigned ldy, unsigned ldz, float factor, int *err) { int i, j, k; int val = 0; for (k = 0; k < nz ;k++) { for (j = 0; j < ny ;j++) { for(i = 0; i < nx ;i++) { if (block[(k*ldz)+(j*ldy)+i] != factor * val) { *err = 1; return; } else { block[(k*ldz)+(j*ldy)+i] *= -1; val++; } } } } } extern "C" void test_block_cuda_func(void *buffers[], void *args) { cudaError_t error; int *ret; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &block_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); int nx = STARPU_BLOCK_GET_NX(buffers[0]); int ny = STARPU_BLOCK_GET_NY(buffers[0]); int nz = STARPU_BLOCK_GET_NZ(buffers[0]); unsigned ldy = STARPU_BLOCK_GET_LDY(buffers[0]); unsigned ldz = STARPU_BLOCK_GET_LDZ(buffers[0]); int *block = (int *) STARPU_BLOCK_GET_PTR(buffers[0]); int factor = *(int*) args; block_cuda<<<1,1, 0, starpu_cuda_get_local_stream()>>> (block, nx, ny, nz, ldy, ldz, factor, ret); error = cudaMemcpy(&block_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/vector/0002755000373600000000000000000012571541162016755 500000000000000starpu-1.1.5/tests/datawizard/interfaces/vector/test_vector_opencl_kernel.cl0000644000373600000000000000166412571536547024476 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/tests/datawizard/interfaces/vector/test_vector_interface.c0000644000373600000000000000621012571536547023432 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" /* Prototypes */ static void register_data(void); static void unregister_data(void); static void test_vector_cpu_func(void *buffers[], void *args); #ifdef STARPU_USE_CUDA extern void test_vector_cuda_func(void *buffers[], void *_args); #endif #ifdef STARPU_USE_OPENCL extern void test_vector_opencl_func(void *buffers[], void *args); #endif static starpu_data_handle_t vector_handle; static starpu_data_handle_t vector2_handle; struct test_config vector_config = { .cpu_func = test_vector_cpu_func, #ifdef STARPU_USE_CUDA .cuda_func = test_vector_cuda_func, #endif #ifdef STARPU_USE_OPENCL .opencl_func = test_vector_opencl_func, #endif .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, 0, (uintptr_t)vector, VECTOR_SIZE, sizeof(int)); starpu_vector_data_register(&vector2_handle, 0, (uintptr_t)vector2, VECTOR_SIZE, sizeof(int)); } static void unregister_data(void) { starpu_data_unregister(vector_handle); starpu_data_unregister(vector2_handle); } static 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(void) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&vector_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/vector/test_vector_cuda.cu0000644000373600000000000000362012571536547022575 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config vector_config; __global__ void framework_cuda(int *val, unsigned n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (val[i] != i*factor) *err = 1; else val[i] = -val[i]; } extern "C" void test_vector_cuda_func(void *buffers[], void *args) { cudaError_t error; int *ret; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) { fprintf(stderr, "cudaMalloc failed...\n"); return; } error = cudaMemcpy(ret, &vector_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) return; unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); int *val = (int *)STARPU_VECTOR_GET_PTR(buffers[0]); int factor = *(int*) args; unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; framework_cuda<<>>(val, n, ret, factor); error = cudaMemcpy(&vector_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) { return; } cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/vector/test_vector_opencl.c0000644000373600000000000000647312571536547022765 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/vector/test_vector_opencl_kernel.cl" extern struct test_config vector_config; static struct starpu_opencl_program opencl_program; void test_vector_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); unsigned n = STARPU_VECTOR_GET_NX(buffers[0]); cl_mem val = (cl_mem)STARPU_VECTOR_GET_DEV_HANDLE(buffers[0]); cl_context context; id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &vector_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "test_vector_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(val), &val, sizeof(n), &n, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) { fprintf(stderr, "Failed to set argument #%d\n", err); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &vector_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/test_interfaces.h0000644000373600000000000000435212571536550020735 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef TEST_INTERFACES_H #define TEST_INTERFACES_H #include "../../helper.h" /* * Users do not know about this enum. They only know that SUCCESS is 0, and * FAILURE is 1. Therefore, the values of SUCCESS and FAILURE shall not be * changed. */ enum exit_code { SUCCESS = 0, FAILURE = 1, UNTESTED = 2, TASK_CREATION_FAILURE = 3, TASK_SUBMISSION_FAILURE = 4 }; struct test_config { /* A pointer to a registered handle */ starpu_data_handle_t *handle; /* A pointer to a registered handle, that will be used to test * RAM to RAM copy. The values it points to should be different from * the ones pointed to by the previous handle. */ starpu_data_handle_t *dummy_handle; /* StarPU codelets. The following functions should : * 1) Check that the values are correct * 2) Negate every element */ starpu_cpu_func_t cpu_func; #ifdef STARPU_USE_CUDA starpu_cuda_func_t cuda_func; #endif #ifdef STARPU_USE_OPENCL starpu_opencl_func_t opencl_func; #endif /* The previous codelets must update this field at the end of their * execution. copy_failed must be FAILURE if the copy failed, SUCCESS otherwise. */ enum exit_code copy_failed; /* A human-readable name for the test */ const char *name; }; typedef struct data_interface_test_summary data_interface_test_summary; void data_interface_test_summary_print(FILE *, data_interface_test_summary *); int data_interface_test_summary_success(data_interface_test_summary *); data_interface_test_summary *run_tests(struct test_config*); #endif /* !TEST_INTERFACES_H */ starpu-1.1.5/tests/datawizard/interfaces/csr/0002755000373600000000000000000012571541162016242 500000000000000starpu-1.1.5/tests/datawizard/interfaces/csr/csr_opencl_kernel.cl0000644000373600000000000000170112571536550022173 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/tests/datawizard/interfaces/csr/csr_opencl.c0000644000373600000000000000644712571536550020473 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/csr/csr_opencl_kernel.cl" extern struct test_config csr_config; static struct starpu_opencl_program opencl_program; void test_csr_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); uint32_t nnz = STARPU_CSR_GET_NNZ(buffers[0]); cl_mem nzval = (cl_mem)STARPU_CSR_GET_NZVAL(buffers[0]); cl_context context; id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &csr_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "test_csr_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(nzval), &nzval, sizeof(nnz), &nnz, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) { fprintf(stderr, "Failed to set argument #%d\n", err); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global = nnz; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &csr_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/csr/csr_interface.c0000644000373600000000000000670312571536550021146 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" #define WIDTH 8 #define HEIGHT 4 #define SIZE (WIDTH * HEIGHT) #define NNZ (SIZE-1) #ifdef STARPU_USE_CPU static 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 .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, 0, NNZ, HEIGHT, (uintptr_t) nzval, colind, rowptr, 0, sizeof(nzval[0])); starpu_csr_data_register(&csr2_handle, 0, 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); } static 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(void) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) goto enodev; register_data(); summary = run_tests(&csr_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); enodev: return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/csr/csr_cuda.cu0000644000373600000000000000361012571536550020301 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config csr_config; __global__ void csr_cuda(int *nzval, uint32_t nnz, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= nnz) return; if (nzval[i] != (i+1)*factor) *err = 1; else nzval[i] = -nzval[i]; } extern "C" void test_csr_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; uint32_t nnz = STARPU_CSR_GET_NNZ(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (nnz + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_CSR_GET_NZVAL(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &csr_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); csr_cuda<<>> (val, nnz, ret, factor); error = cudaMemcpy(&csr_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/variable/0002755000373600000000000000000012571541162017240 500000000000000starpu-1.1.5/tests/datawizard/interfaces/variable/variable_opencl.c0000644000373600000000000000642312571536550022461 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/variable/variable_opencl_kernel.cl" extern struct test_config variable_config; static struct starpu_opencl_program opencl_program; void test_variable_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, ret; int factor = *(int *) args; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); cl_mem val = (cl_mem)STARPU_VARIABLE_GET_PTR(buffers[0]); cl_context context; id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &variable_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "variable_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(fail), &fail); if (err) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global = 1; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &variable_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); return; } starpu-1.1.5/tests/datawizard/interfaces/variable/variable_opencl_kernel.cl0000644000373600000000000000163112571536550024171 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/tests/datawizard/interfaces/variable/variable_interface.c0000644000373600000000000000537712571536550023150 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" static int variable; static int variable2; static starpu_data_handle_t variable_handle; static starpu_data_handle_t variable2_handle; /* Codelets */ #ifdef STARPU_USE_CPU static 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 .handle = &variable_handle, .dummy_handle = &variable2_handle, .copy_failed = SUCCESS, .name = "variable_interface" }; static 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, 0, (uintptr_t) &variable, sizeof(variable)); starpu_variable_data_register(&variable2_handle, 0, (uintptr_t) &variable2, sizeof(variable2)); } static void unregister_data(void) { starpu_data_unregister(variable_handle); starpu_data_unregister(variable2_handle); } int main(void) { int ret; data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; register_data(); summary = run_tests(&variable_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); } starpu-1.1.5/tests/datawizard/interfaces/variable/variable_cuda.cu0000644000373600000000000000353612571536550022304 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config variable_config; static __global__ void variable_cuda(int *val, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i > 0) return; if (*val != 42 * factor) *err = 1; else *val *= -1; } extern "C" void test_variable_cuda_func(void *buffers[], void *args) { cudaError_t error; int *ret; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &variable_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); int *val = (int *)STARPU_VARIABLE_GET_PTR(buffers[0]); int factor = *(int*) args; unsigned threads_per_block = 64; unsigned nblocks = 1; variable_cuda<<>>(val, ret, factor); error = cudaMemcpy(&variable_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/bcsr/0002755000373600000000000000000012571541162016404 500000000000000starpu-1.1.5/tests/datawizard/interfaces/bcsr/bcsr_cuda.cu0000644000373600000000000000375612571536550020620 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../test_interfaces.h" extern struct test_config bcsr_config; __global__ void bcsr_cuda(int *nzval, uint32_t nnz, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= nnz) return; if (nzval[i] != i*factor) *err = 1; else nzval[i] = -nzval[i]; } extern "C" void test_bcsr_cuda_func(void *buffers[], void *args) { int factor; int *ret; int *val; cudaError_t error; uint32_t nnz = STARPU_BCSR_GET_NNZ(buffers[0]); uint32_t r = ((struct starpu_bcsr_interface *)buffers[0])->r; uint32_t c = ((struct starpu_bcsr_interface *)buffers[0])->c; nnz *= (r*c); unsigned threads_per_block = 64; unsigned nblocks = (nnz + threads_per_block-1) / threads_per_block; factor = *(int *) args; val = (int *) STARPU_BCSR_GET_NZVAL(buffers[0]); error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &bcsr_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); bcsr_cuda<<>> (val, nnz, ret, factor); error = cudaMemcpy(&bcsr_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl0000644000373600000000000000170112571536550022477 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/tests/datawizard/interfaces/bcsr/bcsr_opencl.c0000644000373600000000000000662012571536550020770 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../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(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); cl_mem fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &bcsr_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_program, "test_bcsr_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); int nargs; nargs = starpu_opencl_set_kernel_args(&err, &kernel, sizeof(nzval), &nzval, sizeof(nnz), &nnz, sizeof(fail), &fail, sizeof(factor), &factor, 0); if (nargs != 4) { fprintf(stderr, "Failed to set argument #%d\n", err); STARPU_OPENCL_REPORT_ERROR(err); } { size_t global = nnz; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &bcsr_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/bcsr/bcsr_interface.c0000644000373600000000000001074012571536550021446 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011, 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #include "../../../helper.h" /* * In this test, we use the following matrix: * * +----------------+ * | 0 1 0 0 | * | 2 3 0 0 | * | 4 5 8 9 | * | 6 7 10 11 | * +----------------+ * * nzval = [0, 1, 2, 3] ++ [4, 5, 6, 7] ++ [8, 9, 10, 11] * colind = [0, 0, 1] * rowptr = [0, 1 ] * 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) #ifdef STARPU_USE_CPU static 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, /* Fisrt 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, 2 }; static uint32_t colind2[NNZ_BLOCKS]; static uint32_t rowptr[2] = { 0, 1 }; static uint32_t rowptr2[2]; 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 */ .handle = &bcsr_handle, .dummy_handle = &bcsr2_handle, .copy_failed = SUCCESS, .name = "bcsr_interface" }; static void register_data(void) { starpu_bcsr_data_register(&bcsr_handle, 0, NNZ_BLOCKS, 1, /* nrow */ (uintptr_t) nzval, colind, rowptr, 0, /* firstentry */ R, C, sizeof(nzval[0])); starpu_bcsr_data_register(&bcsr2_handle, 0, NNZ_BLOCKS, 1, /* nrow */ (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); } static 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(void) { data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; if (starpu_init(&conf) == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; register_data(); summary = run_tests(&bcsr_config); if (!summary) exit(EXIT_FAILURE); unregister_data(); starpu_shutdown(); data_interface_test_summary_print(stderr, summary); return data_interface_test_summary_success(summary); } starpu-1.1.5/tests/datawizard/interfaces/test_interfaces.c0000644000373600000000000004063312571536547020740 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * Copyright (C) 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* XXX Why cant we dereference a handle without this one ? */ #include #include #include "test_interfaces.h" #include "../../helper.h" /* * This is definitely note thrad-safe. */ static struct test_config *current_config; /* TODO : - OpenCL to OpenCL support */ static char * enum_to_string(int exit_code) { switch (exit_code) { case SUCCESS: return "Success"; case FAILURE: return "Failure"; case UNTESTED: return "Untested"; case TASK_CREATION_FAILURE: return "Task creation failed"; case TASK_SUBMISSION_FAILURE: return "Task submission failed"; default: assert(0); } } struct data_interface_test_summary { int success; /* Copy methods */ #ifdef STARPU_USE_CPU int cpu_to_cpu; #endif #ifdef STARPU_USE_CUDA int cpu_to_cuda; int cuda_to_cuda; int cuda_to_cpu; int cpu_to_cuda_async; int cuda_to_cpu_async; int cuda_to_cuda_async; #endif #ifdef STARPU_USE_OPENCL int cpu_to_opencl; int opencl_to_cpu; int cpu_to_opencl_async; int opencl_to_cpu_async; #endif /* Other stuff */ int compare; #ifdef STARPU_USE_CPU int handle_to_pointer; #endif }; void data_interface_test_summary_print(FILE *f, struct data_interface_test_summary *s) { if (!f) f = stderr; FPRINTF(f, "%s : %s\n", current_config->name, enum_to_string(s->success)); FPRINTF(f, "Asynchronous :\n"); #ifdef STARPU_USE_CUDA FPRINTF(f, "\tCPU -> CUDA : %s\n", enum_to_string(s->cpu_to_cuda_async)); FPRINTF(f, "\tCUDA -> CUDA : %s\n", enum_to_string(s->cuda_to_cuda_async)); FPRINTF(f, "\tCUDA -> CPU : %s\n", enum_to_string(s->cuda_to_cpu_async)); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL FPRINTF(f, "\tCPU -> OpenCl : %s\n", enum_to_string(s->cpu_to_opencl_async)); FPRINTF(f, "\tOpenCl -> CPU : %s\n", enum_to_string(s->opencl_to_cpu_async)); #endif /* !STARPU_USE_OPENCL */ FPRINTF(f, "Synchronous :\n"); #ifdef STARPU_USE_CUDA FPRINTF(f, "\tCPU -> CUDA ; %s\n", enum_to_string(s->cpu_to_cuda)); FPRINTF(f, "\tCUDA -> CUDA : %s\n", enum_to_string(s->cuda_to_cuda)); FPRINTF(f, "\tCUDA -> CPU : %s\n", enum_to_string(s->cuda_to_cpu)); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL FPRINTF(f, "\tCPU -> OpenCl : %s\n", enum_to_string(s->cpu_to_opencl)); FPRINTF(f, "\tOpenCl -> CPU : %s\n", enum_to_string(s->opencl_to_cpu)); #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_CPU FPRINTF(f, "CPU -> CPU : %s\n", enum_to_string(s->cpu_to_cpu)); FPRINTF(f, "handle_to_pointer() : %s\n", enum_to_string(s->handle_to_pointer)); #endif /* !STARPU_USE_CPU */ FPRINTF(f, "compare() : %s\n", enum_to_string(s->compare)); } int data_interface_test_summary_success(data_interface_test_summary *s) { return s->success; } enum operation { CPU_TO_CPU #ifdef STARPU_USE_CUDA , CPU_TO_CUDA, CUDA_TO_CUDA, CUDA_TO_CPU #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL , CPU_TO_OPENCL, OPENCL_TO_CPU #endif /* !STARPU_USE_OPENCL */ }; static int* get_field(struct data_interface_test_summary *s, int async, enum operation op) { switch (op) { #ifdef STARPU_USE_CPU case CPU_TO_CPU: return &s->cpu_to_cpu; #endif #ifdef STARPU_USE_CUDA case CPU_TO_CUDA: return async?&s->cpu_to_cuda_async:&s->cpu_to_cuda; case CUDA_TO_CUDA: return async?&s->cuda_to_cuda_async:&s->cuda_to_cuda; case CUDA_TO_CPU: return async?&s->cuda_to_cpu_async:&s->cuda_to_cpu; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL case CPU_TO_OPENCL: return async?&s->cpu_to_opencl_async:&s->cpu_to_opencl; case OPENCL_TO_CPU: return async?&s->opencl_to_cpu_async:&s->opencl_to_cpu; #endif /* !STARPU_USE_OPENCL */ default: STARPU_ABORT(); } /* that instruction should never be reached */ return NULL; } static void set_field(struct data_interface_test_summary *s, int async, enum operation op, int ret) { int *field = get_field(s, async, op); switch (ret) { case SUCCESS: *field = SUCCESS; break; case FAILURE: *field = FAILURE; s->success = FAILURE; break; case UNTESTED: *field = UNTESTED; break; case TASK_CREATION_FAILURE: *field = TASK_CREATION_FAILURE; break; case TASK_SUBMISSION_FAILURE: *field = TASK_SUBMISSION_FAILURE; break; default: STARPU_ABORT(); } } static struct data_interface_test_summary summary = { #ifdef STARPU_USE_CPU .cpu_to_cpu = UNTESTED, .compare = UNTESTED, #endif #ifdef STARPU_USE_CUDA .cpu_to_cuda = UNTESTED, .cuda_to_cuda = UNTESTED, .cuda_to_cpu = UNTESTED, .cpu_to_cuda_async = UNTESTED, .cuda_to_cpu_async = UNTESTED, .cuda_to_cuda_async = UNTESTED, #endif #ifdef STARPU_USE_OPENCL .cpu_to_opencl = UNTESTED, .opencl_to_cpu = UNTESTED, .cpu_to_opencl_async = UNTESTED, .opencl_to_cpu_async = UNTESTED, #endif #ifdef STARPU_USE_CPU .handle_to_pointer = UNTESTED, #endif .success = SUCCESS }; /* * This variable has to be either -1 or 1. * The kernels should check that the ith value stored in the data interface is * equal to i, if factor == 1, or -i, if factor == -1. */ static int factor = -1; /* * Creates a complete task, only knowing on what device it should be executed. * Note that the global variable is heavily used here. * Arguments : * - taskp : a pointer to a valid task * - type : STARPU_{CPU,CUDA,OPENCL}_WORKER. * - id : -1 if you dont care about the device where the task will be * executed, as long as it has the right type. * >= 0 if you want to make sure the task will be executed on the * idth device that has the specified type. * Return values : * -ENODEV * 0 : success. */ static int create_task(struct starpu_task **taskp, enum starpu_worker_archtype type, int id) { static int cpu_workers[STARPU_MAXCPUS]; #ifdef STARPU_USE_CUDA static int cuda_workers[STARPU_MAXCUDADEVS]; #endif #ifdef STARPU_USE_OPENCL static int opencl_workers[STARPU_MAXOPENCLDEVS]; #endif static int n_cpus = -1; #ifdef STARPU_USE_CUDA static int n_cudas = -1; #endif #ifdef STARPU_USE_OPENCL static int n_opencls = -1; #endif if (n_cpus == -1) /* First time here */ { /* We do not check the return values of the calls to * starpu_worker_get_ids_by_type now, because it is simpler to * detect a problem in the switch that comes right after this * block of code. */ n_cpus = starpu_worker_get_ids_by_type(STARPU_CPU_WORKER, cpu_workers, STARPU_MAXCPUS); #ifdef STARPU_USE_CUDA n_cudas = starpu_worker_get_ids_by_type(STARPU_CUDA_WORKER, cuda_workers, STARPU_MAXCUDADEVS); #endif #ifdef STARPU_USE_OPENCL n_opencls = starpu_worker_get_ids_by_type(STARPU_OPENCL_WORKER, opencl_workers, STARPU_MAXOPENCLDEVS); #endif } int workerid=0; static struct starpu_codelet cl; cl.nbuffers = 1; cl.modes[0] = STARPU_RW; switch (type) { case STARPU_CPU_WORKER: if (id != -1) { if (id >= n_cpus) { FPRINTF(stderr, "Not enough CPU workers\n"); return -ENODEV; } workerid = *(cpu_workers + id); } cl.where = STARPU_CPU; cl.cpu_funcs[0] = current_config->cpu_func; break; #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: if (id != -1) { if (id >= n_cudas) { FPRINTF(stderr, "Not enough CUDA workers\n"); return -ENODEV; } workerid = cuda_workers[id]; } cl.where = STARPU_CUDA; cl.cuda_funcs[0] = current_config->cuda_func; break; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: if (id != -1) { if (id >= n_opencls) { FPRINTF(stderr, "Not enough OpenCL workers\n"); return -ENODEV; } workerid = *(opencl_workers + id); } cl.where = STARPU_OPENCL; cl.opencl_funcs[0] = current_config->opencl_func; break; #endif /* ! STARPU_USE_OPENCL */ default: return -ENODEV; } struct starpu_task *task = starpu_task_create(); task->synchronous = 1; task->cl = &cl; task->handles[0] = *current_config->handle; task->destroy = 0; if (id != -1) { task->execute_on_a_specific_worker = 1; task->workerid = workerid; } factor = -factor; task->cl_arg = &factor; task->cl_arg_size = sizeof(&factor); *taskp = task; return 0; } /* * _to_ functions. * They all create and submit a task that has to be executed on , * forcing a copy between and . * XXX : could we sometimes use starp_insert_task() ? It seems hars because we * need to set the execute_on_a_specific_worker field... */ #ifdef STARPU_USE_CUDA static enum exit_code ram_to_cuda(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CUDA_WORKER, 0); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #ifdef HAVE_CUDA_MEMCPY_PEER static enum exit_code cuda_to_cuda(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CUDA_WORKER, 1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #endif static enum exit_code cuda_to_ram(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static enum exit_code ram_to_opencl(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_OPENCL_WORKER, 0); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } static enum exit_code opencl_to_ram(void) { int err; struct starpu_task *task; err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) return TASK_CREATION_FAILURE; err = starpu_task_submit(task); if (err != 0) return TASK_SUBMISSION_FAILURE; FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); return current_config->copy_failed; } #endif /* !STARPU_USE_OPENCL */ /* End of the _to_ functions. */ #ifdef STARPU_USE_CUDA static void run_cuda(int async) { /* RAM -> CUDA (-> CUDA) -> RAM */ int err; err = ram_to_cuda(); set_field(&summary, async, CPU_TO_CUDA, err); /* If this failed, there is no point in continuing. */ if (err != SUCCESS) return; #ifdef HAVE_CUDA_MEMCPY_PEER if (starpu_cuda_worker_get_count() >= 2) { err = cuda_to_cuda(); set_field(&summary, async, CUDA_TO_CUDA, err); /* Even if cuda_to_cuda() failed, a valid copy is left on the first * cuda device, which means we can safely test cuda_to_ram() */ } else { summary.cuda_to_cuda_async = UNTESTED; } #else summary.cuda_to_cuda_async = UNTESTED; #endif /* !HAVE_CUDA_MEMCPY_PEER */ #ifdef STARPU_USE_CPU err = cuda_to_ram(); set_field(&summary, async, CUDA_TO_CPU, err); #endif /* !STARPU_USE_CPU */ } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static void run_opencl(int async) { /* RAM -> OpenCL -> RAM */ int err; err = ram_to_opencl(); set_field(&summary, async, CPU_TO_OPENCL, err); if (err != SUCCESS) return; #ifdef STARPU_USE_CPU err = opencl_to_ram(); set_field(&summary, async, OPENCL_TO_CPU, err); #endif /*!STARPU_USE_CPU */ } #endif /* !STARPU_USE_OPENCL */ #ifdef STARPU_USE_CPU /* Valid data should be in RAM before calling this function */ static void ram_to_ram(void) { int err; struct starpu_task *task; starpu_data_handle_t src, dst; void *src_interface, *dst_interface; src = *current_config->handle; dst = *current_config->dummy_handle; /* We do not care about the nodes */ src_interface = starpu_data_get_interface_on_node(src, 0); dst_interface = starpu_data_get_interface_on_node(dst, 0); if (src->ops->copy_methods->ram_to_ram) src->ops->copy_methods->ram_to_ram(src_interface, 0, dst_interface, 0); else src->ops->copy_methods->any_to_any(src_interface, 0, dst_interface, 0, NULL); err = create_task(&task, STARPU_CPU_WORKER, -1); if (err != 0) goto out; task->handles[0] = dst; err = starpu_task_submit(task); starpu_task_destroy(task); if (err != 0) { err = TASK_SUBMISSION_FAILURE; goto out; } FPRINTF(stderr, "[%s] : %d\n", __starpu_func__, current_config->copy_failed); err = current_config->copy_failed; out: set_field(&summary, 0, CPU_TO_CPU, err); } #endif /* !STARPU_USE_CPU */ static void run_async(void) { int async = starpu_asynchronous_copy_disabled(); if (async == 1) { FPRINTF(stderr, "Asynchronous copies have been disabled\n"); return; } #ifdef STARPU_USE_CUDA run_cuda(1); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL run_opencl(1); #endif /* !STARPU_USE_OPENCL */ } static void run_sync(void) { starpu_data_handle_t handle = *current_config->handle; struct starpu_data_copy_methods new_copy_methods; struct starpu_data_copy_methods *old_copy_methods; old_copy_methods = (struct starpu_data_copy_methods *) handle->ops->copy_methods; memcpy(&new_copy_methods, old_copy_methods, sizeof(struct starpu_data_copy_methods)); #ifdef STARPU_USE_CUDA new_copy_methods.ram_to_cuda_async = NULL; new_copy_methods.cuda_to_cuda_async = NULL; new_copy_methods.cuda_to_ram_async = NULL; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL new_copy_methods.ram_to_opencl_async = NULL; new_copy_methods.opencl_to_ram_async = NULL; #endif /* !STARPU_USE_OPENCL */ handle->ops->copy_methods = &new_copy_methods; #ifdef STARPU_USE_CUDA run_cuda(0); #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL run_opencl(0); #endif /* !STARPU_USE_OPENCL */ handle->ops->copy_methods = old_copy_methods; } static void compare(void) { int err; void *interface_a, *interface_b; starpu_data_handle_t handle, dummy_handle; handle = *current_config->handle; dummy_handle = *current_config->dummy_handle; interface_a = starpu_data_get_interface_on_node(handle, 0); interface_b = starpu_data_get_interface_on_node(dummy_handle, 0); err = handle->ops->compare(interface_a, interface_b); if (err == 0) { summary.compare = FAILURE; summary.success = FAILURE; } else { summary.compare = SUCCESS; } } #ifdef STARPU_USE_CPU static void handle_to_pointer(void) { void *ptr; unsigned int node; unsigned int tests = 0; starpu_data_handle_t handle; handle = *current_config->handle; if (!handle->ops->handle_to_pointer) return; for (node = 0; node < STARPU_MAXNODES; node++) { if (starpu_node_get_kind(node) != STARPU_CPU_RAM) continue; ptr = handle->ops->handle_to_pointer(handle, node); if (starpu_data_lookup(ptr) != handle) { summary.handle_to_pointer = FAILURE; return; } tests++; } if (tests > 0) summary.handle_to_pointer = SUCCESS; } #endif /* !STARPU_USE_CPU */ static int load_conf(struct test_config *config) { if (!config || #ifdef STARPU_USE_CPU !config->cpu_func || !config->dummy_handle || #endif #ifdef STARPU_USE_CUDA !config->cuda_func || #endif #ifdef STARPU_USE_OPENCL !config->opencl_func || #endif !config->handle) { return 1; } current_config = config; return 0; } data_interface_test_summary* run_tests(struct test_config *conf) { if (load_conf(conf) == 1) { FPRINTF(stderr, "Failed to load conf.\n"); return NULL; } run_async(); run_sync(); #ifdef STARPU_USE_CPU ram_to_ram(); compare(); handle_to_pointer(); #endif return &summary; } starpu-1.1.5/tests/datawizard/interfaces/multiformat/0002755000373600000000000000000012571541162020016 500000000000000starpu-1.1.5/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl0000644000373600000000000000170512571536547030324 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.1.5/tests/datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl0000644000373600000000000000205112571536547025530 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.1.5/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets.c0000644000373600000000000000413212571536547026605 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "multiformat_types.h" #include "../../../helper.h" #ifdef STARPU_USE_CUDA void cuda_to_cpu(void *buffers[], void *arg) { STARPU_SKIP_IF_VALGRIND; FPRINTF(stderr, "Entering %s\n", __starpu_func__); struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } extern void cpu_to_cuda_cuda_func(void *buffers[], void *args); struct starpu_codelet cpu_to_cuda_cl = { .cuda_funcs = {cpu_to_cuda_cuda_func}, .nbuffers = 1 }; struct starpu_codelet cuda_to_cpu_cl = { .cpu_funcs = {cuda_to_cpu}, .nbuffers = 1 }; #endif #ifdef STARPU_USE_OPENCL void opencl_to_cpu(void *buffers[], void *arg) { STARPU_SKIP_IF_VALGRIND; struct struct_of_arrays *src = STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); struct point *dst = STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); int i; for (i = 0; i < n; i++) { dst[i].x = src->x[i]; dst[i].y = src->y[i]; } } extern void cpu_to_opencl_opencl_func(void *buffers[], void *args); struct starpu_codelet cpu_to_opencl_cl = { .opencl_funcs = {cpu_to_opencl_opencl_func}, .nbuffers = 1 }; struct starpu_codelet opencl_to_cpu_cl = { .cpu_funcs = {opencl_to_cpu}, .nbuffers = 1 }; #endif starpu-1.1.5/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c0000644000373600000000000000600712571536547030150 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * Copyright (C) 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../../../helper.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl" static struct starpu_opencl_program opencl_conversion_program; void cpu_to_opencl_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; (void) args; int id, devid, ret; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; unsigned n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); cl_mem src = (cl_mem) STARPU_MULTIFORMAT_GET_CPU_PTR(buffers[0]); cl_mem dst = (cl_mem) STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &opencl_conversion_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); err = starpu_opencl_load_kernel(&kernel, &queue, &opencl_conversion_program, "cpu_to_opencl_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 0, sizeof(src), &src); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(dst), &dst); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(n), &n); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&opencl_conversion_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/multiformat/advanced/0002755000373600000000000000000012571541162021563 500000000000000starpu-1.1.5/tests/datawizard/interfaces/multiformat/advanced/multiformat_data_release.c0000644000373600000000000000705512571536547026723 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 INRIA * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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, 0, vector, NX, &ops); } static void unregister_handle(void) { starpu_data_unregister(handle); } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) 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 .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 */ return 0; } int main(void) { #ifdef STARPU_USE_CPU int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 1; conf.nopencl = 1; memset(&global_stats, 0, sizeof(global_stats)); ret = starpu_init(&conf); 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.1.5/tests/datawizard/interfaces/multiformat/advanced/same_handle.c0000644000373600000000000000516412571536547024126 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" /* * A single handle can be given twice to a given kernel. In this case, it * should only be converted once. */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) 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 .nbuffers = 2, }; static void register_handle(void) { int i; for (i = 0; i < NX; i++) vector[i] = i; starpu_multiformat_data_register(&handle, 0, 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 task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; task->handles[1] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) return -ENODEV; return 0; } #endif int main(void) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) int err; err = starpu_init(NULL); 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 { /* We should not get here */ return EXIT_FAILURE; } enodev: #endif return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c0000644000373600000000000000670512571536547026567 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) 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) 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) 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, 0, 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.1.5/tests/datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c0000644000373600000000000001350012571536547030002 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 INRIA * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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) static void create_and_submit_tasks(int where, starpu_data_handle_t handles[]) { FPRINTF(stderr, "***** Starting Task 1\n"); struct starpu_codelet cl = { .modes = { STARPU_RW }, .nbuffers = 1, .where = where }; #ifdef STARPU_USE_CUDA if (where & STARPU_CUDA) cl.cuda_funcs[0] = cuda_func; #endif #ifdef STARPU_USE_OPENCL if (where & STARPU_OPENCL) cl.opencl_funcs[0] = opencl_func; #endif struct starpu_task *task = starpu_task_create(); task->synchronous = SYNCHRONOUS; task->cl = &cl; task->handles[0] = handles[0]; assert(starpu_task_submit(task) == 0); #ifdef STARPU_USE_CPU FPRINTF(stderr, "***** Starting Task 2\n"); struct starpu_codelet cl2 = { .modes = { STARPU_RW }, .cpu_funcs = {cpu_func}, .nbuffers = 1, .where = STARPU_CPU, }; struct starpu_task *task2 = starpu_task_create(); task2->synchronous = SYNCHRONOUS; task2->cl = &cl2; task2->handles[0] = handles[1]; assert(starpu_task_submit(task2) == 0); #endif /* !STARPU_USE_CPU */ FPRINTF(stderr, "***** Starting Task 3\n"); struct starpu_codelet cl3 = { .modes = { STARPU_RW, STARPU_RW }, .nbuffers = 2, .where = where }; #ifdef STARPU_USE_CUDA if (where & STARPU_CUDA) cl3.cuda_funcs[0] = cuda_func; #endif #ifdef STARPU_USE_OPENCL if (where & STARPU_OPENCL) cl3.opencl_funcs[0] = opencl_func; #endif struct starpu_task *task3 = starpu_task_create(); task3->synchronous = SYNCHRONOUS; task3->cl = &cl3; task3->handles[0] = handles[0]; task3->handles[1] = handles[1]; assert(starpu_task_submit(task3) == 0); assert(starpu_task_wait_for_all() == 0); FPRINTF(stderr, "***** End of all tasks\n"); return; } #endif /* XXX Just a little bit of copy/pasta here... */ #ifdef STARPU_USE_CUDA static int test_cuda(void) { int i; int vector1[NX]; int vector2[NX]; starpu_data_handle_t handles[2]; for (i = 0; i < NX; i++) { vector1[i] = i; vector2[i] = i; } starpu_multiformat_data_register(&handles[0], 0, vector1, NX, &ops); starpu_multiformat_data_register(&handles[1], 0, 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 */ 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], 0, vector1, NX, &ops); starpu_multiformat_data_register(&handles[1], 0, 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 */ 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 */ int main(void) { #ifdef STARPU_USE_CPU int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; ret = starpu_init(&conf); 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(); #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 starpu_shutdown(); if (ncuda == 0 && nopencl == 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.1.5/tests/datawizard/interfaces/multiformat/advanced/generic.c0000644000373600000000000000754412571536547023306 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "generic.h" #include "../../../../helper.h" struct stats global_stats; #ifdef STARPU_USE_CPU void cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cpu++; } #endif /* !STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA void cuda_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cuda++; } void cpu_to_cuda_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_cuda++; } void cuda_to_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cuda_to_cpu++; } struct starpu_codelet cpu_to_cuda_cl = { .cuda_funcs = {cpu_to_cuda_func}, .nbuffers = 1 }; struct starpu_codelet cuda_to_cpu_cl = { .cpu_funcs = {cuda_to_cpu_func}, .nbuffers = 1 }; #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL void opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.opencl++; } void cpu_to_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.cpu_to_opencl++; } void opencl_to_cpu_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; global_stats.opencl_to_cpu++; } struct starpu_codelet cpu_to_opencl_cl = { .opencl_funcs = {cpu_to_opencl_func}, .nbuffers = 1 }; struct starpu_codelet opencl_to_cpu_cl = { .cpu_funcs = {opencl_to_cpu_func}, .nbuffers = 1 }; #endif /* !STARPU_USE_OPENCL */ 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 .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 */ } 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 */ } 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 */ 1 /* Just so the build does not fail if we disable EVERYTHING */ ) return 0; else return 1; } starpu-1.1.5/tests/datawizard/interfaces/multiformat/advanced/multiformat_worker.c0000644000373600000000000000606512571536547025623 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "generic.h" #include "../../../../helper.h" #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) 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 #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) 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 .nbuffers = 1, }; static void register_handle(void) { int i; for (i = 0; i < NX; i++) vector[i] = i; starpu_multiformat_data_register(&handle, 0, 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 { return -ENODEV; } return starpu_task_submit(task); } #endif int main(void) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) int err; err = starpu_init(NULL); 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 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 */ /* We should not get here */ return EXIT_FAILURE; enodev: #endif return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/datawizard/interfaces/multiformat/advanced/generic.h0000644000373600000000000000310312571536547023276 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 #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 */ 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 }; void print_stats(struct stats *); void reset_stats(struct stats *); int compare_stats(struct stats *, struct stats *); #endif /* !MULTIFORMAT_GENERIC_H */ starpu-1.1.5/tests/datawizard/interfaces/multiformat/multiformat_opencl.c0000644000373600000000000000702412571536547024021 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../test_interfaces.h" #define KERNEL_LOCATION "tests/datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl" extern struct test_config multiformat_config; static struct starpu_opencl_program multiformat_program; void test_multiformat_opencl_func(void *buffers[], void *args) { STARPU_SKIP_IF_VALGRIND; int id, devid, factor, ret; unsigned int n; cl_int err; cl_kernel kernel; cl_command_queue queue; cl_event event; cl_context context; cl_mem val, fail; ret = starpu_opencl_load_opencl_from_file(KERNEL_LOCATION, &multiformat_program, NULL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_load_opencl_from_file"); factor = *(int *)args; n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); val = (cl_mem)STARPU_MULTIFORMAT_GET_OPENCL_PTR(buffers[0]); id = starpu_worker_get_id(); devid = starpu_worker_get_devid(id); starpu_opencl_get_context(devid, &context); err = starpu_opencl_load_kernel(&kernel, &queue, &multiformat_program, "multiformat_opencl", devid); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); fail = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, sizeof(int), &multiformat_config.copy_failed, &err); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); /* Setting args */ err = clSetKernelArg(kernel, 0, sizeof(val), &val); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 1, sizeof(n), &n); if (err) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 2, sizeof(fail), &fail); if (err) STARPU_OPENCL_REPORT_ERROR(err); err = clSetKernelArg(kernel, 3, sizeof(factor), &factor); if (err) STARPU_OPENCL_REPORT_ERROR(err); { size_t global=n; size_t local; size_t s; cl_device_id device; starpu_opencl_get_device(devid, &device); err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, &s); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); if (local > global) local = global; err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0, NULL, &event); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); } err = clEnqueueReadBuffer(queue, fail, CL_TRUE, 0, sizeof(int), &multiformat_config.copy_failed, 0, NULL, NULL); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); starpu_opencl_collect_stats(event); clReleaseEvent(event); starpu_opencl_release_kernel(kernel); ret = starpu_opencl_unload_opencl(&multiformat_program); STARPU_CHECK_RETURN_VALUE(ret, "starpu_opencl_unload_opencl"); } starpu-1.1.5/tests/datawizard/interfaces/multiformat/multiformat_interface.c0000644000373600000000000001014112571536547024473 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "multiformat_types.h" #include "../test_interfaces.h" #include "../../../helper.h" static void test_multiformat_cpu_func(void *buffers[], void *args); #ifdef STARPU_USE_CUDA extern void test_multiformat_cuda_func(void *buffers[], void *args); #endif #ifdef STARPU_USE_OPENCL extern void test_multiformat_opencl_func(void *buffers[], void *args); #endif 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 .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"); } #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 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), }; 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, 0, &array_of_structs, N_ELEMENTS, &format_ops); starpu_multiformat_data_register(&multiformat_dummy_handle, 0, &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(void) { #ifdef STARPU_USE_CPU int ret; data_interface_test_summary *summary; struct starpu_conf conf; starpu_conf_init(&conf); conf.ncuda = 2; conf.nopencl = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); register_data(); summary = run_tests(&multiformat_config); if (!summary) exit(EXIT_FAILURE); data_interface_test_summary_print(stderr, summary); unregister_data(); starpu_shutdown(); return data_interface_test_summary_success(summary); #else /* Without the CPU, there is no point in using the multiformat * interface, so this test is pointless. */ return STARPU_TEST_SKIPPED; #endif } starpu-1.1.5/tests/datawizard/interfaces/multiformat/multiformat_cuda.cu0000644000373600000000000000427312571536547023645 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "multiformat_types.h" #include "../test_interfaces.h" #include "../../../helper.h" extern struct test_config multiformat_config; static __global__ void multiformat_cuda(struct struct_of_arrays *soa, unsigned n, int *err, int factor) { unsigned i = blockIdx.x*blockDim.x + threadIdx.x; if (i >= n) return; if (soa->x[i] != i * factor || soa->y[i] != i * factor) { *err = 1; } else { soa->x[i] = -soa->x[i]; soa->y[i] = -soa->y[i]; } } extern "C" void test_multiformat_cuda_func(void *buffers[], void *args) { FPRINTF(stderr, "Entering %s\n", __starpu_func__); int factor; int *ret; cudaError_t error; unsigned int n = STARPU_MULTIFORMAT_GET_NX(buffers[0]); struct struct_of_arrays *soa; soa = (struct struct_of_arrays *) STARPU_MULTIFORMAT_GET_CUDA_PTR(buffers[0]); unsigned threads_per_block = 64; unsigned nblocks = (n + threads_per_block-1) / threads_per_block; factor = *(int *) args; error = cudaMalloc(&ret, sizeof(int)); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); error = cudaMemcpy(ret, &multiformat_config.copy_failed, sizeof(int), cudaMemcpyHostToDevice); if (error != cudaSuccess) STARPU_CUDA_REPORT_ERROR(error); multiformat_cuda<<>>(soa, n, ret, factor); error = cudaMemcpy(&multiformat_config.copy_failed, ret, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(ret); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/multiformat/multiformat_types.h0000644000373600000000000000156712571536547023720 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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.1.5/tests/datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu0000644000373600000000000000315112571536547027766 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/interfaces/copy_interfaces.c0000644000373600000000000000522012571536547020724 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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, 0); new_interface = starpu_data_get_interface_on_node(new_handle, 0); 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_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); { int x=42; starpu_variable_data_register(&handle, 0, (uintptr_t)&x, sizeof(x)); ret = check_copy(handle, "variable"); } if (ret == 0) { int xx[] = {12, 23, 45}; starpu_vector_data_register(&handle, 0, (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, 0, (uintptr_t)matrix, NX, NX, NY, sizeof(matrix[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, 0, (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[20]; uint32_t colind[1]; uint32_t rowptr[2]; starpu_csr_data_register(&handle, 0, nnz, nrow, (uintptr_t)nzvalA, colind, rowptr, 0, sizeof(float)); ret = check_copy(handle, "csr"); } starpu_shutdown(); return ret; } starpu-1.1.5/tests/datawizard/data_implicit_deps.c0000644000373600000000000001073712571536550017245 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #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; static void f(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *_args STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; usleep(200000); } static struct starpu_codelet cl_f = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {f}, .cuda_funcs = {f}, .opencl_funcs = {f}, .nbuffers = 2 }; static void g(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; usleep(100000); var = 42; } static struct starpu_codelet cl_g = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {g}, .cuda_funcs = {g}, .opencl_funcs = {g}, .nbuffers = 2 }; static void h(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; FPRINTF(stderr, "VAR %u (should be 42)\n", var); STARPU_ASSERT(var == 42); } static struct starpu_codelet cl_h = { .modes = { STARPU_R, STARPU_RW }, .cpu_funcs = {h}, .cuda_funcs = {h}, .opencl_funcs = {h}, .nbuffers = 2 }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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, 0, (uintptr_t)A, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&B_handle, 0, (uintptr_t)B, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&C_handle, 0, (uintptr_t)C, VECTORSIZE, sizeof(unsigned)); starpu_vector_data_register(&D_handle, 0, (uintptr_t)D, VECTORSIZE, sizeof(unsigned)); #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] = 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"); struct starpu_task *task_g = starpu_task_create(); task_g->cl = &cl_g; task_g->handles[0] = B_handle; task_g->handles[1] = 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] = C_handle; task_h->handles[1] = 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); 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); 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.1.5/tests/datawizard/reclaim.c0000644000373600000000000001003612571536547015041 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 test stress the memory allocation system and should force StarPU to * reclaim memory from time to time. */ #include #include #include #ifdef STARPU_HAVE_HWLOC #include #endif #include "../helper.h" #ifdef STARPU_QUICK_CHECK # define BLOCK_SIZE (64*1024) static unsigned ntasks = 250; #else # define BLOCK_SIZE (64*1024*1024) static unsigned ntasks = 1000; #endif #ifdef STARPU_HAVE_HWLOC static uint64_t get_total_memory_size(void) { uint64_t size; hwloc_topology_t hwtopology; hwloc_topology_init(&hwtopology); hwloc_topology_load(hwtopology); hwloc_obj_t root = hwloc_get_root_obj(hwtopology); size = root->memory.total_memory; hwloc_topology_destroy(hwtopology); return size; } #endif static void dummy_func(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet dummy_cl = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .nbuffers = 3, .modes = {STARPU_RW, STARPU_R, STARPU_R} }; /* Number of chunks */ static int mb = 16; int main(int argc, char **argv) { int i, ret; int taskid; #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 /* 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 %d buffers and create %u tasks\n", mb, ntasks); ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); float **host_ptr_array; starpu_data_handle_t *handle_array; host_ptr_array = (float **) calloc(mb, sizeof(float *)); handle_array = (starpu_data_handle_t *) calloc(mb, sizeof(starpu_data_handle_t)); /* Register mb buffers of 1MB */ for (i = 0; i < mb; i++) { host_ptr_array[i] = (float *) malloc(BLOCK_SIZE); if (host_ptr_array[i] == NULL) { mb = i; FPRINTF(stderr, "Cannot allocate more than %d buffers\n", mb); break; } starpu_variable_data_register(&handle_array[i], 0, (uintptr_t)host_ptr_array[i], BLOCK_SIZE); STARPU_ASSERT(handle_array[i]); } 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]; 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"); for (i = 0; i < mb; i++) { starpu_data_unregister(handle_array[i]); free(host_ptr_array[i]); } 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; } starpu-1.1.5/tests/datawizard/acquire_release_cuda.cu0000644000373600000000000000205012571536546017733 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 _increment_cuda_codelet(unsigned *val) { val[0]++; } extern "C" void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *cl_arg) { unsigned *val = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); _increment_cuda_codelet<<<1,1, 0, starpu_cuda_get_local_stream()>>>(val); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/increment_init.c0000644000373600000000000001245312571536546016440 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void neutral_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void neutral_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } #endif static void neutral_cpu_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet neutral_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {neutral_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, #endif .cpu_funcs = {neutral_cpu_kernel}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { unsigned *pvar; 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(); STARPU_RETURN(EXIT_FAILURE); } starpu-1.1.5/tests/datawizard/unpartition.c0000644000373600000000000000705112571536550015776 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #ifdef STARPU_QUICK_CHECK #define NITER 100 #else #define NITER 1000 #endif #define VECTORSIZE 1024 float *buffer; starpu_data_handle_t v_handle; static void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .nbuffers = 1 }; 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_init(NULL); 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, 0, (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, 0); 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.1.5/tests/datawizard/scal_cuda.cu0000644000373600000000000000254312571536546015533 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2010-2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include 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); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/acquire_release.c0000644000373600000000000000750512571536547016565 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 static unsigned ntasks = 10; #else static unsigned ntasks = 10000; #endif #ifdef STARPU_USE_CUDA extern void increment_cuda(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args); #endif #ifdef STARPU_USE_OPENCL extern void increment_opencl(void *buffers[], void *args); #endif void increment_cpu(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); (*tokenptr)++; } static struct starpu_codelet increment_cl = { .modes = { STARPU_RW }, .cpu_funcs = {increment_cpu}, #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl}, #endif .nbuffers = 1 }; unsigned token = 0; starpu_data_handle_t token_handle; 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; } void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { 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_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/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, 0, (uintptr_t)&token, sizeof(unsigned)); FPRINTF(stderr, "Token: %u\n", token); for(i=0; i #include "../helper.h" static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void redux_cuda_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned host_dst, host_src; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_src, src, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&host_dst, dst, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_dst += host_src; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } static void neutral_cuda_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void redux_opencl_kernel(void *descr[], void *arg) { unsigned h_dst, h_src; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem d_src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); /* This is a dummy technique of course */ clEnqueueReadBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clEnqueueReadBuffer(queue, d_src, CL_TRUE, 0, sizeof(unsigned), (void *)&h_src, 0, NULL, NULL); h_dst += h_src; clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } static void neutral_opencl_kernel(void *descr[], void *arg) { unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } #endif static void redux_cpu_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); *dst = *dst + *src; } static void neutral_cpu_kernel(void *descr[], void *arg) { unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet redux_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_kernel}, #endif .cpu_funcs = {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}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, #endif .cpu_funcs = {neutral_cpu_kernel}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void increment_cpu_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .nbuffers = 1, .modes = {STARPU_REDUX} }; int main(int argc, char **argv) { int ret; unsigned *var; ret = starpu_init(NULL); 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.1.5/tests/datawizard/wt_broadcast.c0000644000373600000000000000730712571536547016110 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" static unsigned var = 0; static starpu_data_handle_t handle; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void increment_cpu_kernel(void *descr[], void *arg) { unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .nbuffers = 1, .modes = {STARPU_RW} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (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.1.5/tests/datawizard/increment_redux_v2.c0000644000373600000000000001675312571536546017242 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" static unsigned var = 0; static starpu_data_handle_t handle; /* * Reduction methods */ #ifdef STARPU_USE_CUDA static void redux_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); unsigned host_dst, host_src; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_src, src, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaMemcpyAsync(&host_dst, dst, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_dst += host_src; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } static void neutral_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); /* This is a dummy technique of course */ unsigned host_dst = 0; cudaMemcpyAsync(dst, &host_dst, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif #ifdef STARPU_USE_OPENCL static void redux_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst, h_src; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_mem d_src = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[1]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); /* This is a dummy technique of course */ clEnqueueReadBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clEnqueueReadBuffer(queue, d_src, CL_TRUE, 0, sizeof(unsigned), (void *)&h_src, 0, NULL, NULL); h_dst += h_src; clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } static void neutral_opencl_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned h_dst = 0; cl_mem d_dst = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueWriteBuffer(queue, d_dst, CL_TRUE, 0, sizeof(unsigned), (void *)&h_dst, 0, NULL, NULL); clFinish(queue); } #endif static void redux_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned *src = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[1]); *dst = *dst + *src; } static void neutral_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *dst = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *dst = 0; } static struct starpu_codelet redux_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {redux_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {redux_opencl_kernel}, #endif .cpu_funcs = {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}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {neutral_opencl_kernel}, #endif .cpu_funcs = {neutral_cpu_kernel}, .modes = {STARPU_W}, .nbuffers = 1 }; /* * Increment codelet */ #ifdef STARPU_USE_OPENCL /* dummy OpenCL implementation */ static void increment_opencl_kernel(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; cl_mem d_token = (cl_mem)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned h_token; cl_command_queue queue; starpu_opencl_get_current_queue(&queue); clEnqueueReadBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); h_token++; clEnqueueWriteBuffer(queue, d_token, CL_TRUE, 0, sizeof(unsigned), (void *)&h_token, 0, NULL, NULL); clFinish(queue); } #endif #ifdef STARPU_USE_CUDA static void increment_cuda_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); unsigned host_token; /* This is a dummy technique of course */ cudaMemcpyAsync(&host_token, tokenptr, sizeof(unsigned), cudaMemcpyDeviceToHost, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); host_token++; cudaMemcpyAsync(tokenptr, &host_token, sizeof(unsigned), cudaMemcpyHostToDevice, starpu_cuda_get_local_stream()); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } #endif static void increment_cpu_kernel(void *descr[], void *arg) { STARPU_SKIP_IF_VALGRIND; unsigned *tokenptr = (unsigned *)STARPU_VARIABLE_GET_PTR(descr[0]); *tokenptr = *tokenptr + 1; } static struct starpu_codelet increment_cl = { #ifdef STARPU_USE_CUDA .cuda_funcs = {increment_cuda_kernel}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {increment_opencl_kernel}, #endif .cpu_funcs = {increment_cpu_kernel}, .nbuffers = 1, .modes = {STARPU_RW} }; static struct starpu_codelet increment_cl_redux = { #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}, .nbuffers = 1, .modes = {STARPU_REDUX} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (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)) { _STARPU_DEBUG("%u != %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) { _STARPU_DEBUG("%u != %u\n", var, ntasks*nloops); 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.1.5/tests/datawizard/task_with_multiple_time_the_same_handle.c0000644000373600000000000000437012571536550023531 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2015 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" static void sum_cpu(void * descr[], void *cl_arg) { double * v_dst = (double *) STARPU_VARIABLE_GET_PTR(descr[0]); double * v_src = (double *) STARPU_VARIABLE_GET_PTR(descr[1]); *v_dst+=*v_src; } static void sum3_cpu(void * descr[], void *cl_arg) { double * v_src1 = (double *) STARPU_VARIABLE_GET_PTR(descr[1]); double * v_src2 = (double *) STARPU_VARIABLE_GET_PTR(descr[1]); double * v_dst = (double *) STARPU_VARIABLE_GET_PTR(descr[0]); *v_dst+=*v_src1+*v_src2; } static struct starpu_codelet sum_cl = { .cpu_funcs = {sum_cpu, NULL}, .nbuffers = 2, .modes={STARPU_RW,STARPU_R} }; static struct starpu_codelet sum3_cl = { .cpu_funcs = {sum3_cpu, NULL}, .nbuffers = 3, .modes={STARPU_R,STARPU_R,STARPU_RW} }; int main(int argc, char * argv[]) { starpu_data_handle_t handle; int ret = 0; double value=1.0; int i; ret=starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; if (starpu_worker_get_count_by_type(STARPU_CPU_WORKER) == 0) return STARPU_TEST_SKIPPED; starpu_variable_data_register(&handle,0,(uintptr_t)&value,sizeof(double)); for (i=0; i<2; i++) { starpu_insert_task(&sum_cl, STARPU_RW, handle, STARPU_R, handle, 0); starpu_insert_task(&sum3_cl, STARPU_R, handle, STARPU_R, handle, STARPU_RW, handle, 0); } 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; } starpu-1.1.5/tests/datawizard/sync_and_notify_data_kernels.cu0000644000373600000000000000270712571536550021514 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* * increment a (val[0]) */ extern "C" __global__ void _cuda_incA(unsigned *v) { v[0]++; } extern "C" void cuda_codelet_incA(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); _cuda_incA<<<1,1, 0, starpu_cuda_get_local_stream()>>>(v); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } /* * increment c (val[2]) */ extern "C" __global__ void _cuda_incC(unsigned *v) { v[2]++; } extern "C" void cuda_codelet_incC(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { unsigned *v = (unsigned *)STARPU_VECTOR_GET_PTR(descr[0]); _cuda_incC<<<1,1, 0, starpu_cuda_get_local_stream()>>>(v); cudaStreamSynchronize(starpu_cuda_get_local_stream()); } starpu-1.1.5/tests/datawizard/sync_with_data_with_mem_non_blocking.c0000644000373600000000000001024412571536550023033 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 #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]; static void dummy_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .modes = { STARPU_RW }, .cpu_funcs = {dummy_codelet}, #ifdef STARPU_USE_CUDA .cuda_funcs = {dummy_codelet}, #endif #ifdef STARPU_USE_OPENCL .opencl_funcs = {dummy_codelet}, #endif .nbuffers = 1 }; 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; void callback_sync_data(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); n_synced_buffers++; if (n_synced_buffers == nbuffers) STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } int main(int argc, char **argv) { int ret; #ifdef STARPU_QUICK_CHECK nbuffers /= 4; niter /= 4; vectorsize /= 8; #endif ret = starpu_init(NULL); 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], 0, (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.1.5/tests/loader.c0000644000373600000000000002012012571536546012533 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) #include #else #include #endif #define DEFAULT_TIMEOUT 1800 #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 static void launch_gdb(const char *exe) { #ifdef STARPU_GDB_PATH # define CORE_FILE "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_FILE, &st); if (err != 0) { fprintf(stderr, "while looking for core file of %s: %s: %m\n", exe, CORE_FILE); return; } if (!(st.st_mode & S_IFREG)) { fprintf(stderr, CORE_FILE ": not a regular file\n"); return; } 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_FILE, NULL); } else { /* Run gdb directly */ gdb = STARPU_GDB_PATH; err = execl(gdb, "gdb", "--batch", "-ex", GDB_COMMAND, "-ex", GDB_ALL_COMMAND, exe, CORE_FILE, 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; 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); } } # undef GDB_COMMAND # undef GDB_ALL_COMMAND # undef CORE_FILE #endif /* STARPU_GDB_PATH */ } static char *test_name; static void test_cleaner(int sig) { pid_t child_gid; // 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); launch_gdb(test_name); kill(-child_gid, SIGQUIT); exit(EXIT_FAILURE); } static void decode(char **src, char *motif, const char *value) { if (*src) { char *y = strstr(*src, motif); if (y && value == NULL) { fprintf(stderr, "error: $%s undefined\n", motif); exit(EXIT_FAILURE); } while (y) { char *neo = malloc(strlen(*src)-strlen(motif)+strlen(value)+1); char *to = neo; to = strncpy(to, *src, y - *src); to += y - *src; to = strcpy(to, value); to += strlen(value); strcpy(to, y+strlen(motif)); *src = neo; y = strstr(*src, motif); } } } int main(int argc, char *argv[]) { int child_exit_status; char *test_args; int status; char *launcher; char *launcher_args; struct sigaction sa; int ret; struct timeval start; struct timeval end; double timing; test_args = NULL; timeout = 0; test_name = argv[1]; if (!test_name) { fprintf(stderr, "[error] Need name of program to start\n"); exit(EXIT_FAILURE); } if (strstr(test_name, "spmv/dw_block_spmv")) { test_args = (char *) malloc(150*sizeof(char)); sprintf(test_args, "%s/examples/spmv/matrix_market/examples/fidapm05.mtx", STARPU_SRC_DIR); } if (strstr(test_name, "starpu_perfmodel_display")) { test_args = (char *) malloc(5*sizeof(char)); sprintf(test_args, "-l"); } if (strstr(test_name, "starpu_perfmodel_plot")) { test_args = (char *) malloc(5*sizeof(char)); sprintf(test_args, "-l"); } /* get launcher program */ launcher=getenv("STARPU_CHECK_LAUNCHER"); launcher_args=getenv("STARPU_CHECK_LAUNCHER_ARGS"); if (launcher_args) launcher_args=strdup(launcher_args); /* get user-defined iter_max value */ if (getenv("STARPU_TIMEOUT_ENV")) timeout = strtol(getenv("STARPU_TIMEOUT_ENV"), NULL, 10); if (timeout <= 0) timeout = DEFAULT_TIMEOUT; /* set SIGALARM handler */ sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = test_cleaner; if (-1 == sigaction(SIGALRM, &sa, NULL)) perror("sigaction"); child_pid = fork(); if (child_pid == 0) { // get a new pgid if (setpgid(0, 0) == -1) { perror("setpgid"); fprintf(stderr, "[error] setpgid. Mark test as failed\n"); exit(EXIT_FAILURE); } if (launcher) { /* "Launchers" such as Valgrind need to be inserted * after the Libtool-generated wrapper scripts, hence * this special-case. */ const char *top_builddir = getenv ("top_builddir"); const char *top_srcdir = getenv("top_srcdir"); if (top_builddir != NULL) { char *launcher_argv[100]; int i=3; char libtool[strlen(top_builddir) + sizeof("libtool") + 1]; strcpy(libtool, top_builddir); strcat(libtool, "/libtool"); decode(&launcher_args, "@top_srcdir@", top_srcdir); launcher_argv[0] = libtool; launcher_argv[1] = "--mode=execute"; launcher_argv[2] = launcher; launcher_argv[i] = strtok(launcher_args, " "); while (launcher_argv[i]) { i++; launcher_argv[i] = strtok(NULL, " "); } launcher_argv[i] = test_name; launcher_argv[i+1] = test_args; launcher_argv[i+2] = NULL; execvp(*launcher_argv, launcher_argv); } else { fprintf(stderr, "warning: $top_builddir undefined, " "so $STARPU_CHECK_LAUNCHER ignored\n"); execl(test_name, test_name, test_args, NULL); } } else execl(test_name, test_name, test_args, NULL); fprintf(stderr, "[error] '%s' failed to exec. test marked as failed\n", test_name); exit(EXIT_FAILURE); } if (child_pid == -1) { fprintf(stderr, "[error] fork. test marked as failed\n"); exit(EXIT_FAILURE); } ret = EXIT_SUCCESS; gettimeofday(&start, NULL); alarm(timeout); if (child_pid == waitpid(child_pid, &child_exit_status, 0)) { if (WIFEXITED(child_exit_status)) { 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.1.5/tests/sched_policies/0002755000373600000000000000000012571541162014153 500000000000000starpu-1.1.5/tests/sched_policies/simple_deps.c0000644000373600000000000000500212571536543016545 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * Task1 must be executed before task0, even if task0 is submitted first. * Applies to : all schedulers. */ static 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}, .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; policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { int ret; FPRINTF(stderr, "Running with policy %s.\n", (*policy)->policy_name); ret = run(*policy); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.1.5/tests/sched_policies/prio.c0000644000373600000000000000477412571536543015231 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Université Bordeaux 1 * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK #define NTASKS 10 #else #define NTASKS 1000 #endif /* * Task1 must be executed before task0, even if task0 is submitted first. * Applies to : all schedulers. */ static void A(void *buffers[], void *args) { (void) buffers; (void) args; FPRINTF(stdout,"A"); usleep(1000); } static 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}, .nbuffers = 0 }; struct starpu_codelet clB = { .cpu_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; policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { int ret; FPRINTF(stderr, "Running with policy %s.\n", (*policy)->policy_name); ret = run(*policy); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.1.5/tests/sched_policies/execute_all_tasks.c0000644000373600000000000000452712571536543017753 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" /* * All tasks submitted by StarPU should be executed once. * Applies to: all schedulers. */ #define NTASKS 8 static 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}, .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; policies = starpu_sched_get_predefined_policies(); for(policy=policies ; *policy!=NULL ; policy++) { FPRINTF(stderr, "Running with policy %s.\n", (*policy)->policy_name); int ret; ret = run(*policy); if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; } starpu-1.1.5/tests/sched_policies/simple_cpu_gpu_sched.c0000644000373600000000000001347412571536543020436 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" /* * 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 ? */ static void dummy(void *buffers[], void *args) { (void) buffers; (void) args; } /* * Fake cost functions. */ static double cpu_task_cpu(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1.0; } static double cpu_task_gpu(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1000.0; } static double gpu_task_cpu(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl) { (void) task; (void) arch; (void) nimpl; return 1000.0; } static double gpu_task_gpu(struct starpu_task *task, enum starpu_perfmodel_archtype 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(void) { int i; for (i = STARPU_CPU_DEFAULT; i < STARPU_CUDA_DEFAULT; i++) { model_cpu_task.per_arch[i][0].cost_function = cpu_task_cpu; model_gpu_task.per_arch[i][0].cost_function = gpu_task_cpu; } for (i = STARPU_CUDA_DEFAULT; i < STARPU_NARCH_VARIATIONS; i++) { model_cpu_task.per_arch[i][0].cost_function = cpu_task_gpu; model_gpu_task.per_arch[i][0].cost_function = gpu_task_gpu; } } /* * 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)) ret = 1; else 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); int i; int n_policies = sizeof(policies)/sizeof(policies[0]); for (i = 0; i < n_policies; ++i) { struct starpu_sched_policy *policy = policies[i]; FPRINTF(stdout, "Running with policy %s.\n", policy->policy_name); int ret; ret = run(policy); if (ret == 1) return EXIT_FAILURE; } return EXIT_SUCCESS; #endif } starpu-1.1.5/tests/sched_policies/data_locality.c0000644000373600000000000001224512571536543017061 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #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. */ static 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, 0, (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; for (i = 0; i < n_policies; ++i) { struct starpu_sched_policy *policy = policies[i]; FPRINTF(stdout, "Running with policy %s.\n", policy->policy_name); int ret = run(policy); if (ret == -ENODEV && global_ret == 0) global_ret = STARPU_TEST_SKIPPED; if (ret == 1 && global_ret == 0) global_ret = ret; } return global_ret; } starpu-1.1.5/tests/coverage/0002755000373600000000000000000012571541162012771 500000000000000starpu-1.1.5/tests/coverage/coverage.sh0000755000373600000000000000765312571536550015061 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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() { echo "block opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $exampledir/basic_examples/block check_success $? echo "variable opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $exampledir/basic_examples/variable 100 check_success $? echo "variable no worker" STARPU_NCUDA=0 STARPU_NOPENCL=0 STARPU_NCPUS=0 $exampledir/basic_examples/variable check_success $? echo "incrementer opencl" STARPU_NCUDA=0 STARPU_NCPUS=0 $exampledir/incrementer/incrementer 10 check_success $? echo "incrementer no worker" STARPU_NCUDA=0 STARPU_NOPENCL=0 STARPU_NCPUS=0 $exampledir/incrementer/incrementer check_success $? echo "tag_example" $exampledir/tag_example/tag_example -iter 64 -i 128 -j 24 check_success $? echo "tag_example2" $exampledir/tag_example/tag_example2 -iter 64 -i 128 check_success $? if [ -f $exampledir/cholesky/dw_cholesky ] ; then echo "chol.dm" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.dmda" STARPU_CALIBRATE=1 STARPU_SCHED="dmda" $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.cpu" STARPU_CALIBRATE=1 STARPU_NCUDA=0 STARPU_SCHED="dm" $exampledir/cholesky/dw_cholesky -pin check_success $? echo "chol.gpu" STARPU_CALIBRATE=1 STARPU_NCPUS=0 STARPU_SCHED="dm" $exampledir/cholesky/dw_cholesky -pin check_success $? fi if [ -f $exampledir/heat/heat ] ; then echo "heat.dm.4k.calibrate.v2" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 66 -nblocks 4 -v2 -pin check_success $? echo "heat.dm.8k.calibrate.v2" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -v2 -pin check_success $? echo "heat.dm.8k.no.pin.v2" STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -v2 check_success $? # echo "heat.dm.8k.v2.no.prio" # STARPU_SCHED="no-prio" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 # check_success $? echo "heat.dm.8k.v2.random" STARPU_SCHED="random" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.dm.8k.v2" STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.greedy.8k.v2" STARPU_SCHED="greedy" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 check_success $? echo "heat.8k.cg" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 -cg check_success $? echo "heat.dm.8k.cg" STARPU_SCHED="dm" $exampledir/heat/heat -ntheta 66 -nthick 130 -nblocks 8 -pin -v2 -cg check_success $? fi if [ -f $exampledir/mult/dw_mult_no_stride ] ; then echo "mult.dm.common" STARPU_SCHED="dm" $exampledir/mult/dw_mult_no_stride -nblocks 4 -x 4096 -y 4096 -z 1024 -pin -common-model check_success $? echo "mult.dm" STARPU_CALIBRATE=1 STARPU_SCHED="dm" $exampledir/mult/dw_mult_no_stride -nblocks 8 -x 4096 -y 4096 -z 4096 -pin check_success $? echo "mult.dmda" STARPU_CALIBRATE=1 STARPU_SCHED="dmda" $exampledir/mult/dw_mult_no_stride -nblocks 8 -x 4096 -y 4096 -z 4096 -pin check_success $? fi } apps; starpu-1.1.5/tests/parallel_tasks/0002755000373600000000000000000012571541162014177 500000000000000starpu-1.1.5/tests/parallel_tasks/explicit_combined_worker.c0000644000373600000000000000610312571536551021341 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 static void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); usleep(1000/worker_size); #if 1 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d\n", id, combined_id, worker_size); #endif } static struct starpu_codelet cl = { .type = STARPU_FORKJOIN, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { starpu_data_handle_t v_handle; unsigned *v; int ret; struct starpu_conf conf; ret = starpu_conf_init(&conf); 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, 0, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; task->execute_on_a_specific_worker = 1; task->workerid = worker; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); return EXIT_SUCCESS; enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/parallel_tasks/parallel_kernels_spmd.c0000644000373600000000000000630512571536551020635 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 static void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); usleep(1000/worker_size); #if 0 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); int rank = starpu_combined_worker_get_rank(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d - SPMD rank %d\n", id, combined_id, worker_size, rank); #endif } struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = "parallel_kernel_test_spmd" }; static struct starpu_codelet cl = { .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .model = &model, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t v_handle; unsigned *v; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "pheft"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, 0, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.1.5/tests/parallel_tasks/parallel_kernels.c0000644000373600000000000000620012571536551017604 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 static void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); usleep(1000/worker_size); #if 0 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d\n", id, combined_id, worker_size); #endif } struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = "parallel_kernel_test" }; static struct starpu_codelet cl = { .type = STARPU_FORKJOIN, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .model = &model, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t v_handle; unsigned *v; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "pheft"; conf.calibrate = 1; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, 0, (uintptr_t)v, VECTORSIZE, sizeof(unsigned)); unsigned nworker = starpu_worker_get_count() + starpu_combined_worker_get_count(); unsigned iter, worker; for (iter = 0; iter < N; iter++) { for (worker = 0; worker < nworker; worker++) { /* execute a task on that worker */ struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = v_handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(v_handle); starpu_free(v); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: starpu_data_unregister(v_handle); starpu_free(v); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.1.5/tests/parallel_tasks/cuda_only.c0000644000373600000000000000517112571536551016250 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = "test" }; static struct starpu_codelet cl = { .cuda_funcs = {codelet_null}, .model = &model, .nbuffers = 1, .modes = {STARPU_R} }; struct starpu_perfmodel model2 = { .type = STARPU_HISTORY_BASED, .symbol = "test2" }; static struct starpu_codelet cl2 = { .cuda_funcs = {codelet_null}, .model = &model2, .nbuffers = 1, .modes = {STARPU_W} }; int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; unsigned data; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "pheft"; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_variable_data_register(&handle, 0, (uintptr_t)&data, sizeof(data)); unsigned iter; struct starpu_task *task; for (iter = 0; iter < 100; iter++) { task = starpu_task_create(); task->cl = &cl; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); task = starpu_task_create(); task->cl = &cl2; task->handles[0] = handle; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(handle); starpu_shutdown(); STARPU_RETURN(EXIT_SUCCESS); enodev: task->destroy = 0; starpu_task_destroy(task); starpu_data_unregister(handle); fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); STARPU_RETURN(STARPU_TEST_SKIPPED); } starpu-1.1.5/tests/parallel_tasks/spmd_peager.c0000644000373600000000000000567612571536551016573 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include "../helper.h" #ifndef STARPU_QUICK_CHECK #define N 1000 #else #define N 100 #endif #define VECTORSIZE 1024 starpu_data_handle_t v_handle; static unsigned *v; static void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; int worker_size = starpu_combined_worker_get_size(); STARPU_ASSERT(worker_size > 0); // FPRINTF(stderr, "WORKERSIZE : %d\n", worker_size); usleep(1000/worker_size); #if 0 int id = starpu_worker_get_id(); int combined_id = starpu_combined_worker_get_id(); int rank = starpu_combined_worker_get_rank(); FPRINTF(stderr, "worker id %d - combined id %d - worker size %d - SPMD rank %d\n", id, combined_id, worker_size, rank); #endif } static struct starpu_codelet cl = { .type = STARPU_SPMD, .max_parallelism = INT_MAX, .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .nbuffers = 1, .modes = {STARPU_R} }; int main(int argc, char **argv) { int ret; struct starpu_conf conf; starpu_conf_init(&conf); conf.sched_policy_name = "peager"; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); STARPU_CHECK_RETURN_VALUE(ret, "starpu_malloc"); starpu_vector_data_register(&v_handle, 0, (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; int 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.1.5/tests/fortran90/0002755000373600000000000000000012571541162013022 500000000000000starpu-1.1.5/tests/fortran90/init_01.f900000644000373600000000000000151412571536544014534 00000000000000! StarPU --- Runtime system for heterogeneous multicore architectures. ! ! Copyright (C) 2015 Inria ! ! StarPU is free software; you can redistribute it and/or modify ! it under the terms of the GNU Lesser General Public License as published by ! the Free Software Foundation; either version 2.1 of the License, or (at ! your option) any later version. ! ! StarPU is distributed in the hope that it will be useful, but ! WITHOUT ANY WARRANTY; without even the implied warranty of ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ! ! See the GNU Lesser General Public License in COPYING.LGPL for more details. PROGRAM init_01 USE starpu_mod USE iso_c_binding IMPLICIT NONE INTEGER(KIND=C_INT) :: res res = starpu_init(C_NULL_PTR) IF (res /= 0) THEN STOP 77 END IF CALL starpu_shutdown() END PROGRAM init_01 starpu-1.1.5/tests/Makefile.am0000644000373600000000000004764212571536543013174 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 CNRS # Copyright (C) 2010, 2011, 2012 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. AM_CFLAGS = $(HWLOC_CFLAGS) $(FXT_CFLAGS) -Wall $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(GLOBAL_AM_CFLAGS) -Wno-unused LIBS = $(top_builddir)/src/@LIBSTARPU_LINK@ $(HWLOC_LIBS) @LIBS@ AM_CPPFLAGS = -I$(top_srcdir)/include/ -I$(top_builddir)/src -I$(top_srcdir)/src/ AM_LDFLAGS = $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LDFLAGS) EXTRA_DIST = \ helper.h \ datawizard/scal.h \ microbenchs/tasks_size_overhead.sh \ microbenchs/tasks_size_overhead.gp \ datawizard/scratch_opencl_kernel.cl \ datawizard/sync_and_notify_data_opencl_codelet.cl\ datawizard/opencl_codelet_unsigned_inc_kernel.cl \ coverage/coverage.sh \ datawizard/acquire_release_opencl_kernel.cl \ datawizard/interfaces/test_interfaces.h \ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl \ datawizard/interfaces/coo/coo_opencl_kernel.cl \ datawizard/interfaces/matrix/matrix_opencl_kernel.cl \ datawizard/interfaces/variable/variable_opencl_kernel.cl \ datawizard/interfaces/vector/test_vector_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_types.h \ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl \ datawizard/interfaces/multiformat/advanced/generic.h \ datawizard/interfaces/csr/csr_opencl_kernel.cl \ datawizard/interfaces/block/block_opencl_kernel.cl \ perfmodels/opencl_memset_kernel.cl CLEANFILES = \ *.gcno *.gcda *.linkinfo core *.mod BUILT_SOURCES = SUBDIRS = examplebindir = $(libdir)/starpu/examples if STARPU_USE_OPENCL nobase_STARPU_OPENCL_DATA_DATA = endif if STARPU_USE_CUDA # TODO define NVCCFLAGS NVCC ?= nvcc NVCCFLAGS += -I$(top_srcdir)/include/ -I$(top_srcdir)/src -I$(top_builddir)/src -I$(top_builddir)/include $(HWLOC_CFLAGS) $(SIMGRID_CFLAGS) .cu.cubin: $(MKDIR_P) `dirname $@` $(NVCC) -cubin $< -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) .cu.o: $(MKDIR_P) `dirname $@` $(NVCC) $< -c -o $@ --compiler-options -fno-strict-aliasing $(NVCCFLAGS) -I${includedir} endif testbindir = $(libdir)/starpu/tests ##################################### # What to install and what to check # ##################################### if !STARPU_HAVE_WINDOWS ## test loader program LOADER = loader LOADER_BIN = $(abs_top_builddir)/tests/$(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 TESTS = $(noinst_PROGRAMS) if STARPU_COVERAGE_ENABLED TESTS += coverage/coverage.sh endif XFAIL_TESTS= errorcheck/invalid_blocking_calls noinst_PROGRAMS = \ main/deprecated_func \ main/deprecated_buffer \ main/driver_api/init_run_deinit \ main/driver_api/run_driver \ main/deploop \ main/restart \ main/execute_on_a_specific_worker \ main/insert_task \ main/insert_task_nullcodelet \ main/insert_task_array \ main/multithreaded \ main/multithreaded_init \ 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/wait_all_regenerable_tasks \ main/subgraph_repeat \ main/subgraph_repeat_regenerate \ main/subgraph_repeat_regenerate_tag \ main/empty_task \ main/empty_task_sync_point \ main/empty_task_sync_point_tasks \ main/empty_task_chain \ main/tag_wait_api \ main/task_wait_api \ main/declare_deps_in_callback \ main/declare_deps_after_submission \ main/declare_deps_after_submission_synchronous \ main/get_current_task \ main/starpu_init \ main/starpu_worker_exists \ main/submit \ main/pause_resume \ main/pack \ datawizard/allocate \ datawizard/acquire_cb \ datawizard/acquire_cb_insert \ datawizard/acquire_release \ datawizard/acquire_release2 \ datawizard/cache \ datawizard/copy \ datawizard/data_implicit_deps \ datawizard/data_lookup \ datawizard/scratch \ datawizard/sync_and_notify_data \ datawizard/sync_and_notify_data_implicit\ datawizard/dsm_stress \ datawizard/double_parameter \ datawizard/write_only_tmp_buffer \ datawizard/data_invalidation \ datawizard/dining_philosophers \ datawizard/manual_reduction \ datawizard/readers_and_writers \ datawizard/unpartition \ datawizard/user_interaction_implicit \ 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/nowhere \ datawizard/interfaces/copy_interfaces \ datawizard/interfaces/block/block_interface \ datawizard/interfaces/bcsr/bcsr_interface \ datawizard/interfaces/coo/coo_interface \ datawizard/interfaces/csr/csr_interface \ datawizard/interfaces/matrix/matrix_interface \ datawizard/interfaces/multiformat/multiformat_interface \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl \ datawizard/interfaces/multiformat/advanced/multiformat_data_release \ datawizard/interfaces/multiformat/advanced/multiformat_worker \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion \ datawizard/interfaces/multiformat/advanced/same_handle \ datawizard/interfaces/variable/variable_interface \ datawizard/interfaces/vector/test_vector_interface \ datawizard/interfaces/void/void_interface \ datawizard/in_place_partition \ datawizard/partition_lazy \ datawizard/gpu_register \ datawizard/gpu_ptr_register \ datawizard/wt_host \ datawizard/wt_broadcast \ datawizard/readonly \ datawizard/specific_node \ datawizard/task_with_multiple_time_the_same_handle \ errorcheck/starpu_init_noworker \ errorcheck/invalid_blocking_calls \ errorcheck/invalid_tasks \ helper/cublas_init \ helper/starpu_data_cpy \ helper/pinned_memory \ helper/execute_on_all \ 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/local_pingpong \ microbenchs/matrix_as_vector \ overlap/overlap \ parallel_tasks/explicit_combined_worker \ parallel_tasks/parallel_kernels \ parallel_tasks/parallel_kernels_spmd \ parallel_tasks/spmd_peager \ parallel_tasks/cuda_only \ perfmodels/regression_based \ perfmodels/non_linear_regression_based \ perfmodels/feed \ perfmodels/valid_model \ perfmodels/value_nan \ sched_policies/data_locality \ sched_policies/execute_all_tasks \ sched_policies/prio \ sched_policies/simple_deps \ sched_policies/simple_cpu_gpu_sched if STARPU_HAVE_FC if !STARPU_SANITIZE noinst_PROGRAMS += \ fortran90/init_01 endif endif if STARPU_LONG_CHECK noinst_PROGRAMS += \ main/tag_task_data_deps \ datawizard/reclaim endif examplebin_PROGRAMS = \ microbenchs/tasks_size_overhead \ microbenchs/local_pingpong examplebin_SCRIPTS = \ microbenchs/tasks_size_overhead.gp \ microbenchs/tasks_size_overhead.sh if STARPU_HAVE_WINDOWS check_PROGRAMS = $(noinst_PROGRAMS) else check_PROGRAMS = $(LOADER) $(noinst_PROGRAMS) endif ####################### # 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_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 main_deprecated_func_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations main_deprecated_buffer_CFLAGS = $(AM_CFLAGS) -Wno-deprecated-declarations if STARPU_HAVE_FC fortran90_init_01_SOURCES = \ $(top_srcdir)/include/starpu_mod.f90 \ fortran90/init_01.f90 endif ################### # Block interface # ################### datawizard_interfaces_block_block_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/block/block_interface.c if STARPU_USE_CUDA datawizard_interfaces_block_block_interface_SOURCES+= \ datawizard/interfaces/block/block_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_block_block_interface_SOURCES+= \ datawizard/interfaces/block/block_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/block/block_opencl_kernel.cl endif ################## # BSCR interface # ################## datawizard_interfaces_bcsr_bcsr_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/bcsr/bcsr_interface.c if STARPU_USE_CUDA datawizard_interfaces_bcsr_bcsr_interface_SOURCES+= \ datawizard/interfaces/bcsr/bcsr_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_bcsr_bcsr_interface_SOURCES+= \ datawizard/interfaces/bcsr/bcsr_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/bcsr/bcsr_opencl_kernel.cl endif ################# # COO interface # ################# datawizard_interfaces_coo_coo_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/coo/coo_interface.c if STARPU_USE_CUDA datawizard_interfaces_coo_coo_interface_SOURCES+= \ datawizard/interfaces/coo/coo_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_coo_coo_interface_SOURCES+= \ datawizard/interfaces/coo/coo_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/coo/coo_opencl_kernel.cl endif ################# # CSR interface # ################# datawizard_interfaces_csr_csr_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/csr/csr_interface.c if STARPU_USE_CUDA datawizard_interfaces_csr_csr_interface_SOURCES+= \ datawizard/interfaces/csr/csr_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_csr_csr_interface_SOURCES+= \ datawizard/interfaces/csr/csr_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/csr/csr_opencl_kernel.cl endif datawizard_interfaces_vector_test_vector_interface_SOURCES = \ datawizard/interfaces/vector/test_vector_interface.c \ datawizard/interfaces/test_interfaces.c if STARPU_USE_CUDA datawizard_interfaces_vector_test_vector_interface_SOURCES += \ datawizard/interfaces/vector/test_vector_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_vector_test_vector_interface_SOURCES += \ datawizard/interfaces/vector/test_vector_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/vector/test_vector_opencl_kernel.cl endif #################### # Matrix interface # #################### datawizard_interfaces_matrix_matrix_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/matrix/matrix_interface.c if STARPU_USE_CUDA datawizard_interfaces_matrix_matrix_interface_SOURCES+= \ datawizard/interfaces/matrix/matrix_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_matrix_matrix_interface_SOURCES+= \ datawizard/interfaces/matrix/matrix_opencl.c nobase_STARPU_OPENCL_DATA_DATA+= \ datawizard/interfaces/matrix/matrix_opencl_kernel.cl endif ######################### # Multiformat interface # ######################### datawizard_interfaces_multiformat_multiformat_interface_SOURCES = \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/multiformat/multiformat_interface.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets.c if STARPU_USE_CUDA datawizard_interfaces_multiformat_multiformat_interface_SOURCES+= \ datawizard/interfaces/multiformat/multiformat_cuda.cu \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_multiformat_multiformat_interface_SOURCES+= \ datawizard/interfaces/multiformat/multiformat_opencl.c \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/multiformat/multiformat_opencl_kernel.cl \ datawizard/interfaces/multiformat/multiformat_conversion_codelets_kernel.cl endif datawizard_interfaces_multiformat_advanced_multiformat_cuda_opencl_SOURCES=\ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_cuda_opencl.c datawizard_interfaces_multiformat_advanced_multiformat_data_release_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_data_release.c datawizard_interfaces_multiformat_advanced_multiformat_worker_SOURCES=\ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_worker.c datawizard_interfaces_multiformat_advanced_multiformat_handle_conversion_SOURCES = \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/multiformat_handle_conversion.c datawizard_interfaces_multiformat_advanced_same_handle_SOURCES= \ datawizard/interfaces/multiformat/advanced/generic.c \ datawizard/interfaces/multiformat/advanced/same_handle.c datawizard_interfaces_variable_variable_interface_SOURCES= \ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/variable/variable_interface.c if STARPU_USE_CUDA datawizard_interfaces_variable_variable_interface_SOURCES+= \ datawizard/interfaces/variable/variable_cuda.cu endif if STARPU_USE_OPENCL datawizard_interfaces_variable_variable_interface_SOURCES+= \ datawizard/interfaces/variable/variable_opencl.c nobase_STARPU_OPENCL_DATA_DATA += \ datawizard/interfaces/variable/variable_opencl_kernel.cl endif ################## # Void interface # ################## datawizard_interfaces_void_void_interface_SOURCES=\ datawizard/interfaces/test_interfaces.c \ datawizard/interfaces/void/void_interface.c 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 = -lm 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 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.1.5/tests/regression/0002755000373600000000000000000012571541160013354 500000000000000starpu-1.1.5/tests/regression/profiles.build.only.in0000644000373600000000000000202012571536543017526 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.1.5/tests/regression/profiles.in0000644000373600000000000000312512571536543015457 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Université de Bordeaux # Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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=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.1.5/tests/regression/regression.sh.in0000755000373600000000000000734512571536543016440 00000000000000#!/bin/bash # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2010 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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.1.5/tests/main/0002755000373600000000000000000012571541162012122 500000000000000starpu-1.1.5/tests/main/declare_deps_after_submission_synchronous.c0000644000373600000000000000516612571536545022745 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK #define NLOOPS 4 #else #define NLOOPS 128 #endif static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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.1.5/tests/main/submit.c0000644000373600000000000000577712571536545013540 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" static int i = 0, j; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { int old_i = STARPU_ATOMIC_ADD(&i, 1); FPRINTF(stdout, "called third task, i = %d\n", old_i+1); } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->detach = 1; if (starpu_task_submit(task) == ENODEV) exit(STARPU_TEST_SKIPPED); FPRINTF(stdout, "submitted third task, i = %d\n", i); } static struct starpu_codelet callback_submit_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; static void task_submit_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_create(); task->cl = &callback_submit_codelet; task->callback_func = callback; task->detach = 1; if (starpu_task_submit(task) == ENODEV) exit(STARPU_TEST_SKIPPED); int old_i = STARPU_ATOMIC_ADD(&i, 1); FPRINTF(stdout, "submitted second task, i = %d\n", old_i + 1); } static struct starpu_codelet task_submit_codelet = { .cpu_funcs = {task_submit_func}, .cuda_funcs = {task_submit_func}, .opencl_funcs = {task_submit_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *task = starpu_task_create(); task->cl = &task_submit_codelet; task->detach = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); j = i; starpu_shutdown(); return j == 3 ? EXIT_SUCCESS : EXIT_FAILURE; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/main/wait_all_regenerable_tasks.c0000644000373600000000000000613012571536545017551 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #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; } static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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.1.5/tests/main/subgraph_repeat.c0000644000373600000000000001077512571536545015402 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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 = 0; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { (void) STARPU_ATOMIC_ADD(&check_cnt, 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_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cnt++; if (loop_cnt == niter) { /* We are done */ STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { int ret; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ ret = starpu_task_submit(&taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.cl_arg = &taskA; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.cl_arg = &taskB; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.cl_arg = &taskC; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.cl_arg = &taskD; taskD.callback_func = callback_task_D; struct starpu_task *depsBC_array[1] = {&taskA}; starpu_task_declare_deps_array(&taskB, 1, depsBC_array); starpu_task_declare_deps_array(&taskC, 1, depsBC_array); struct starpu_task *depsD_array[2] = {&taskB, &taskC}; starpu_task_declare_deps_array(&taskD, 2, depsD_array); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* 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_ASSERT(check_cnt == (4*loop_cnt)); starpu_shutdown(); /* Cleanup the statically allocated tasks after shutdown, as StarPU is still working on it after the callback */ starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); 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.1.5/tests/main/regenerate_pipeline.c0000644000373600000000000001047012571536545016225 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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 #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; ANNOTATE_HAPPENS_BEFORE(&cnt); res = STARPU_ATOMIC_ADD(cnt, 1); if (res == ntasks) { ANNOTATE_HAPPENS_AFTER(&cnt); task->regenerate = 0; FPRINTF(stderr, "Stop !\n"); STARPU_PTHREAD_MUTEX_LOCK(&mutex); completed++; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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_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_shutdown(); /* Cleanup the statically allocated tasks after shutdown, as StarPU is still working on it after the callback */ starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); 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.1.5/tests/main/deprecated_func.c0000644000373600000000000000650212571536545015333 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *valin = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *valout = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *valout = *valin; } void cpu2_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *valin = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *valout = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *valout = *valin*2; } struct starpu_codelet cl_cpu_funcs = { .where = STARPU_CPU, .cpu_funcs = {cpu_codelet}, .nbuffers = 2, .name = "cpu_funcs", }; struct starpu_codelet cl_cpu_func = { .where = STARPU_CPU, .cpu_func = 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}, .nbuffers = 2, .name = "cpu_multiple", }; struct starpu_codelet cl_cpu_func_funcs = { .where = STARPU_CPU, .cpu_func = cpu2_codelet, .cpu_funcs = {cpu_codelet}, .nbuffers = 2, .name = "cpu_func_funcs", }; 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], 0, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&handles[1], 0, (uintptr_t)&y, sizeof(y)); cl.where = where; ret = starpu_insert_task(&cl, STARPU_R, handles[0], STARPU_W, handles[1], 0); if (ret == -ENODEV) { FPRINTF(stderr, "cannot execute codelet <%s> with where=%d\n", cl.name, where); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); return ret; } starpu_task_wait_for_all(); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); if (x != y) { FPRINTF(stderr, "error when executing codelet <%s> with where=%d\n", cl.name, where); } else { FPRINTF(stderr, "success when executing codelet <%s> with where=%d\n", cl.name, where); } return (x != y); } int main(int argc, char **argv) { int ret; unsigned where; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for(where=0 ; where<=STARPU_CPU ; where+=STARPU_CPU) { ret = submit_codelet(cl_cpu_func, where); if (ret == -ENODEV) { starpu_shutdown(); fprintf(stderr, "WARNING: No one can execute this task\n"); return STARPU_TEST_SKIPPED; } if (!ret) { ret = submit_codelet(cl_cpu_funcs, where); } if (!ret) { ret = submit_codelet(cl_cpu_multiple, where); } if (!ret) { ret = submit_codelet(cl_cpu_func_funcs, where); } } starpu_shutdown(); STARPU_RETURN(ret); } starpu-1.1.5/tests/main/declare_deps_in_callback.c0000644000373600000000000000502512571536545017133 00000000000000 /* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #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"); } static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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.1.5/tests/main/tag_task_data_deps.c0000644000373600000000000001347512571536545016030 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 combinations of various tag/task/data dependencies */ #include #include #include #include "../helper.h" static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { unsigned duration = (uintptr_t) arg; if (duration) usleep(duration); } static struct starpu_codelet dummy_Rcodelet = { .cpu_funcs = {dummy_func}, .model = NULL, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet dummy_Wcodelet = { .cpu_funcs = {dummy_func}, .model = NULL, .nbuffers = 1, .modes = {STARPU_W} }; static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .model = NULL, .nbuffers = 0, }; static struct starpu_task *create_dummy_task(int write, int data, unsigned duration, starpu_data_handle_t handle) { struct starpu_task *task = starpu_task_create(); if (data) { if (write) task->cl = &dummy_Wcodelet; else task->cl = &dummy_Rcodelet; task->handles[0] = handle; } else task->cl = &dummy_codelet; task->cl_arg = (void*) (uintptr_t) duration; return task; } int main(int argc, char **argv) { int ret; /* We have 27 toggles to try below, thus 2^27 possibilities */ unsigned loop, nloops = 128*1024; unsigned duration = 1000; starpu_data_handle_t handle1, handle2; #ifdef STARPU_QUICK_CHECK return STARPU_TEST_SKIPPED; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_void_data_register(&handle1); starpu_void_data_register(&handle2); starpu_data_set_sequential_consistency_flag(handle2, 0); struct starpu_task *taskA, *taskB, *taskC; #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; 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_submit"); ret = starpu_task_wait(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } while(0); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/main/task_wait_api.c0000644000373600000000000001105712571536545015040 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "{ A } -> { B }\n"); fflush(stderr); struct starpu_task *taskA, *taskB; taskA = create_dummy_task(); taskB = create_dummy_task(); /* B depends on A */ starpu_task_declare_deps_array(taskB, 1, &taskA); ret = starpu_task_submit(taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); FPRINTF(stderr, "{ C, D, E, F } -> { G }\n"); struct starpu_task *taskC, *taskD, *taskE, *taskF, *taskG; taskC = create_dummy_task(); taskD = create_dummy_task(); taskE = create_dummy_task(); taskF = create_dummy_task(); taskG = create_dummy_task(); struct starpu_task *tasksCDEF[4] = {taskC, taskD, taskE, taskF}; starpu_task_declare_deps_array(taskG, 4, tasksCDEF); ret = starpu_task_submit(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskF); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskG); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); FPRINTF(stderr, "{ H, I } -> { J, K, L }\n"); struct starpu_task *taskH, *taskI, *taskJ, *taskK, *taskL; taskH = create_dummy_task(); taskI = create_dummy_task(); taskJ = create_dummy_task(); taskK = create_dummy_task(); taskL = create_dummy_task(); struct starpu_task *tasksHI[2] = {taskH, taskI}; starpu_task_declare_deps_array(taskJ, 2, tasksHI); starpu_task_declare_deps_array(taskK, 2, tasksHI); starpu_task_declare_deps_array(taskL, 2, tasksHI); ret = starpu_task_submit(taskH); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskI); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskJ); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskK); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(taskJ); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); ret = starpu_task_wait(taskK); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); ret = starpu_task_wait(taskL); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_task_wait_for_all(); /* Destroy all the tasks that were not detached */ starpu_task_destroy(taskA); starpu_task_destroy(taskC); starpu_task_destroy(taskD); starpu_task_destroy(taskE); starpu_task_destroy(taskF); starpu_task_destroy(taskH); starpu_task_destroy(taskI); starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/main/deploop.c0000644000373600000000000000455712571536545013672 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * 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. */ #include #include #include #include "../helper.h" static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { FPRINTF(stderr,"executing task %p\n", starpu_task_get_current()); } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 1, .modes = { STARPU_RW } }; int main(int argc, char **argv) { int ret; starpu_data_handle_t handle; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_void_data_register(&handle); struct starpu_task *taskA, *taskB; /* Make B depend on A */ starpu_tag_declare_deps(1, 1, (starpu_tag_t) 0); taskA = starpu_task_create(); taskA->cl = &dummy_codelet; taskA->tag_id = 0; taskA->use_tag = 1; taskA->handles[0] = handle; taskA->sequential_consistency = 0; FPRINTF(stderr,"A is %p\n", taskA); taskB = starpu_task_create(); taskB->cl = &dummy_codelet; taskB->tag_id = 1; taskB->use_tag = 1; taskB->handles[0] = handle; FPRINTF(stderr,"B is %p\n", taskB); ret = starpu_task_submit(taskB); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; ret = starpu_task_submit(taskA); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_data_unregister(handle); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/main/empty_task_sync_point.c0000644000373600000000000000606312571536545016647 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" 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; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* {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.1.5/tests/main/subgraph_repeat_regenerate_tag.c0000644000373600000000000001160512571536545020427 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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 check_cnt = 0; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { (void) STARPU_ATOMIC_ADD(&check_cnt, 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_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cnt++; if (loop_cnt == niter) { /* We are done */ taskD.regenerate = 0; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ starpu_tag_restart((starpu_tag_t) TAG_START); starpu_tag_notify_from_apps((starpu_tag_t)TAG_START); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_init(NULL); 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_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.cl_arg = &taskA; taskA.regenerate = 1; /* this task will be explicitely resubmitted if needed */ taskA.use_tag = 1; taskA.tag_id = TAG_A; starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.cl_arg = &taskB; taskB.regenerate = 1; taskB.use_tag = 1; taskB.tag_id = TAG_B; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.cl_arg = &taskC; taskC.regenerate = 1; taskC.use_tag = 1; taskC.tag_id = TAG_C; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.cl_arg = &taskD; taskD.callback_func = callback_task_D; taskD.regenerate = 1; taskD.use_tag = 1; taskD.tag_id = TAG_D; 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); /* 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_ASSERT(check_cnt == (4*loop_cnt)); starpu_shutdown(); /* Cleanup the statically allocated tasks after shutdown, as StarPU is still working on it after the callback */ starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); 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.1.5/tests/main/multithreaded_init.c0000644000373600000000000000407612571536545016102 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Institut National de Recherche en Informatique et Automatique * Copyright (C) 2010-2011, 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #define NUM_THREADS 5 void *launch_starpu(void *unused) { int ret; (void) unused; ret = starpu_init(NULL); if (ret == -ENODEV) exit(STARPU_TEST_SKIPPED); STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); return NULL; } 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; starpu_pthread_t threads[NUM_THREADS]; start = starpu_timing_now(); for (i = 0; i < NUM_THREADS; ++i) { int ret = starpu_pthread_create(&threads[i], NULL, launch_starpu, NULL); STARPU_ASSERT(ret == 0); } for (i = 0; i < NUM_THREADS; ++i) { int ret = starpu_pthread_join(threads[i], NULL); STARPU_ASSERT(ret == 0); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Success : %d threads launching simultaneously starpu_init\n", NUM_THREADS); FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/NUM_THREADS); for (i = 0; i < NUM_THREADS; i++) { int ret = starpu_pthread_create(&threads[i], NULL, shutdown_starpu, NULL); STARPU_ASSERT(ret == 0); } for (i = 0; i < NUM_THREADS; i++) { int ret = starpu_pthread_join(threads[i], NULL); STARPU_ASSERT(ret == 0); } return EXIT_SUCCESS; } starpu-1.1.5/tests/main/pack.c0000644000373600000000000000403612571536546013137 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 factor; char c; int x; starpu_codelet_unpack_args(_args, &factor, &c, &x); FPRINTF(stderr, "values: %d %c %d\n", factor, c, x); assert(factor == 12 && c == 'n' && x == 42); } struct starpu_codelet mycodelet = { .cpu_funcs = {func_cpu}, .nbuffers = 0 }; int main(int argc, char **argv) { int i, ret; int x=42; int factor=12; char c='n'; struct starpu_task *task; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "values: %d %c %d\n", factor, c, x); task = starpu_task_create(); task->synchronous = 1; task->cl = &mycodelet; task->cl_arg_free = 1; starpu_codelet_pack_args(&task->cl_arg, &task->cl_arg_size, STARPU_VALUE, &factor, sizeof(factor), STARPU_VALUE, &c, sizeof(c), STARPU_VALUE, &x, sizeof(x), 0); ret = starpu_task_submit(task); if (ret != -ENODEV) STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_shutdown(); if (ret == -ENODEV) { fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ return STARPU_TEST_SKIPPED; } else return 0; } starpu-1.1.5/tests/main/insert_task.c0000644000373600000000000001101612571536545014542 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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" static int _ifactor = 12; static float _ffactor = 10.0; void func_cpu_args(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); float *x1 = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); int ifactor; float ffactor; starpu_codelet_unpack_args(_args, &ifactor, &ffactor); *x0 = *x0 * ifactor; *x1 = *x1 * ffactor; } void func_cpu_noargs(void *descr[], void *_args) { int *x0 = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); float *x1 = (float *)STARPU_VARIABLE_GET_PTR(descr[1]); *x0 = *x0 * _ifactor; *x1 = *x1 * _ffactor; } struct starpu_codelet mycodelet_args = { .modes = { STARPU_RW, STARPU_RW }, .cpu_funcs = {func_cpu_args}, .nbuffers = 2 }; struct starpu_codelet mycodelet_noargs = { .modes = { STARPU_RW, STARPU_RW }, .cpu_funcs = {func_cpu_noargs}, .nbuffers = 2 }; int test_codelet(struct starpu_codelet *codelet, int insert_task, 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], 0, (uintptr_t)&xx, sizeof(xx)); starpu_variable_data_register(&data_handles[1], 0, (uintptr_t)&ff, sizeof(ff)); FPRINTF(stderr, "values: %d (%d) %f (%f)\n", xx, _ifactor, ff, _ffactor); if (insert_task) { if (args) ret = starpu_insert_task(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_insert_task(codelet, STARPU_RW, data_handles[0], STARPU_RW, data_handles[1], 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); } 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); task->cl_arg_free = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } enodev: for(i=0 ; i<2 ; i++) { starpu_data_unregister(data_handles[i]); } FPRINTF(stderr, "values: %d (should be %d) %f (should be %f)\n\n", xx, x*_ifactor, ff, f*_ffactor); return (ret == -ENODEV ? ret : xx == x*_ifactor && ff == f*_ffactor); } int main(int argc, char **argv) { int x; float f; int i, ret; int ifactor=12; float ffactor=10.0; starpu_data_handle_t data_handles[2]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "Testing codelet with insert task 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 insert task 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.1.5/tests/main/regenerate.c0000644000373600000000000000633412571536546014345 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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 #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static unsigned cnt = 0; static unsigned completed = 0; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static void callback(void *arg STARPU_ATTRIBUTE_UNUSED) { struct starpu_task *task = starpu_task_get_current(); cnt++; if (cnt == ntasks) { task->regenerate = 0; FPRINTF(stderr, "Stop !\n"); STARPU_PTHREAD_MUTEX_LOCK(&mutex); completed = 1; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } } static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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_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_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.1.5/tests/main/restart.c0000644000373600000000000000330212571536545013677 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #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_init(NULL); 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.1.5/tests/main/pause_resume.c0000644000373600000000000000544312571536545014720 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 200000; #endif static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { double timing; double start; double end; int ret; #ifdef STARPU_HAVE_VALGRIND_H if(RUNNING_ON_VALGRIND) ntasks = 5; #endif ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* Check that we can submit tasks to a "paused" StarPU and then have * it run normally. */ starpu_pause(); unsigned i; for (i = 0; i < ntasks; i++) { ret = starpu_insert_task(&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_insert_task(&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.1.5/tests/main/empty_task_chain.c0000644000373600000000000000363112571536546015543 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 4 int main(int argc, char **argv) { int i, ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task **tasks = (struct starpu_task **) malloc(N*sizeof(struct starpu_task *)); for (i = 0; i < N; i++) { tasks[i] = starpu_task_create(); tasks[i]->cl = NULL; if (i > 0) { starpu_task_declare_deps_array(tasks[i], 1, &tasks[i-1]); ret = starpu_task_submit(tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } if (i == (N-1)) tasks[i]->detach = 0; } ret = starpu_task_submit(tasks[0]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait(tasks[N-1]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); starpu_shutdown(); free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/main/starpu_worker_exists.c0000644000373600000000000000356212571536545016531 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Institut National de Recherche en Informatique et Automatique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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" 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; } static void fake(void *buffers[], void *args) { (void) buffers; (void) args; } static struct starpu_codelet cl = { .cpu_funcs = { fake}, .cuda_funcs = { fake}, .opencl_funcs = { fake}, .nbuffers = 0 }; int main(void) { int ret; struct starpu_task *task; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; task = starpu_task_create(); task->cl = &cl; task->destroy = 0; cl.can_execute = NULL; ret = _starpu_worker_exists(task); if (!ret) return EXIT_FAILURE; cl.can_execute = can_always_execute; ret = _starpu_worker_exists(task); if (!ret) return EXIT_FAILURE; cl.can_execute = can_never_execute; ret = _starpu_worker_exists(task); if (ret) return EXIT_FAILURE; starpu_task_destroy(task); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/main/starpu_task_wait.c0000644000373600000000000000550112571536545015602 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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.1.5/tests/main/get_current_task.c0000644000373600000000000000620112571536545015557 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static void check_task_func(void *descr[], void *arg) { /* We check that the returned task is valid from the codelet */ 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}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); 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->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.1.5/tests/main/starpu_task_wait_for_all.c0000644000373600000000000000556112571536546017307 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static void dummy_func(void *descr[], void *arg) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(&conf); 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.1.5/tests/main/empty_task_sync_point_tasks.c0000644000373600000000000000510212571536545020045 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* {A,B,C} -> D -> {E,F}, D is empty */ struct starpu_task *taskA = starpu_task_create(); taskA->cl = &dummy_codelet; struct starpu_task *taskB = starpu_task_create(); taskB->cl = &dummy_codelet; struct starpu_task *taskC = starpu_task_create(); taskC->cl = &dummy_codelet; struct starpu_task *taskD = starpu_task_create(); taskD->cl = NULL; struct starpu_task *taskE = starpu_task_create(); taskE->cl = &dummy_codelet; struct starpu_task *taskF = starpu_task_create(); taskF->cl = &dummy_codelet; struct starpu_task *tasksABC[3] = {taskA, taskB, taskC}; starpu_task_declare_deps_array(taskD, 3, tasksABC); starpu_task_declare_deps_array(taskE, 1, &taskD); starpu_task_declare_deps_array(taskF, 1, &taskD); ret = starpu_task_submit(taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskB); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskC); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskD); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskE); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(taskF); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/main/insert_task_array.c0000644000373600000000000000460512571536545015746 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 *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}, .nbuffers = 2 }; int main(int argc, char **argv) { int x; float f; int factor=12; int i, ret; starpu_data_handle_t data_handles[2]; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); x = 1; starpu_variable_data_register(&data_handles[0], 0, (uintptr_t)&x, sizeof(x)); f = 2.0; starpu_variable_data_register(&data_handles[1], 0, (uintptr_t)&f, sizeof(f)); ret = starpu_insert_task(&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_insert_task"); 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.1.5/tests/main/static_restartable_tag.c0000644000373600000000000000540512571536545016733 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include "../helper.h" #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static starpu_tag_t tag = 0x32; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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_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.1.5/tests/main/static_restartable.c0000644000373600000000000000512612571536546016101 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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.1.5/tests/main/execute_on_a_specific_worker.c0000644000373600000000000000765712571536545020130 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 #ifdef STARPU_QUICK_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) { ANNOTATE_HAPPENS_BEFORE(&cnt); unsigned res = STARPU_ATOMIC_ADD(&cnt, -1); 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 codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { // int id = starpu_worker_get_id(); // FPRINTF(stderr, "worker #%d\n", id); } static struct starpu_codelet cl_r = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet cl_w = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {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}, .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_init(NULL); 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, 0, (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.1.5/tests/main/insert_task_nullcodelet.c0000644000373600000000000000267112571536545017143 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = starpu_insert_task(NULL, 0); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); 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.1.5/tests/main/static_restartable_using_initializer.c0000644000373600000000000000520712571536545021710 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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 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 static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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"); } starpu_task_clean(&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.1.5/tests/main/driver_api/0002755000373600000000000000000012571541162014246 500000000000000starpu-1.1.5/tests/main/driver_api/run_driver.c0000644000373600000000000001454312571536545016527 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../../helper.h" /* * Users can directly control drivers by using the starpu_driver* functions. * * This test makes sure that the starpu_driver_run function works for CPU, CUDA * and OpenCL drivers, and that the starpu_drivers_request_termination function * correctly shuts down all drivers. * * The test_* functions can return: * - 0 (success) * - 1 (failure) * - STARPU_TEST_SKIPPED (non-critical errors) */ #if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static void dummy(void *buffers[], void *args) { (void) buffers; (*(int *)args)++; usleep(100000); } static struct starpu_codelet cl = { .cpu_funcs = { dummy}, .cuda_funcs = { dummy}, .opencl_funcs = { dummy}, .nbuffers = 0 }; static void * run_driver(void *arg) { struct starpu_driver *d = (struct starpu_driver *) arg; int ret = starpu_driver_run(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run"); return NULL; } #endif /* STARPU_USE_CPU || STARPU_USE_CUDA || STARPU_USE_OPENCL */ #ifdef STARPU_USE_CPU static int test_cpu(void) { int ret, var = 0; static starpu_pthread_t driver_thread; struct starpu_conf conf; struct starpu_driver d = { .type = STARPU_CPU_WORKER, .id.cpu_id = 0 }; starpu_conf_init(&conf); conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncpus = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_cpu_worker_get_count() == 0) { FPRINTF(stderr, "WARNING: No CPU worker found\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (ret != 0) { ret = 1; goto out2; } struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CPU; task->cl = &cl; task->cl_arg = &var; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No worker can execute this task\n"); ret = STARPU_TEST_SKIPPED; goto out; } FPRINTF(stderr, "[CPU] Var = %d (expected value: 1)\n", var); ret = !!(var != 1); out: starpu_drivers_request_termination(); if (starpu_pthread_join(driver_thread, NULL) != 0) return 1; out2: starpu_shutdown(); return ret; } #endif /* STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA static int test_cuda(void) { int ret, var = 0; static starpu_pthread_t driver_thread; struct starpu_conf conf; struct starpu_driver d = { .type = STARPU_CUDA_WORKER, .id.cuda_id = 0 }; starpu_conf_init(&conf); conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncuda = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_cuda_worker_get_count() == 0) { FPRINTF(stderr, "WARNING: No CUDA worker found\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (ret == -1) { ret = 1; goto out; } struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CUDA; task->cl = &cl; task->cl_arg = &var; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No worker can execute this task\n"); ret = STARPU_TEST_SKIPPED; goto out; } out: starpu_drivers_request_termination(); if (starpu_pthread_join(driver_thread, NULL) != 0) return 1; starpu_shutdown(); FPRINTF(stderr, "[CUDA] Var = %d (expected value: 1)\n", var); ret = !!(var != 1); return ret; } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int test_opencl(void) { int ret, var = 0; static starpu_pthread_t driver_thread; struct starpu_conf conf; cl_int err; cl_uint pdummy; cl_platform_id platform; err = clGetPlatformIDs(1, &platform, &pdummy); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No OpenCL platform found\n"); return STARPU_TEST_SKIPPED; } cl_device_type device_type = CL_DEVICE_TYPE_GPU|CL_DEVICE_TYPE_ACCELERATOR; if (starpu_get_env_number("STARPU_OPENCL_ON_CPUS") > 0) device_type |= CL_DEVICE_TYPE_CPU; if (starpu_get_env_number("STARPU_OPENCL_ONLY_ON_CPUS") > 0) device_type = CL_DEVICE_TYPE_CPU; cl_device_id device_id; err = clGetDeviceIDs(platform, device_type, 1, &device_id, NULL); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No GPU devices found on OpenCL platform\n"); return STARPU_TEST_SKIPPED; } struct starpu_driver d = { .type = STARPU_OPENCL_WORKER, .id.opencl_id = device_id }; starpu_conf_init(&conf); conf.n_not_launched_drivers = 1; conf.not_launched_drivers = &d; conf.ncuda = 0; conf.nopencl = 1; ret = starpu_init(&conf); if (ret == -ENODEV || starpu_opencl_worker_get_count() == 0) { FPRINTF(stderr, "WARNING: No OpenCL workers found\n"); if (ret == 0) starpu_shutdown(); return STARPU_TEST_SKIPPED; } ret = starpu_pthread_create(&driver_thread, NULL, run_driver, &d); if (ret == -1) { ret = 1; goto out; } struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_OPENCL; task->cl = &cl; task->cl_arg = &var; task->synchronous = 1; ret = starpu_task_submit(task); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No worker can execute the task\n"); ret = STARPU_TEST_SKIPPED; goto out; } out: starpu_drivers_request_termination(); if (starpu_pthread_join(driver_thread, NULL) != 0) return 1; starpu_shutdown(); FPRINTF(stderr, "[OpenCL] Var = %d (expected value: 1)\n", var); ret = !!(var != 1); return ret; } #endif /* STARPU_USE_OPENCL */ int main(void) { int ret = STARPU_TEST_SKIPPED; #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.1.5/tests/main/driver_api/init_run_deinit.c0000644000373600000000000001363112571536545017530 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../../helper.h" #define NTASKS 8 #if defined(STARPU_USE_CPU) || defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) static 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_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_driver_run_once(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_run_once"); ret = starpu_task_wait(task); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait"); } static void deinit_driver(struct starpu_driver *d) { int ret; ret = starpu_driver_deinit(d); STARPU_CHECK_RETURN_VALUE(ret, "starpu_driver_deinit"); } #endif /* STARPU_USE_CPU || STARPU_USE_CUDA || STARPU_USE_OPENCL */ #ifdef STARPU_USE_CPU static int test_cpu(void) { int var = 0, ret, ncpu; struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return 1; struct starpu_driver d = { .type = STARPU_CPU_WORKER, .id.cpu_id = 0 }; conf.not_launched_drivers = &d; conf.n_not_launched_drivers = 1; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No CPU worker found\n"); return STARPU_TEST_SKIPPED; } ncpu = starpu_cpu_worker_get_count(); if (ncpu == 0) { FPRINTF(stderr, "WARNING: No CPU worker found\n"); return STARPU_TEST_SKIPPED; } init_driver(&d); int i; for (i = 0; i < NTASKS; i++) { struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CPU; task->cl = &cl; task->cl_arg = &var; task->detach = 0; run(task, &d); } deinit_driver(&d); starpu_task_wait_for_all(); starpu_shutdown(); FPRINTF(stderr, "[CPU] Var is %d (expected value: %d)\n", var, NTASKS); return !!(var != NTASKS); } #endif /* STARPU_USE_CPU */ #ifdef STARPU_USE_CUDA static int test_cuda(void) { int var = 0, ret, ncuda; struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return 1; struct starpu_driver d = { .type = STARPU_CUDA_WORKER, .id.cuda_id = 0 }; conf.ncuda = 1; conf.nopencl = 0; conf.not_launched_drivers = &d; conf.n_not_launched_drivers = 1; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No CUDA worker found\n"); return STARPU_TEST_SKIPPED; } ncuda = starpu_cuda_worker_get_count(); if (ncuda == 0) { FPRINTF(stderr, "WARNING: No CUDA worker found\n"); return STARPU_TEST_SKIPPED; } init_driver(&d); int i; for (i = 0; i < NTASKS; i++) { struct starpu_task *task; task = starpu_task_create(); cl.where = STARPU_CUDA; task->cl = &cl; task->cl_arg = &var; task->detach = 0; run(task, &d); } deinit_driver(&d); starpu_task_wait_for_all(); starpu_shutdown(); FPRINTF(stderr, "[CUDA] Var is %d (expected value: %d)\n", var, NTASKS); return !!(var != NTASKS); } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int test_opencl(void) { cl_int err; cl_platform_id platform; cl_uint pdummy; int nopencl; err = clGetPlatformIDs(1, &platform, &pdummy); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No OpenCL platform found\n"); return STARPU_TEST_SKIPPED; } cl_device_type device_type = CL_DEVICE_TYPE_GPU|CL_DEVICE_TYPE_ACCELERATOR; if (starpu_get_env_number("STARPU_OPENCL_ON_CPUS") > 0) device_type |= CL_DEVICE_TYPE_CPU; if (starpu_get_env_number("STARPU_OPENCL_ONLY_ON_CPUS") > 0) device_type = CL_DEVICE_TYPE_CPU; cl_device_id device_id; err = clGetDeviceIDs(platform, device_type, 1, &device_id, NULL); if (err != CL_SUCCESS) { FPRINTF(stderr, "WARNING: No GPU devices found on OpenCL platform\n"); return STARPU_TEST_SKIPPED; } int var = 0, ret; struct starpu_conf conf; ret = starpu_conf_init(&conf); if (ret == -EINVAL) return 1; struct starpu_driver d = { .type = STARPU_OPENCL_WORKER, .id.opencl_id = device_id }; conf.ncuda = 0; conf.nopencl = 1; conf.not_launched_drivers = &d; conf.n_not_launched_drivers = 1; ret = starpu_init(&conf); if (ret == -ENODEV) { FPRINTF(stderr, "WARNING: No OpenCL workers found\n"); return STARPU_TEST_SKIPPED; } nopencl = starpu_opencl_worker_get_count(); if (nopencl == 0) { FPRINTF(stderr, "WARNING: No OpenCL workers found\n"); return STARPU_TEST_SKIPPED; } 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.1.5/tests/main/declare_deps_after_submission.c0000644000373600000000000000515612571536545020272 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #ifdef STARPU_QUICK_CHECK #define NLOOPS 4 #else #define NLOOPS 128 #endif static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .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_init(NULL); 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->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.1.5/tests/main/starpu_task_bundle.c0000644000373600000000000000647612571536545016123 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include "../helper.h" #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}, .nbuffers = 1 }; int main(int argc, char **argv) { int i, j, ret; float 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; } ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); for (i = 0; i < NB_BUNDLE; i++) starpu_variable_data_register(&handles[i], 0, (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"); } ret = starpu_task_bundle_remove(bundles[i], task[NB_ITERATION / 2]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_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_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.1.5/tests/main/deprecated_buffer.c0000644000373600000000000001036212571536545015650 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 cpu_codelet(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { int *valin = (int *)STARPU_VARIABLE_GET_PTR(descr[0]); int *valout = (int *)STARPU_VARIABLE_GET_PTR(descr[1]); *valout = *valin; } struct starpu_codelet cl_with_mode = { .name = "with_mode", .cpu_funcs = {cpu_codelet}, .nbuffers = 2, .modes = {STARPU_R, STARPU_W}, }; struct starpu_codelet cl_without_mode = { .name = "without_mode", .cpu_funcs = {cpu_codelet}, .nbuffers = 2 }; int submit_codelet_insert_task(struct starpu_codelet cl, starpu_data_handle_t handles0, starpu_data_handle_t handles1) { int ret; ret = starpu_insert_task(&cl, STARPU_R, handles0, STARPU_W, handles1, 0); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_insert_task"); starpu_task_wait_for_all(); return 0; } int submit_codelet_with_buffers(struct starpu_codelet cl, starpu_data_handle_t handles0, starpu_data_handle_t handles1) { int ret; struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->buffers[0].handle = handles0; task->buffers[0].mode = STARPU_R; task->buffers[1].handle = handles1; task->buffers[1].mode = STARPU_W; ret = starpu_task_submit(task); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); return 0; } int submit_codelet_with_handles(struct starpu_codelet cl, starpu_data_handle_t handles0, starpu_data_handle_t handles1) { int ret; struct starpu_task *task; task = starpu_task_create(); task->cl = &cl; task->handles[0] = handles0; task->handles[1] = handles1; ret = starpu_task_submit(task); if (ret == -ENODEV) return ret; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); starpu_task_wait_for_all(); return 0; } struct submit_task_func { int (*func)(struct starpu_codelet cl, starpu_data_handle_t handles0, starpu_data_handle_t handles1); char *name; }; int submit_codelet(struct starpu_codelet cl, struct submit_task_func func) { int x=42, y=14; starpu_data_handle_t handles[2]; int ret; starpu_variable_data_register(&handles[0], 0, (uintptr_t)&x, sizeof(x)); starpu_variable_data_register(&handles[1], 0, (uintptr_t)&y, sizeof(y)); ret = func.func(cl, handles[0], handles[1]); starpu_data_unregister(handles[0]); starpu_data_unregister(handles[1]); if (ret == -ENODEV) return ret; FPRINTF(stderr, "%s when executing codelet <%s> with func <%s>\n", x==y?"success":"error", cl.name, func.name); return (x != y); } int main(int argc, char **argv) { int ret; struct submit_task_func insert_task = { .func = submit_codelet_insert_task, .name = "insert_task" }; struct submit_task_func with_buffers = { .func = submit_codelet_with_buffers, .name = "with_buffers" }; struct submit_task_func with_handles = { .func = submit_codelet_with_handles, .name = "with_handles" }; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); ret = submit_codelet(cl_with_mode, insert_task); 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_with_mode, with_buffers); } if (!ret) { ret = submit_codelet(cl_with_mode, with_handles); } if (!ret) { ret = submit_codelet(cl_without_mode, insert_task); } if (!ret) { ret = submit_codelet(cl_without_mode, with_buffers); } // We do not test the combination cl_without_mode with_handles as it is not expected to work starpu_shutdown(); STARPU_RETURN(ret); } starpu-1.1.5/tests/main/starpu_init.c0000644000373600000000000000530412571536545014560 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #if !defined(STARPU_HAVE_UNSETENV) || !defined(STARPU_HAVE_SETENV) || !defined(STARPU_USE_CPU) #warning unsetenv or setenv are not defined. Or CPU are not enabled. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static int check_cpu(int env_cpu, int conf_cpu, int expected_cpu, int *cpu) { int ret; FPRINTF(stderr, "Testing with env=%d - conf=%d\n", env_cpu, conf_cpu); if (env_cpu != -1) { char string[10]; sprintf(string, "%d", env_cpu); setenv("STARPU_NCPUS", string, 1); } struct starpu_conf user_conf; starpu_conf_init(&user_conf); if (conf_cpu != -1) { user_conf.ncpus = conf_cpu; } ret = starpu_init(&user_conf); if (env_cpu != -1) { unsetenv("STARPU_NCPUS"); } if (ret == -ENODEV) { return STARPU_TEST_SKIPPED; } STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); *cpu = starpu_cpu_worker_get_count(); starpu_shutdown(); if (expected_cpu == -1) { FPRINTF(stderr, "Number of CPUS: %3d\n", *cpu); return 0; } else { FPRINTF(stderr, "Number of CPUS: %3d -- Number of expected CPUs: %3d\n", *cpu, expected_cpu); return (*cpu != expected_cpu); } } int main(int argc, char **argv) { int ret; int cpu, cpu_init; int cpu_test1, cpu_test2, cpu_test3; unsetenv("STARPU_NCPUS"); ret = check_cpu(-1, -1, -1, &cpu_init); if (ret) return ret; if (cpu_init <= 1) return STARPU_TEST_SKIPPED; if (cpu_init >= STARPU_MAXCPUS-5) { cpu_test1 = cpu_init-1; cpu_test2 = cpu_init-2; cpu_test3 = cpu_init-3; } else { cpu_test1 = cpu_init+1; cpu_test2 = cpu_init+2; cpu_test3 = cpu_init+3; } ret = check_cpu(cpu_test1, -1, cpu_test1, &cpu); if (ret) return ret; ret = check_cpu(-1, -1, -1, &cpu); if (ret) return ret; if (cpu != cpu_init) { FPRINTF(stderr, "The number of CPUs is incorrect\n"); return 1; } ret = check_cpu(-1, cpu_test2, cpu_test2, &cpu); if (ret) return ret; ret = check_cpu(cpu_test3, cpu_test1, cpu_test3, &cpu); if (ret) return ret; STARPU_RETURN(ret); } #endif starpu-1.1.5/tests/main/empty_task.c0000644000373600000000000000455512571536545014406 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" #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_init(NULL); 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.1.5/tests/main/subgraph_repeat_regenerate.c0000644000373600000000000001164112571536545017574 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 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 = 0; static starpu_pthread_cond_t cond = STARPU_PTHREAD_COND_INITIALIZER; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { (void) STARPU_ATOMIC_ADD(&check_cnt, 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_task_B(void *arg STARPU_ATTRIBUTE_UNUSED) { if (++loop_cntB == niter) taskB.regenerate = 0; } static void callback_task_C(void *arg STARPU_ATTRIBUTE_UNUSED) { if (++loop_cntC == niter) taskC.regenerate = 0; } static void callback_task_D(void *arg STARPU_ATTRIBUTE_UNUSED) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); loop_cntD++; if (loop_cntD == niter) { /* We are done */ taskD.regenerate = 0; STARPU_PTHREAD_COND_SIGNAL(&cond); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } else { int ret; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); /* Let's go for another iteration */ ret = starpu_task_submit(&taskA); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } } int main(int argc, char **argv) { // unsigned i; // double timing; // double start; // double end; int ret; ret = starpu_init(NULL); 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_task_init(&taskA); taskA.cl = &dummy_codelet; taskA.cl_arg = &taskA; taskA.regenerate = 0; /* this task will be explicitely resubmitted if needed */ starpu_task_init(&taskB); taskB.cl = &dummy_codelet; taskB.cl_arg = &taskB; taskB.callback_func = callback_task_B; taskB.regenerate = 1; starpu_task_init(&taskC); taskC.cl = &dummy_codelet; taskC.cl_arg = &taskC; taskC.callback_func = callback_task_C; taskC.regenerate = 1; starpu_task_init(&taskD); taskD.cl = &dummy_codelet; taskD.cl_arg = &taskD; taskD.callback_func = callback_task_D; taskD.regenerate = 1; struct starpu_task *depsBC_array[1] = {&taskA}; starpu_task_declare_deps_array(&taskB, 1, depsBC_array); starpu_task_declare_deps_array(&taskC, 1, depsBC_array); struct starpu_task *depsD_array[2] = {&taskB, &taskC}; starpu_task_declare_deps_array(&taskD, 2, depsD_array); ret = starpu_task_submit(&taskA); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskB); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskC); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); ret = starpu_task_submit(&taskD); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); /* 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_ASSERT(check_cnt == (4*niter)); starpu_shutdown(); /* Cleanup the statically allocated tasks after shutdown, as StarPU is still working on it after the callback */ starpu_task_clean(&taskA); starpu_task_clean(&taskB); starpu_task_clean(&taskC); starpu_task_clean(&taskD); 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.1.5/tests/main/tag_wait_api.c0000644000373600000000000001066012571536545014650 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; static void callback(void *tag) { // fflush(stderr); // FPRINTF(stderr, "Callback for tag %p\n", tag); // fflush(stderr); } static struct starpu_task *create_dummy_task(starpu_tag_t tag) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = callback; task->callback_arg = (void *)tag; task->use_tag = 1; task->tag_id = tag; return task; } #define tagA ((starpu_tag_t)0x42) #define tagB ((starpu_tag_t)0x12300) #define tagC ((starpu_tag_t)0x32) #define tagD ((starpu_tag_t)0x52) #define tagE ((starpu_tag_t)0x19999) #define tagF ((starpu_tag_t)0x2312) #define tagG ((starpu_tag_t)0x1985) #define tagH ((starpu_tag_t)0x32234) #define tagI ((starpu_tag_t)0x5234) #define tagJ ((starpu_tag_t)0x199) #define tagK ((starpu_tag_t)0x231234) #define tagL ((starpu_tag_t)0x2345) int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); 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.1.5/tests/main/multithreaded.c0000644000373600000000000000565012571536545015056 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" starpu_pthread_t threads[16]; #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 64; #else static unsigned ntasks = 65536; #endif static unsigned nthreads = 2; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; void *thread_func(void *arg STARPU_ATTRIBUTE_UNUSED) { int ret; unsigned i; for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->callback_arg = NULL; ret = starpu_task_submit(task); STARPU_ASSERT(!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_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); FPRINTF(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); unsigned t; for (t = 0; t < nthreads; t++) { ret = starpu_pthread_create(&threads[t], NULL, thread_func, NULL); STARPU_ASSERT(ret == 0); } for (t = 0; t < nthreads; t++) { ret = starpu_pthread_join(threads[t], NULL); STARPU_ASSERT(ret == 0); } end = starpu_timing_now(); timing = end - start; FPRINTF(stderr, "Total: %f secs\n", timing/1000000); FPRINTF(stderr, "Per task: %f usecs\n", timing/(nthreads*ntasks)); starpu_shutdown(); return EXIT_SUCCESS; } starpu-1.1.5/tests/errorcheck/0002755000373600000000000000000012571541162013325 500000000000000starpu-1.1.5/tests/errorcheck/invalid_blocking_calls.c0000644000373600000000000000602712571536546020102 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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_NO_ASSERT int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else #define TAG 0x42 static starpu_data_handle_t handle; static unsigned data = 42; static void wrong_func(void *descr[], void *arg) { /* The function is expected to fail. This is indicated in tests/Makefile.am */ /* try to fetch data in the RAM while we are in a codelet, such a * blocking call is forbidden */ starpu_data_acquire(handle, STARPU_RW); starpu_tag_wait(TAG); } static struct starpu_codelet wrong_codelet = { .modes = { STARPU_RW }, .cpu_funcs = {wrong_func}, .cuda_funcs = {wrong_func}, .opencl_funcs = {wrong_func}, .model = NULL, .nbuffers = 0 }; static void wrong_callback(void *arg) { /* The function is expected to fail. This is indicated in tests/Makefile.am */ starpu_data_acquire(handle, STARPU_RW); starpu_tag_wait(TAG); } int main(int argc, char **argv) { int ret; if (RUNNING_ON_VALGRIND) return STARPU_TEST_SKIPPED; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); /* register a piece of data */ starpu_vector_data_register(&handle, 0, (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_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.1.5/tests/errorcheck/starpu_init_noworker.c0000644000373600000000000000357412571536546017721 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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_UNSETENV) #warning unsetenv is not defined. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static void unset_env_variables(void) { (void) unsetenv("STARPU_NCPUS"); (void) unsetenv("STARPU_NCUDA"); (void) unsetenv("STARPU_NOPENCL"); } int main(int argc, char **argv) { int ret; unset_env_variables(); /* We try to initialize StarPU without any worker */ struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 0; conf.ncuda = 0; conf.nopencl = 0; /* starpu_init should return -ENODEV */ ret = starpu_init(&conf); if (ret == -ENODEV) return EXIT_SUCCESS; else { unsigned ncpu = starpu_cpu_worker_get_count(); unsigned ncuda = starpu_cuda_worker_get_count(); unsigned nopencl = starpu_opencl_worker_get_count(); FPRINTF(stderr, "StarPU has found :\n"); FPRINTF(stderr, "\t%u CPU cores\n", ncpu); FPRINTF(stderr, "\t%u CUDA devices\n", ncuda); FPRINTF(stderr, "\t%u OpenCL devices\n", nopencl); return EXIT_FAILURE; } } #endif starpu-1.1.5/tests/errorcheck/invalid_tasks.c0000644000373600000000000000434212571536546016257 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "../helper.h" #include #if !defined(STARPU_HAVE_UNSETENV) || !defined(STARPU_USE_CPU) #warning unsetenv is not defined or no cpu are available. Skipping test int main(int argc, char **argv) { return STARPU_TEST_SKIPPED; } #else static void dummy_func(void *descr[], void *arg) { } static struct starpu_codelet gpu_only_cl = { .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int main(int argc, char **argv) { int ret; /* We force StarPU to use 1 CPU only */ unsetenv("STARPU_NCUDA"); unsetenv("STARPU_NOPENCL"); unsetenv("STARPU_NCPUS"); struct starpu_conf conf; starpu_conf_init(&conf); conf.ncpus = 1; conf.nopencl = 0; conf.ncuda = 0; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); struct starpu_task *task = starpu_task_create(); task->cl = &gpu_only_cl; /* Only a GPU device could execute that task ! */ ret = starpu_task_submit(task); STARPU_ASSERT(ret == -ENODEV); task->destroy = 0; starpu_task_destroy(task); struct starpu_task *task_specific = starpu_task_create(); task_specific->cl = &gpu_only_cl; task_specific->execute_on_a_specific_worker = 1; task_specific->workerid = 0; /* Only a CUDA device could execute that task ! */ ret = starpu_task_submit(task_specific); STARPU_ASSERT(ret == -ENODEV); task_specific->destroy = 0; starpu_task_destroy(task_specific); starpu_shutdown(); return EXIT_SUCCESS; } #endif starpu-1.1.5/tests/microbenchs/0002755000373600000000000000000012571541162013472 500000000000000starpu-1.1.5/tests/microbenchs/redundant_buffer.c0000644000373600000000000000501012571536551017073 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #define N 10000 #define VECTORSIZE 1024 starpu_data_handle_t v_handle; static unsigned *v; static void opencl_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static void cuda_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static void cpu_codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { } static struct starpu_codelet cl = { .cpu_funcs = {cpu_codelet_null}, .cuda_funcs = {cuda_codelet_null}, .opencl_funcs = {opencl_codelet_null}, .nbuffers = 2, .modes = {STARPU_R, STARPU_R} }; int main(int argc, char **argv) { int ret; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_malloc((void **)&v, VECTORSIZE*sizeof(unsigned)); starpu_vector_data_register(&v_handle, 0, (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.1.5/tests/microbenchs/prefetch_data_on_node.c0000644000373600000000000001022712571536551020056 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" #ifdef STARPU_QUICK_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); } static void codelet_null(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { // fprintf(stderr, "pif\n"); // fflush(stderr); } static struct starpu_codelet cl_r = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {codelet_null}, .nbuffers = 1, .modes = {STARPU_R} }; static struct starpu_codelet cl_w = { .cpu_funcs = {codelet_null}, .cuda_funcs = {codelet_null}, .opencl_funcs = {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}, .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_init(NULL); 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, 0, (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; 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->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.1.5/tests/microbenchs/local_pingpong.c0000644000373600000000000000553012571536551016560 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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" 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_init(NULL); 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, 0, (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.1.5/tests/microbenchs/tasks_size_overhead.sh0000755000373600000000000000147112571536551020014 00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010 Université de Bordeaux # Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. #!/bin/sh ROOT=${0%.sh} $ROOT "$@" > tasks_size_overhead.output $ROOT.gp gv tasks_size_overhead.eps starpu-1.1.5/tests/microbenchs/async_tasks_overhead.c0000644000373600000000000001177512571536551017774 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" static unsigned ntasks = 65536; //static unsigned finished = 0; static double cumulated = 0.0; static double cumulated_push = 0.0; static double cumulated_pop = 0.0; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; //static void inject_one_task(void) //{ // struct starpu_task *task = starpu_task_create(); // // task->cl = &dummy_codelet; // task->cl_arg = NULL; // task->detach = 0; // // int ret = starpu_task_submit(task); // STARPU_ASSERT(!ret); //} static void usage(char **argv) { fprintf(stderr, "%s [-i ntasks] [-p sched_policy] [-h]\n", argv[0]); exit(-1); } static void parse_args(int argc, char **argv, struct starpu_conf *conf) { int c; while ((c = getopt(argc, argv, "i:p:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'p': conf->sched_policy_name = optarg; break; case 'h': usage(argv); break; } } int main(int argc, char **argv) { int ret; unsigned i; double timing; double start; double end; struct starpu_conf conf; starpu_conf_init(&conf); parse_args(argc, argv, &conf); ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_profiling_status_set(STARPU_PROFILING_ENABLE); fprintf(stderr, "#tasks : %u\n", ntasks); /* Create an array of tasks */ struct starpu_task **tasks = (struct starpu_task **) malloc(ntasks*sizeof(struct starpu_task *)); for (i = 0; i < ntasks; i++) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->detach = 0; tasks[i] = task; } start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = starpu_task_submit(tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } ret = starpu_task_wait_for_all(); STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_wait_for_all"); end = starpu_timing_now(); /* Read profiling feedback */ for (i = 0; i < ntasks; i++) { struct starpu_profiling_task_info *info; info = tasks[i]->profiling_info; double queued = starpu_timing_timespec_delay_us(&info->push_end_time, &info->pop_end_time); double length = starpu_timing_timespec_delay_us(&info->submit_time, &info->end_time); double push_duration = starpu_timing_timespec_delay_us(&info->push_start_time, &info->push_end_time); double pop_duration = starpu_timing_timespec_delay_us(&info->pop_start_time, &info->pop_end_time); starpu_task_destroy(tasks[i]); cumulated += (length - queued); cumulated_push += push_duration; cumulated_pop += pop_duration; } timing = end - start; fprintf(stderr, "Total: %f secs\n", timing/1000000); fprintf(stderr, "Per task: %f usecs\n", timing/ntasks); fprintf(stderr, "Per task (except scheduler): %f usecs\n", cumulated/ntasks); fprintf(stderr, "Per task (push): %f usecs\n", cumulated_push/ntasks); fprintf(stderr, "Per task (pop): %f usecs\n", cumulated_pop/ntasks); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; sprintf(file, "%s/async_tasks_overhead_total.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); sprintf(file, "%s/async_tasks_overhead_per_task.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ntasks); fclose(f); } } starpu_shutdown(); free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/microbenchs/tasks_overhead.c0000644000373600000000000001532112571536551016566 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" starpu_data_handle_t data_handles[8]; float *buffers[8]; #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 128; #else static unsigned ntasks = 65536; #endif static unsigned nbuffers = 0; struct starpu_task *tasks; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0, .modes = {STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW, STARPU_RW} }; int inject_one_task(void) { struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->synchronous = 1; int ret; ret = starpu_task_submit(task); return ret; } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:b:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); dummy_codelet.nbuffers = nbuffers; break; case 'h': fprintf(stderr, "Usage: %s [-i ntasks] [-b nbuffers] [-h]\n", argv[0]); break; } } int main(int argc, char **argv) { int ret; unsigned i; double timing_submit; double start_submit; double end_submit; double timing_exec; double start_exec; double end_exec; parse_args(argc, argv); ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { buffers[buffer] = (float *) malloc(16*sizeof(float)); starpu_vector_data_register(&data_handles[buffer], 0, (uintptr_t)buffers[buffer], 16, sizeof(float)); } fprintf(stderr, "#tasks : %u\n#buffers : %u\n", ntasks, nbuffers); /* submit tasks (but don't execute them yet !) */ tasks = (struct starpu_task *) calloc(1, ntasks*sizeof(struct starpu_task)); start_submit = starpu_timing_now(); for (i = 0; i < ntasks; i++) { starpu_task_init(&tasks[i]); tasks[i].callback_func = NULL; tasks[i].cl = &dummy_codelet; tasks[i].cl_arg = NULL; tasks[i].synchronous = 0; tasks[i].use_tag = 1; tasks[i].tag_id = (starpu_tag_t)i; /* we have 8 buffers at most */ for (buffer = 0; buffer < nbuffers; buffer++) { tasks[i].handles[buffer] = data_handles[buffer]; } } tasks[ntasks-1].detach = 0; start_submit = starpu_timing_now(); for (i = 1; i < ntasks; i++) { starpu_tag_declare_deps((starpu_tag_t)i, 1, (starpu_tag_t)(i-1)); ret = starpu_task_submit(&tasks[i]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } /* submit the first task */ ret = starpu_task_submit(&tasks[0]); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); end_submit = starpu_timing_now(); /* wait for the execution of the tasks */ start_exec = starpu_timing_now(); ret = starpu_task_wait(&tasks[ntasks-1]); STARPU_CHECK_RETURN_VALUE(ret, "starpu_tag_wait"); end_exec = starpu_timing_now(); starpu_task_wait_for_all(); for (i = 0; i < ntasks; i++) starpu_task_clean(&tasks[i]); for (buffer = 0; buffer < nbuffers; buffer++) starpu_data_unregister(data_handles[buffer]); timing_submit = end_submit - start_submit; timing_exec = end_exec - start_exec; fprintf(stderr, "Total submit: %f secs\n", timing_submit/1000000); fprintf(stderr, "Per task submit: %f usecs\n", timing_submit/ntasks); fprintf(stderr, "\n"); fprintf(stderr, "Total execution: %f secs\n", timing_exec/1000000); fprintf(stderr, "Per task execution: %f usecs\n", timing_exec/ntasks); fprintf(stderr, "\n"); fprintf(stderr, "Total: %f secs\n", (timing_submit+timing_exec)/1000000); fprintf(stderr, "Per task: %f usecs\n", (timing_submit+timing_exec)/ntasks); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; sprintf(file, "%s/tasks_overhead_total_submit.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_submit/1000000); fclose(f); sprintf(file, "%s/tasks_overhead_per_task_submit.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_submit/ntasks); fclose(f); sprintf(file, "%s/tasks_overhead_total_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_exec/1000000); fclose(f); sprintf(file, "%s/tasks_overhead_per_task_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing_exec/ntasks); fclose(f); sprintf(file, "%s/tasks_overhead_total_submit_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, (timing_submit+timing_exec)/1000000); fclose(f); sprintf(file, "%s/tasks_overhead_per_task_submit_execution.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, (timing_submit+timing_exec)/ntasks); fclose(f); } } starpu_shutdown(); free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/microbenchs/tasks_size_overhead.c0000644000373600000000000001314212571536551017617 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 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. */ #include #include #include #include "../helper.h" #define START 4 #define STOP 4096 #ifdef STARPU_QUICK_CHECK #define FACTOR 8 #else #define FACTOR 2 #endif starpu_data_handle_t data_handles[8]; float *buffers[8]; #ifdef STARPU_QUICK_CHECK static unsigned ntasks = 10; #else static unsigned ntasks = 1000; #endif static unsigned nbuffers = 0; struct starpu_task *tasks; static void func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg) { double tv1, tv2; unsigned n = (uintptr_t)arg; long usec = 0; tv1 = starpu_timing_now(); do { tv2 = starpu_timing_now(); usec = tv2 - tv1; } while (usec < n); } 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} }; static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:b:h")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; case 'b': nbuffers = atoi(optarg); codelet.nbuffers = nbuffers; break; case 'h': fprintf(stderr, "Usage: %s [-i ntasks] [-b nbuffers] [-h]\n", argv[0]); break; } } int main(int argc, char **argv) { int ret; unsigned i; unsigned size; unsigned totcpus, ncpus; double timing; double start; double end; struct starpu_conf conf; unsigned buffer; parse_args(argc, argv); /* Get number of CPUs */ starpu_conf_init(&conf); conf.ncuda = 0; conf.nopencl = 0; ret = starpu_init(&conf); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); totcpus = starpu_worker_get_count_by_type(STARPU_CPU_WORKER); starpu_shutdown(); /* Allocate data */ for (buffer = 0; buffer < nbuffers; buffer++) buffers[buffer] = (float *) malloc(16*sizeof(float)); tasks = (struct starpu_task *) calloc(1, ntasks*sizeof(struct starpu_task)); /* Emit headers and compute raw tasks speed */ FPRINTF(stdout, "# tasks : %u buffers : %u\n", ntasks, nbuffers); FPRINTF(stdout, "# ncpus\t"); for (size = START; size <= STOP; size *= FACTOR) FPRINTF(stdout, "%u iters(us)\ttotal(s)\t", size); FPRINTF(stdout, "\n"); FPRINTF(stdout, "\"seq\"\t"); for (size = START; size <= STOP; size *= FACTOR) { 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); /* For each number of cpus, benchmark */ for (ncpus= 1; ncpus <= totcpus; ncpus++) { 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 < nbuffers; buffer++) starpu_vector_data_register(&data_handles[buffer], 0, (uintptr_t)buffers[buffer], 16, sizeof(float)); for (size = START; size <= STOP; size *= FACTOR) { /* submit tasks */ start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { 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; /* we have 8 buffers at most */ for (buffer = 0; buffer < nbuffers; buffer++) { tasks[i].handles[buffer] = data_handles[buffer]; } 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; i++) starpu_task_clean(&tasks[i]); timing = end - start; FPRINTF(stdout, "%u\t%f\t", size, timing/1000000); fflush(stdout); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; sprintf(file, "%s/tasks_size_overhead_total.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); } } } for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_unregister(data_handles[buffer]); } starpu_shutdown(); FPRINTF(stdout, "\n"); fflush(stdout); } free(tasks); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); free(tasks); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/microbenchs/matrix_as_vector.c0000644000373600000000000001451712571536551017143 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 #define LOOPS 100 void vector_cpu_func(void *descr[], void *cl_arg STARPU_ATTRIBUTE_UNUSED) { STARPU_SKIP_IF_VALGRIND; float *matrix = (float *)STARPU_VECTOR_GET_PTR(descr[0]); int nx = STARPU_VECTOR_GET_NX(descr[0]); int i; float sum=0; for(i=0 ; i mean=%7f != %7f\n", nx, matrix[0], mean); ret = EXIT_FAILURE; } end: starpu_free(matrix); return ret; } #define NX_MIN 1024 #define NX_MAX 1024*1024 int check_size_on_device(uint32_t where, char *device_name) { int nx, ret; struct starpu_codelet vector_codelet; struct starpu_codelet matrix_codelet; fprintf(stderr, "# Device: %s\n", device_name); fprintf(stderr, "# nx vector_timing matrix_timing\n"); starpu_codelet_init(&vector_codelet); vector_codelet.modes[0] = STARPU_RW; vector_codelet.nbuffers = 1; if (where == STARPU_CPU) vector_codelet.cpu_funcs[0] = vector_cpu_func; if (where == STARPU_CUDA) vector_codelet.cuda_funcs[0] = vector_cuda_func; // if (where == STARPU_OPENCL) vector_codelet.opencl_funcs[0] = vector_opencl_func; starpu_codelet_init(&matrix_codelet); matrix_codelet.modes[0] = STARPU_RW; matrix_codelet.nbuffers = 1; if (where == STARPU_CPU) matrix_codelet.cpu_funcs[0] = matrix_cpu_func; if (where == STARPU_CUDA) matrix_codelet.cuda_funcs[0] = matrix_cuda_func; // if (where == STARPU_OPENCL) matrix_codelet.opencl_funcs[0] = matrix_opencl_func; for(nx=NX_MIN ; nx<=NX_MAX ; nx*=2) { ret = check_size(nx, &vector_codelet, &matrix_codelet, device_name); if (ret != EXIT_SUCCESS) break; } return ret; } int main(int argc, char **argv) { int ret; unsigned devices; ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); starpu_cublas_init(); devices = starpu_cpu_worker_get_count(); if (devices) { ret = check_size_on_device(STARPU_CPU, "STARPU_CPU"); if (ret) goto error; } devices = starpu_cuda_worker_get_count(); if (devices) { ret = check_size_on_device(STARPU_CUDA, "STARPU_CUDA"); if (ret) goto error; } devices = starpu_opencl_worker_get_count(); if (devices) { ret = check_size_on_device(STARPU_OPENCL, "STARPU_OPENCL"); if (ret) goto error; } error: if (ret == -ENODEV) ret=STARPU_TEST_SKIPPED; starpu_cublas_shutdown(); starpu_shutdown(); STARPU_RETURN(ret); } starpu-1.1.5/tests/microbenchs/tasks_size_overhead.gp0000755000373600000000000000430712571536551020011 00000000000000#!/bin/sh # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2010 Université de Bordeaux # Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. #!/bin/sh OUTPUT=tasks_size_overhead.output VALS=$(sed -n -e '3p' < $OUTPUT) VAL1=$(echo "$VALS" | cut -d ' ' -f 3) VAL2=$(echo "$VALS" | cut -d ' ' -f 5) VAL3=$(echo "$VALS" | cut -d ' ' -f 7) VAL4=$(echo "$VALS" | cut -d ' ' -f 9) VAL5=$(echo "$VALS" | cut -d ' ' -f 11) VAL6=$(echo "$VALS" | cut -d ' ' -f 13) VAL7=$(echo "$VALS" | cut -d ' ' -f 15) VAL8=$(echo "$VALS" | cut -d ' ' -f 17) VAL9=$(echo "$VALS" | cut -d ' ' -f 19) VAL10=$(echo "$VALS" | cut -d ' ' -f 21) VAL11=$(echo "$VALS" | cut -d ' ' -f 23) gnuplot << EOF set terminal eps set output "tasks_size_overhead.eps" set key top left set xlabel "number of cores" set ylabel "speedup" plot \ "$OUTPUT" using 1:($VAL1)/(\$3) with linespoints title columnheader(2), \ "$OUTPUT" using 1:($VAL2)/(\$5) with linespoints title columnheader(4), \ "$OUTPUT" using 1:($VAL3)/(\$7) with linespoints title columnheader(6), \ "$OUTPUT" using 1:($VAL4)/(\$9) with linespoints title columnheader(8), \ "$OUTPUT" using 1:($VAL5)/(\$11) with linespoints title columnheader(10), \ "$OUTPUT" using 1:($VAL6)/(\$13) with linespoints title columnheader(12), \ "$OUTPUT" using 1:($VAL7)/(\$15) with linespoints title columnheader(14), \ "$OUTPUT" using 1:($VAL8)/(\$17) with linespoints title columnheader(16), \ "$OUTPUT" using 1:($VAL9)/(\$19) with linespoints title columnheader(18), \ "$OUTPUT" using 1:($VAL10)/(\$21) with linespoints title columnheader(20), \ "$OUTPUT" using 1:($VAL11)/(\$23) with linespoints title columnheader(22), \ x title "linear" EOF starpu-1.1.5/tests/microbenchs/sync_tasks_overhead.c0000644000373600000000000000640312571536551017623 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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" static unsigned ntasks = 65536; static void dummy_func(void *descr[] STARPU_ATTRIBUTE_UNUSED, void *arg STARPU_ATTRIBUTE_UNUSED) { } static struct starpu_codelet dummy_codelet = { .cpu_funcs = {dummy_func}, .cuda_funcs = {dummy_func}, .opencl_funcs = {dummy_func}, .model = NULL, .nbuffers = 0 }; int inject_one_task(void) { int ret; struct starpu_task *task = starpu_task_create(); task->cl = &dummy_codelet; task->cl_arg = NULL; task->callback_func = NULL; task->synchronous = 1; ret = starpu_task_submit(task); return ret; } static void parse_args(int argc, char **argv) { int c; while ((c = getopt(argc, argv, "i:")) != -1) switch(c) { case 'i': ntasks = atoi(optarg); break; } } int main(int argc, char **argv) { int ret; unsigned i; double timing; double start; double end; #ifdef STARPU_QUICK_CHECK ntasks = 128; #endif parse_args(argc, argv); ret = starpu_init(NULL); if (ret == -ENODEV) return STARPU_TEST_SKIPPED; STARPU_CHECK_RETURN_VALUE(ret, "starpu_init"); fprintf(stderr, "#tasks : %u\n", ntasks); start = starpu_timing_now(); for (i = 0; i < ntasks; i++) { ret = inject_one_task(); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } end = starpu_timing_now(); timing = end - start; fprintf(stderr, "Total: %f secs\n", timing/1000000); fprintf(stderr, "Per task: %f usecs\n", timing/ntasks); { char *output_dir = getenv("STARPU_BENCH_DIR"); char *bench_id = getenv("STARPU_BENCH_ID"); if (output_dir && bench_id) { char file[1024]; FILE *f; sprintf(file, "%s/sync_tasks_overhead_total.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/1000000); fclose(f); sprintf(file, "%s/sync_tasks_overhead_per_task.dat", output_dir); f = fopen(file, "a"); fprintf(f, "%s\t%f\n", bench_id, timing/ntasks); fclose(f); } } starpu_shutdown(); return EXIT_SUCCESS; enodev: fprintf(stderr, "WARNING: No one can execute this task\n"); /* yes, we do not perform the computation but we did detect that no one * could perform the kernel, so this is not an error from StarPU */ starpu_shutdown(); return STARPU_TEST_SKIPPED; } starpu-1.1.5/tests/helper.h0000644000373600000000000000627012571536542012557 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef _TESTS_HELPER_H #define _TESTS_HELPER_H #include #include #ifdef 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_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 #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 #endif /* _TESTS_HELPER_H */ starpu-1.1.5/tests/overlap/0002755000373600000000000000000012571541162012646 500000000000000starpu-1.1.5/tests/overlap/overlap.c0000644000373600000000000000730412571536542014412 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 #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) { ANNOTATE_HAPPENS_BEFORE(&cnt); unsigned res = STARPU_ATOMIC_ADD(&cnt, -1); 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 codelet_sleep(void *descr[], STARPU_ATTRIBUTE_UNUSED void *_args) { STARPU_SKIP_IF_VALGRIND; usleep(TASKDURATION); } static struct starpu_perfmodel model = { .type = STARPU_HISTORY_BASED, .symbol = NULL /* to be defined later */ }; static struct starpu_codelet cl = { .cpu_funcs = {codelet_sleep}, .cuda_funcs = {codelet_sleep}, .opencl_funcs = {codelet_sleep}, .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_init(NULL); 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, 0, (uintptr_t)buffer, NTASKS*VECTORSIZE, sizeof(char)); struct starpu_data_filter f = { .filter_func = starpu_vector_filter_block, .nchildren = NTASKS }; starpu_data_partition(handle, &f); snprintf(symbolname, 128, "overlap_sleep_%d_%u", VECTORSIZE, TASKDURATION); model.symbol = symbolname; unsigned iter; for (iter = 0; iter < NTASKS; iter++) { struct starpu_task *task = starpu_task_create(); task->cl = &cl; task->handles[0] = starpu_data_get_sub_data(handle, 1, iter); task->callback_func = callback; task->callback_arg = NULL; ret = starpu_task_submit(task); if (ret == -ENODEV) goto enodev; STARPU_CHECK_RETURN_VALUE(ret, "starpu_task_submit"); } STARPU_PTHREAD_MUTEX_LOCK(&mutex); if (!finished) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); starpu_data_unpartition(handle, 0); 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.1.5/STARPU-VERSION0000644000373600000000000000365212571536542012052 00000000000000# -*- sh -*- # Versioning (SONAMEs) for StarPU libraries. # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info # Here are a set of rules to help you update your library version information: # Start with version information of ‘0:0:0’ for each libtool library. # Update the version information only immediately before a public # release of your software. More frequent updates are unnecessary, and # only guarantee that the current interface number gets larger faster. # - If the library source code has changed at all since the last # update, then increment revision (‘c:r:a’ becomes ‘c:r+1:a’). # - If any interfaces have been added, removed, or changed since the # last update, increment current, and set revision to 0. # - If any interfaces have been added since the last public release, # then increment age. # - If any interfaces have been removed or changed since the last # public release, then set age to 0. change # This is the tarball version, major.minor STARPU_EFFECTIVE_VERSION=1.1 # Note for StarPU 1.1: we have changed ABI # Libtool interface versioning (info "(libtool) Versioning"). LIBSTARPU_INTERFACE_CURRENT=9 # increment upon ABI change LIBSTARPU_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPU_INTERFACE_AGE=1 # set to CURRENT - PREVIOUS interface LIBSTARPUFFT_INTERFACE_CURRENT=2 # increment upon ABI change LIBSTARPUFFT_INTERFACE_REVISION=0 # increment upon implementation change LIBSTARPUFFT_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSTARPUMPI_INTERFACE_CURRENT=2 # increment upon ABI change LIBSTARPUMPI_INTERFACE_REVISION=4 # increment upon implementation change LIBSTARPUMPI_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface LIBSOCL_INTERFACE_CURRENT=1 # increment upon ABI change LIBSOCL_INTERFACE_REVISION=2 # increment upon implementation change LIBSOCL_INTERFACE_AGE=0 # set to CURRENT - PREVIOUS interface starpu-1.1.5/configure0000755000373600000000000417446012571536627011713 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for StarPU 1.1.5. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: starpu-devel@lists.gforge.inria.fr about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='StarPU' PACKAGE_TARNAME='starpu' PACKAGE_VERSION='1.1.5' PACKAGE_STRING='StarPU 1.1.5' PACKAGE_BUGREPORT='starpu-devel@lists.gforge.inria.fr' PACKAGE_URL='http://runtime.bordeaux.inria.fr/StarPU/' ac_unique_file="include/starpu.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS STARPU_SANITIZE_FALSE STARPU_SANITIZE_TRUE SOCL_VENDORS LIBSTARPU_LINK LIBSTARPU_LDFLAGS BUILD_DOC_FALSE BUILD_DOC_TRUE epstopdfcommand pdflatexcommand doxygencommand STARPU_HAVE_AM111_FALSE STARPU_HAVE_AM111_TRUE STARPU_HAVE_HELP2MAN_FALSE STARPU_HAVE_HELP2MAN_TRUE HELP2MAN STARPU_HAVE_ICC_FALSE STARPU_HAVE_ICC_TRUE STARPU_HAVE_FC_FALSE STARPU_HAVE_FC_TRUE ICC STARPU_HAVE_F77_H_FALSE STARPU_HAVE_F77_H_TRUE STARPU_HAVE_F77_H HWLOC_REQUIRES STARPU_HAVE_HWLOC HWLOC_LIBS HWLOC_CFLAGS BUILD_STARPUFFT_EXAMPLES_FALSE BUILD_STARPUFFT_EXAMPLES_TRUE BUILD_STARPUFFT_FALSE BUILD_STARPUFFT_TRUE STARPU_HAVE_FFTWL_FALSE STARPU_HAVE_FFTWL_TRUE HAVE_FFTWFL FFTWL_LIBS FFTWL_CFLAGS STARPU_HAVE_FFTWF_FALSE STARPU_HAVE_FFTWF_TRUE STARPU_HAVE_FFTWF FFTWF_LIBS FFTWF_CFLAGS STARPU_HAVE_FFTW_FALSE STARPU_HAVE_FFTW_TRUE STARPU_HAVE_FFTW FFTW_LIBS FFTW_CFLAGS BLAS_LIB NO_BLAS_LIB_FALSE NO_BLAS_LIB_TRUE SYSTEM_BLAS_LIB_FALSE SYSTEM_BLAS_LIB_TRUE MKL_BLAS_LIB_FALSE MKL_BLAS_LIB_TRUE GOTO_BLAS_LIB_FALSE GOTO_BLAS_LIB_TRUE ATLAS_BLAS_LIB_FALSE ATLAS_BLAS_LIB_TRUE BLAS_LIBS ATLASDIR STARPU_BLAS_LDFLAGS GOTODIR HAVE_X11_FALSE HAVE_X11_TRUE X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF HAVE_OPENGL_FALSE HAVE_OPENGL_TRUE STARPU_OPENGL_RENDER STARPU_OPENGL_RENDER_LDFLAGS BUILD_EXAMPLES_FALSE BUILD_EXAMPLES_TRUE GDB SOCL_OCL_LIB_OPENCL_DIR STARPU_USE_SOCL_FALSE STARPU_USE_SOCL_TRUE BUILD_SOCL_FALSE BUILD_SOCL_TRUE RUN_GCC_PLUGIN_TESTS_FALSE RUN_GCC_PLUGIN_TESTS_TRUE BUILD_GCC_PLUGIN_FALSE BUILD_GCC_PLUGIN_TRUE YACC GUILE HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE GCC_PLUGIN_PKGCONFIG GCC_PLUGIN_DIR_PKGCONFIG gccplugindir STARPU_GCC_VERSION_MINOR STARPU_GCC_VERSION_MAJOR GCC_PLUGIN_INCLUDE_DIR GCC_FOR_PLUGIN_LIBTOOL_TAG GCC_FOR_PLUGIN pkglibdir GLOBAL_AM_CFLAGS STARPU_DEVEL_FALSE STARPU_DEVEL_TRUE BUILD_STARPU_TOP_FALSE BUILD_STARPU_TOP_TRUE STARPU_USE_TOP QWT_PRI STARPU_QWT_LDFLAGS STARPU_QWT_INCLUDE QMAKE USE_MPI_FALSE USE_MPI_TRUE USE_MPI MPIEXEC STARPU_MPI_CHECK_FALSE STARPU_MPI_CHECK_TRUE mpiexec_path CC_OR_MPICC MPICC_LDFLAGS MPICC mpicc_path STARPU_GLPK_LDFLAGS STARPU_ENABLE_STATS STATS STARPU_PERF_DEBUG POTI_LIBS POTI_CFLAGS FXT_LDFLAGS FXT_LIBS FXT_CFLAGS STARPU_USE_FXT_FALSE STARPU_USE_FXT_TRUE STARPU_USE_FXT FXTDIR STARPU_COVERAGE_ENABLED_FALSE STARPU_COVERAGE_ENABLED_TRUE COVERAGE SIMGRID_LIBS SIMGRID_CFLAGS STARPU_SIMGRID_FALSE STARPU_SIMGRID_TRUE STARPU_OPENCL_LDFLAGS STARPU_OPENCL_CPPFLAGS STARPU_OPENCL_DATAdir STARPU_USE_OPENCL_FALSE STARPU_USE_OPENCL_TRUE STARPU_USE_OPENCL STARPU_CUDA_CPPFLAGS STARPU_CUFFT_LDFLAGS STARPU_CUDA_LDFLAGS STARPU_CURAND_LDFLAGS STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE STARPU_HAVE_MAGMA_FALSE STARPU_HAVE_MAGMA_TRUE STARPU_HAVE_MAGMA MAGMA_LIBS MAGMA_CFLAGS PKG_CONFIG NVCCFLAGS 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_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_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_HAVE_WINDOWS_FALSE STARPU_HAVE_WINDOWS_TRUE STARPU_HAVE_MS_LIB_FALSE STARPU_HAVE_MS_LIB_TRUE STARPU_MS_LIB svnversioncommand svncommand BASH CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP LIBTOOL OBJDUMP DLLTOOL AS ac_ct_FC FCFLAGS FC ac_ct_F77 FFLAGS F77 LN_S SED CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_ct_AR AR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBSOCL_INTERFACE_AGE LIBSOCL_INTERFACE_REVISION LIBSOCL_INTERFACE_CURRENT LIBSTARPUFFT_INTERFACE_AGE LIBSTARPUFFT_INTERFACE_REVISION LIBSTARPUFFT_INTERFACE_CURRENT LIBSTARPUMPI_INTERFACE_AGE LIBSTARPUMPI_INTERFACE_REVISION LIBSTARPUMPI_INTERFACE_CURRENT LIBSTARPU_INTERFACE_AGE LIBSTARPU_INTERFACE_REVISION LIBSTARPU_INTERFACE_CURRENT STARPU_EFFECTIVE_VERSION STARPU_RELEASE_VERSION STARPU_MINOR_VERSION STARPU_MAJOR_VERSION target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_native_winthreads enable_default_drand48 enable_quick_check enable_long_check enable_valgrind enable_max_sched_ctxs enable_sc_hypervisor 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_opencl_simulator with_simgrid_dir with_simgrid_include_dir with_simgrid_lib_dir enable_simgrid enable_blocking_drivers enable_debug enable_spinlock_check enable_fast enable_verbose enable_coverage with_fxt enable_perf_debug enable_model_debug enable_stats enable_memory_stats enable_maxbuffers enable_allocation_cache with_perf_model_dir enable_maximplementations with_mpicc enable_mpi_check with_mpiexec enable_mpi_progression_hook enable_starpu_top with_qwt_include_dir with_qwt_lib_dir with_qwt_lib enable_gcc_extensions enable_socl enable_build_examples enable_opengl_render with_x enable_blas_lib with_goto_dir with_atlas_dir with_mkl_cflags with_mkl_ldflags enable_starpufft enable_starpufft_examples with_hwloc enable_build_doc ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP F77 FFLAGS FC FCFLAGS CXXCPP STARPU_MS_LIB PKG_CONFIG MAGMA_CFLAGS MAGMA_LIBS NVCC NVCCFLAGS FXT_CFLAGS FXT_LIBS FXT_LDFLAGS POTI_CFLAGS POTI_LIBS XMKMF BLAS_LIBS FFTW_CFLAGS FFTW_LIBS FFTWF_CFLAGS FFTWF_LIBS FFTWL_CFLAGS FFTWL_LIBS HWLOC_CFLAGS HWLOC_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures StarPU 1.1.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/starpu] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of StarPU 1.1.5:";; 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-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-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 --disable-valgrind Do not check the availability of valgrind.h and helgrind.h --enable-max-sched-ctxs= maximum number of sched_ctxs --enable-sc-hypervisor enable resizing contexts (experimental) --enable-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 --enable-opencl-simulator Enable the use of an OpenCL simulator --enable-simgrid Enable simulating execution in simgrid --enable-blocking-drivers enable blocking drivers --enable-debug enable debug mode --enable-spinlock-check enable spinlock check --enable-fast do not enforce assertions --enable-verbose display verbose debug messages --enable-coverage enable coverage checking --enable-perf-debug enable performance debugging through gprof --enable-model-debug enable performance model debugging --enable-stats enable statistics --enable-memory-stats enable memory stats --enable-maxbuffers= maximum number of buffers per task --disable-allocation-cache disable data allocation cache --enable-maximplementations= maximum number of implementations --enable-mpi-check Enable execution of MPI testcases --enable-mpi-progression-hook Enable StarPU MPI activity polling method --disable-starpu-top build StarPU-Top --enable-gcc-extensions build the GCC plug-in that provides C language extensions (experimental) --enable-socl build the OpenCL interface (experimental) --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 --disable-starpufft Disable build of StarPU-FFT --enable-starpufft-examples disable execution of StarPU FFT examples --disable-build-doc disable building of documentation Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-cuda-dir= specify CUDA installation directory --with-cuda-include-dir= specify where CUDA headers are installed --with-cuda-lib-dir= specify where CUDA libraries are installed --with-opencl-dir= specify OpenCL installation directory --with-opencl-include-dir= specify where OpenCL headers are installed --with-opencl-lib-dir= specify where OpenCL libraries are installed --with-simgrid-dir= specify SimGrid installation directory --with-simgrid-include-dir= specify where SimGrid headers are installed --with-simgrid-lib-dir= specify where SimGrid libraries are installed --with-fxt= generate fxt traces --with-perf-model-dir= specify where performance models should be stored --with-mpicc= Path of the mpicc compiler --with-mpiexec= Path of mpiexec --with-qwt-include-dir= specify installed libqwt include path --with-qwt-lib-dir= specify installed libqwt library path --with-qwt-lib= specify installed libqwt library name --with-x use the X Window System --with-goto-dir= specify GotoBLAS lib location --with-atlas-dir= specify ATLAS lib location --with-mkl-cflags specify MKL compilation flags --with-mkl-ldflags specify MKL linking flags --without-hwloc Disable hwloc (enabled by default) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CXXCPP C++ preprocessor STARPU_MS_LIB Path to Microsoft's Visual Studio `lib' tool PKG_CONFIG path to pkg-config utility MAGMA_CFLAGS C compiler flags for MAGMA, overriding pkg-config MAGMA_LIBS linker flags for MAGMA, overriding pkg-config NVCC CUDA compiler NVCCFLAGS CUDA compiler flags FXT_CFLAGS C compiler flags for FXT, overriding pkg-config FXT_LIBS linker flags for FXT, overriding pkg-config FXT_LDFLAGS POTI_CFLAGS C compiler flags for POTI, overriding pkg-config POTI_LIBS linker flags for POTI, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System BLAS_LIBS linker flags for blas FFTW_CFLAGS C compiler flags for FFTW, overriding pkg-config FFTW_LIBS linker flags for FFTW, overriding pkg-config FFTWF_CFLAGS C compiler flags for FFTWF, overriding pkg-config FFTWF_LIBS linker flags for FFTWF, overriding pkg-config FFTWL_CFLAGS C compiler flags for FFTWL, overriding pkg-config FFTWL_LIBS linker flags for FFTWL, overriding pkg-config HWLOC_CFLAGS C compiler flags for HWLOC, overriding pkg-config HWLOC_LIBS linker flags for HWLOC, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . StarPU home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF StarPU configure 1.1.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_compile # ac_fn_fc_try_compile LINENO # --------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_f77_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_link # ac_fn_fc_try_link LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_fc_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_fc_try_link # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 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_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@lists.gforge.inria.fr ## ## ------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_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_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.1.5, 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.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != 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.1.5' 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. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 $as_echo "$F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_F77+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 $as_echo "$ac_ct_F77" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } if ${ac_cv_f77_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 $as_echo "$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 $as_echo_n "checking whether $F77 accepts -g... " >&6; } if ${ac_cv_prog_f77_g+:} false; then : $as_echo_n "(cached) " >&6 else FFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO"; then : ac_cv_prog_f77_g=yes else ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 $as_echo "$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi if test $ac_compiler_gnu = yes; then G77=yes else G77= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$FC"; then ac_cv_prog_FC="$FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_FC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi FC=$ac_cv_prog_FC if test -n "$FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 $as_echo "$FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$FC" && break done fi if test -z "$FC"; then ac_ct_FC=$FC for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_FC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_FC"; then ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_FC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_FC=$ac_cv_prog_ac_ct_FC if test -n "$ac_ct_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 $as_echo "$ac_ct_FC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_FC" && break done if test "x$ac_ct_FC" = x; then FC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac FC=$ac_ct_FC fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5 $as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; } if ${ac_cv_fc_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_fc_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 $as_echo "$ac_cv_fc_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+set} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 $as_echo_n "checking whether $FC accepts -g... " >&6; } if ${ac_cv_prog_fc_g+:} false; then : $as_echo_n "(cached) " >&6 else FCFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_compile "$LINENO"; then : ac_cv_prog_fc_g=yes else ac_cv_prog_fc_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5 $as_echo "$ac_cv_prog_fc_g" >&6; } if test "$ac_test_FCFLAGS" = set; then FCFLAGS=$ac_save_FCFLAGS elif test $ac_cv_prog_fc_g = yes; then if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-g -O2" else FCFLAGS="-g" fi else if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-O2" else FCFLAGS= fi fi if test $ac_compiler_gnu = yes; then GFC=yes else GFC= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no inherit_rpath_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds reload_flag_F77=$reload_flag reload_cmds_F77=$reload_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` GCC=$G77 if test -n "$compiler"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } GCC_F77="$G77" LD_F77="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_F77='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_F77= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_F77='-Xlinker ' if test -n "$lt_prog_compiler_pic_F77"; then lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='--shared' lt_prog_compiler_static_F77='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-qpic' lt_prog_compiler_static_F77='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 $as_echo "$lt_cv_prog_compiler_pic_F77" >&6; } lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } if ${lt_cv_prog_compiler_pic_works_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 $as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_F77+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 $as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_F77= always_export_symbols_F77=no archive_cmds_F77= archive_expsym_cmds_F77= compiler_needs_object_F77=no enable_shared_with_static_runtimes_F77=no export_dynamic_flag_spec_F77= export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_F77=no hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported inherit_rpath_F77=no link_all_deplibs_F77=unknown module_cmds_F77= module_expsym_cmds_F77= old_archive_from_new_cmds_F77= old_archive_from_expsyms_cmds_F77= thread_safe_flag_spec_F77= whole_archive_flag_spec_F77= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_F77=no ;; esac ld_shlibs_F77=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' export_dynamic_flag_spec_F77='${wl}--export-all-symbols' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; haiku*) archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_F77=yes ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_F77= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_F77=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_F77=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_F77=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes file_list_spec_F77='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs_F77=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_F77='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__F77+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__F77+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_F77='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' fi archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes file_list_spec_F77='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' enable_shared_with_static_runtimes_F77=yes exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_F77='chmod 644 $oldlib' postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_F77=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_F77=yes else whole_archive_flag_spec_F77='' fi link_all_deplibs_F77=yes allow_undefined_flag_F77="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs_F77=no fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: inherit_rpath_F77=yes link_all_deplibs_F77=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no hardcode_direct_absolute_F77=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi archive_cmds_need_lc_F77='no' hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds_F77='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-R,$libdir' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_F77='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 $as_echo "$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no with_gnu_ld_F77=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_F77+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_F77=no else lt_cv_archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; } archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || test -n "$runpath_var_F77" || test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 $as_echo "$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink || test "$inherit_rpath_F77" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi archive_cmds_need_lc_FC=no allow_undefined_flag_FC= always_export_symbols_FC=no archive_expsym_cmds_FC= export_dynamic_flag_spec_FC= hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_automatic_FC=no inherit_rpath_FC=no module_cmds_FC= module_expsym_cmds_FC= link_all_deplibs_FC=unknown old_archive_cmds_FC=$old_archive_cmds reload_flag_FC=$reload_flag reload_cmds_FC=$reload_cmds no_undefined_flag_FC= whole_archive_flag_spec_FC= enable_shared_with_static_runtimes_FC=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o objext_FC=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu compiler_FC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } GCC_FC="$ac_cv_fc_compiler_gnu" LD_FC="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_FC= postdep_objects_FC= predeps_FC= postdeps_FC= compiler_lib_search_path_FC= cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_FC"; then compiler_lib_search_path_FC="${prev}${p}" else compiler_lib_search_path_FC="${compiler_lib_search_path_FC} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_FC"; then postdeps_FC="${prev}${p}" else postdeps_FC="${postdeps_FC} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_FC"; then predep_objects_FC="$p" else predep_objects_FC="$predep_objects_FC $p" fi else if test -z "$postdep_objects_FC"; then postdep_objects_FC="$p" else postdep_objects_FC="$postdep_objects_FC $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling FC test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case " $postdeps_FC " in *" -lc "*) archive_cmds_need_lc_FC=no ;; esac compiler_lib_search_dirs_FC= if test -n "${compiler_lib_search_path_FC}"; then compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_FC= lt_prog_compiler_pic_FC= lt_prog_compiler_static_FC= if test "$GCC" = yes; then lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_static_FC='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_FC='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_FC='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_FC='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_FC= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_FC=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC=-Kconform_pic fi ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_FC='-Xlinker ' if test -n "$lt_prog_compiler_pic_FC"; then lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_FC='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' else lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_FC='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_FC='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_FC='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_FC='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_FC='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_FC='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='--shared' lt_prog_compiler_static_FC='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; ccc*) lt_prog_compiler_wl_FC='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-qpic' lt_prog_compiler_static_FC='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_FC='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; rdos*) lt_prog_compiler_static_FC='-non_shared' ;; solaris*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_FC='-Qoption ld ';; *) lt_prog_compiler_wl_FC='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_FC='-Qoption ld ' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_FC='-Kconform_pic' lt_prog_compiler_static_FC='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; unicos*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_can_build_shared_FC=no ;; uts4*) lt_prog_compiler_pic_FC='-pic' lt_prog_compiler_static_FC='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_FC=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_FC= ;; *) lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 $as_echo "$lt_cv_prog_compiler_pic_FC" >&6; } lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_FC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } if ${lt_cv_prog_compiler_pic_works_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_FC=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_FC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_FC=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; } if test x"$lt_cv_prog_compiler_pic_works_FC" = xyes; then case $lt_prog_compiler_pic_FC in "" | " "*) ;; *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; esac else lt_prog_compiler_pic_FC= lt_prog_compiler_can_build_shared_FC=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_FC=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_FC=yes fi else lt_cv_prog_compiler_static_works_FC=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5 $as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; } if test x"$lt_cv_prog_compiler_static_works_FC" = xyes; then : else lt_prog_compiler_static_FC= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_FC=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_FC=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 $as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_FC+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_FC=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_FC=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5 $as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_FC" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_FC= always_export_symbols_FC=no archive_cmds_FC= archive_expsym_cmds_FC= compiler_needs_object_FC=no enable_shared_with_static_runtimes_FC=no export_dynamic_flag_spec_FC= export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_FC=no hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_shlibpath_var_FC=unsupported inherit_rpath_FC=no link_all_deplibs_FC=unknown module_cmds_FC= module_expsym_cmds_FC= old_archive_from_new_cmds_FC= old_archive_from_expsyms_cmds_FC= thread_safe_flag_spec_FC= whole_archive_flag_spec_FC= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_FC= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_FC=no ;; esac ld_shlibs_FC=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_FC='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_FC= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_FC=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_FC=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_FC='-L$libdir' export_dynamic_flag_spec_FC='${wl}--export-all-symbols' allow_undefined_flag_FC=unsupported always_export_symbols_FC=no enable_shared_with_static_runtimes_FC=yes export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_FC=no fi ;; haiku*) archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_FC=yes ;; interix[3-9]*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' export_dynamic_flag_spec_FC='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_FC= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_FC=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_FC=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_FC=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_FC=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac ;; sunos4*) archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac if test "$ld_shlibs_FC" = no; then runpath_var= hardcode_libdir_flag_spec_FC= export_dynamic_flag_spec_FC= whole_archive_flag_spec_FC= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_FC=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_FC=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_FC='' hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes file_list_spec_FC='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_FC=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_FC=yes hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_libdir_separator_FC= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs_FC=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_FC='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_FC=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_FC='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__FC+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_FC="-z nodefs" archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__FC+:} false; then : $as_echo_n "(cached) " >&6 else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__FC"; then lt_cv_aix_libpath__FC="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_FC=' ${wl}-bernotok' allow_undefined_flag_FC=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_FC='$convenience' fi archive_cmds_need_lc_FC=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_FC=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes file_list_spec_FC='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, FC)='true' enable_shared_with_static_runtimes_FC=yes exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_FC='chmod 644 $oldlib' postlink_cmds_FC='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_FC='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_FC=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_FC=no hardcode_direct_FC=no hardcode_automatic_FC=yes hardcode_shlibpath_var_FC=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_FC=yes else whole_archive_flag_spec_FC='' fi link_all_deplibs_FC=yes allow_undefined_flag_FC="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs_FC=no fi ;; dgux*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes export_dynamic_flag_spec_FC='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir' hardcode_libdir_separator_FC=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no ;; *) hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_FC='no' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: inherit_rpath_FC=yes link_all_deplibs_FC=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; newsos6) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: hardcode_shlibpath_var_FC=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no hardcode_direct_absolute_FC=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' export_dynamic_flag_spec_FC='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-R$libdir' ;; *) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_FC=no fi ;; os2*) hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes allow_undefined_flag_FC=unsupported archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc_FC='no' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_FC=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_FC='-rpath $libdir' fi archive_cmds_need_lc_FC='no' hardcode_libdir_separator_FC=: ;; solaris*) no_undefined_flag_FC=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_shlibpath_var_FC=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_FC=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; sysv4) case $host_vendor in sni) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_FC='$CC -r -o $output$reload_objs' hardcode_direct_FC=no ;; motorola) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_FC=no ;; sysv4.3*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no export_dynamic_flag_spec_FC='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_FC=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_FC='${wl}-z,text' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_FC='${wl}-z,text' allow_undefined_flag_FC='${wl}-z,nodefs' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='${wl}-R,$libdir' hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes export_dynamic_flag_spec_FC='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; *) ld_shlibs_FC=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_FC='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5 $as_echo "$ld_shlibs_FC" >&6; } test "$ld_shlibs_FC" = no && can_build_shared=no with_gnu_ld_FC=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_FC" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_FC=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_FC in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_FC+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_FC pic_flag=$lt_prog_compiler_pic_FC compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_FC allow_undefined_flag_FC= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_FC=no else lt_cv_archive_cmds_need_lc_FC=yes fi allow_undefined_flag_FC=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; } archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_fc_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_FC= if test -n "$hardcode_libdir_flag_spec_FC" || test -n "$runpath_var_FC" || test "X$hardcode_automatic_FC" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_FC" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no && test "$hardcode_minus_L_FC" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_FC=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_FC=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_FC=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5 $as_echo "$hardcode_action_FC" >&6; } if test "$hardcode_action_FC" = relink || test "$inherit_rpath_FC" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac # Check if bash is available for ac_prog in bash do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_BASH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$BASH"; then ac_cv_prog_BASH="$BASH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_BASH="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi BASH=$ac_cv_prog_BASH if test -n "$BASH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 $as_echo "$BASH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$BASH" && break done # Check whether subversion is installed # Extract the first word of "svn", so it can be a program name with args. set dummy svn; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_svncommand+:} false; then : $as_echo_n "(cached) " >&6 else case $svncommand in [\\/]* | ?:[\\/]*) ac_cv_path_svncommand="$svncommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_svncommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi svncommand=$ac_cv_path_svncommand if test -n "$svncommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $svncommand" >&5 $as_echo "$svncommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "svnversion", so it can be a program name with args. set dummy svnversion; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_svnversioncommand+:} false; then : $as_echo_n "(cached) " >&6 else case $svnversioncommand in [\\/]* | ?:[\\/]*) ac_cv_path_svnversioncommand="$svnversioncommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_svnversioncommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi svnversioncommand=$ac_cv_path_svnversioncommand if test -n "$svnversioncommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $svnversioncommand" >&5 $as_echo "$svnversioncommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # find out if we are are in a subversion directory svndir=0 if test "$svncommand" != "" ; then $svncommand info $srcdir >/dev/null 2>&1 if test $? -eq 0; then svndir=1 fi fi # use svnversion to record the current repository revision only if # subversion is installed and we are in a working copy if test "$svnversioncommand" = "" || test `LC_ALL=C $svnversioncommand -n $srcdir` = "exported" ; then if test -f $srcdir/STARPU-REVISION ; then cp $srcdir/STARPU-REVISION . else echo "unknown" > ./STARPU-REVISION fi else LC_ALL=C svnversion $srcdir > ./STARPU-REVISION fi for ac_prog in lib do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_STARPU_MS_LIB+:} false; then : $as_echo_n "(cached) " >&6 else case $STARPU_MS_LIB in [\\/]* | ?:[\\/]*) ac_cv_path_STARPU_MS_LIB="$STARPU_MS_LIB" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_STARPU_MS_LIB="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi STARPU_MS_LIB=$ac_cv_path_STARPU_MS_LIB if test -n "$STARPU_MS_LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STARPU_MS_LIB" >&5 $as_echo "$STARPU_MS_LIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$STARPU_MS_LIB" && break done if test "x$STARPU_MS_LIB" != "x"; then STARPU_HAVE_MS_LIB_TRUE= STARPU_HAVE_MS_LIB_FALSE='#' else STARPU_HAVE_MS_LIB_TRUE='#' STARPU_HAVE_MS_LIB_FALSE= fi case "$target" in *-*-mingw*|*-*-cygwin*) starpu_windows=yes libext=a $as_echo "#define STARPU_HAVE_WINDOWS /**/" >>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 # 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 CPPFLAGS+=" -I$STARPU_SRC_DIR/include/pthread_win32 " cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #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 /**/" >>confdefs.h else as_fn_error $? "pthread_create unavailable" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi fi ac_fn_c_check_type "$LINENO" "struct timespec" "ac_cv_type_struct_timespec" " #include #include #ifdef HAVE_UNISTD_H #include #endif #include #ifndef STARPU_NATIVE_WINTHREADS #include #endif " if test "x$ac_cv_type_struct_timespec" = xyes; then : $as_echo "#define STARPU_HAVE_STRUCT_TIMESPEC /**/" >>confdefs.h 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 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 /**/" >>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 /**/" >>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 # 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 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/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 # This defines HAVE_SYNC_VAL_COMPARE_AND_SWAP { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_val_compare_and_swap" >&5 $as_echo_n "checking whether the target supports __sync_val_compare_and_swap... " >&6; } if ${ac_cv_have_sync_val_compare_and_swap+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_val_compare_and_swap(&foo, 0, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_val_compare_and_swap=yes else ac_cv_have_sync_val_compare_and_swap=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_val_compare_and_swap" >&5 $as_echo "$ac_cv_have_sync_val_compare_and_swap" >&6; } if test $ac_cv_have_sync_val_compare_and_swap = yes; then $as_echo "#define STARPU_HAVE_SYNC_VAL_COMPARE_AND_SWAP 1" >>confdefs.h fi # This defines HAVE_SYNC_BOOL_COMPARE_AND_SWAP { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_bool_compare_and_swap" >&5 $as_echo_n "checking whether the target supports __sync_bool_compare_and_swap... " >&6; } if ${ac_cv_have_sync_bool_compare_and_swap+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_bool_compare_and_swap(&foo, 0, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_bool_compare_and_swap=yes else ac_cv_have_sync_bool_compare_and_swap=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_bool_compare_and_swap" >&5 $as_echo "$ac_cv_have_sync_bool_compare_and_swap" >&6; } if test $ac_cv_have_sync_bool_compare_and_swap = yes; then $as_echo "#define STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP 1" >>confdefs.h fi # This defines HAVE_SYNC_FETCH_AND_ADD { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_fetch_and_add" >&5 $as_echo_n "checking whether the target supports __sync_fetch_and_add... " >&6; } if ${ac_cv_have_sync_fetch_and_add+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_fetch_and_add(&foo, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_fetch_and_add=yes else ac_cv_have_sync_fetch_and_add=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_fetch_and_add" >&5 $as_echo "$ac_cv_have_sync_fetch_and_add" >&6; } if test $ac_cv_have_sync_fetch_and_add = yes; then $as_echo "#define STARPU_HAVE_SYNC_FETCH_AND_ADD 1" >>confdefs.h fi # This defines HAVE_SYNC_FETCH_AND_OR { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_fetch_and_or" >&5 $as_echo_n "checking whether the target supports __sync_fetch_and_or... " >&6; } if ${ac_cv_have_sync_fetch_and_or+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_fetch_and_or(&foo, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_fetch_and_or=yes else ac_cv_have_sync_fetch_and_or=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_fetch_and_or" >&5 $as_echo "$ac_cv_have_sync_fetch_and_or" >&6; } if test $ac_cv_have_sync_fetch_and_or = yes; then $as_echo "#define STARPU_HAVE_SYNC_FETCH_AND_OR 1" >>confdefs.h fi # This defines HAVE_SYNC_LOCK_TEST_AND_SET { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_lock_test_and_set" >&5 $as_echo_n "checking whether the target supports __sync_lock_test_and_set... " >&6; } if ${ac_cv_have_sync_lock_test_and_set+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo, bar; int main () { bar = __sync_lock_test_and_set(&foo, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_lock_test_and_set=yes else ac_cv_have_sync_lock_test_and_set=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_lock_test_and_set" >&5 $as_echo "$ac_cv_have_sync_lock_test_and_set" >&6; } if test $ac_cv_have_sync_lock_test_and_set = yes; then $as_echo "#define STARPU_HAVE_SYNC_LOCK_TEST_AND_SET 1" >>confdefs.h fi # This defines HAVE_SYNC_SYNCHRONIZE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports __sync_synchronize" >&5 $as_echo_n "checking whether the target supports __sync_synchronize... " >&6; } if ${ac_cv_have_sync_synchronize+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __sync_synchronize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_have_sync_synchronize=yes else ac_cv_have_sync_synchronize=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sync_synchronize" >&5 $as_echo "$ac_cv_have_sync_synchronize" >&6; } if test $ac_cv_have_sync_synchronize = yes; then $as_echo "#define STARPU_HAVE_SYNC_SYNCHRONIZE 1" >>confdefs.h fi CPPFLAGS="${CPPFLAGS} -D_GNU_SOURCE " _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing set_mempolicy" >&5 $as_echo_n "checking for library containing set_mempolicy... " >&6; } if ${ac_cv_search_set_mempolicy+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char set_mempolicy (); int main () { return set_mempolicy (); ; return 0; } _ACEOF for ac_lib in '' numa; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_set_mempolicy=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_set_mempolicy+:} false; then : break fi done if ${ac_cv_search_set_mempolicy+:} false; then : else ac_cv_search_set_mempolicy=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_set_mempolicy" >&5 $as_echo "$ac_cv_search_set_mempolicy" >&6; } ac_res=$ac_cv_search_set_mempolicy if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" enable_libnuma=yes else enable_libnuma=no fi STARPU_LIBNUMA_LDFLAGS="$STARPU_LIBNUMA_LDFLAGS $LIBS" LIBS=$_LIBS_SAV { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libnuma is available" >&5 $as_echo_n "checking whether libnuma is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libnuma" >&5 $as_echo "$enable_libnuma" >&6; } if test x$enable_libnuma = xyes; then $as_echo "#define STARPU_HAVE_LIBNUMA /**/" >>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 ############################################################################### # # # 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 # How many parallel worker can we support ? nmaxcombinedworkers=`expr 2 \* $maxcpus` cat >>confdefs.h <<_ACEOF #define STARPU_NMAX_COMBINEDWORKERS $nmaxcombinedworkers _ACEOF ############################################################################### # # # CUDA settings # # # ############################################################################### { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum number of CUDA devices" >&5 $as_echo_n "checking maximum number of CUDA devices... " >&6; } # Check whether --enable-maxcudadev was given. if test "${enable_maxcudadev+set}" = set; then : enableval=$enable_maxcudadev; nmaxcudadev=$enableval else nmaxcudadev=4 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmaxcudadev" >&5 $as_echo "$nmaxcudadev" >&6; } cat >>confdefs.h <<_ACEOF #define STARPU_MAXCUDADEVS $nmaxcudadev _ACEOF # Check whether --enable-cuda was given. if test "${enable_cuda+set}" = set; then : enableval=$enable_cuda; else enable_cuda=maybe fi #AC_MSG_CHECKING(whether CUDA is available) # Check whether --with-cuda-dir was given. if test "${with_cuda_dir+set}" = set; then : withval=$with_cuda_dir; cuda_dir="$withval" # in case this was not explicit yet enable_cuda=yes else cuda_dir=no fi # Check whether --with-cuda-include-dir was given. if test "${with_cuda_include_dir+set}" = set; then : withval=$with_cuda_include_dir; cuda_include_dir="$withval" # in case this was not explicit yet enable_cuda=yes else cuda_include_dir=no fi # Check whether --with-cuda-lib-dir was given. if test "${with_cuda_lib_dir+set}" = set; then : withval=$with_cuda_lib_dir; cuda_lib_dir="$withval" # in case this was not explicit yet enable_cuda=yes else cuda_lib_dir=no fi if test x$enable_cuda = xyes -o x$enable_cuda = xmaybe; then __cuda_dir="$cuda_dir" __cuda_include_dir="$cuda_include_dir" __cuda_lib_dir="$cuda_lib_dir" if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available in $__cuda_dir" >&5 $as_echo_n "checking whether CUDA is available in $__cuda_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available" >&5 $as_echo_n "checking whether CUDA is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_h" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then __cuda_L="-L${__cuda_lib_dir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do __cuda_L="-L${__cuda_dir}/${__cuda_libdir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_cuda" = yes ; then break fi done else __cuda_L="" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then # Extract the first word of "nvcc", so it can be a program name with args. set dummy nvcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NVCC+:} false; then : $as_echo_n "(cached) " >&6 else case $NVCC in [\\/]* | ?:[\\/]*) ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NVCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="not-found" ;; esac fi NVCC=$ac_cv_path_NVCC if test -n "$NVCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 $as_echo "$NVCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$NVCC" = "xnot-found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'nvcc' not found, disabling CUDA" >&5 $as_echo "$as_me: WARNING: 'nvcc' not found, disabling CUDA" >&2;} have_valid_cuda=no else { $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 rm -f cuda_test* fi # nvcc is a wrapper around GCC, and calls it with the -dumpspecs # option, which is GCC specific. If $CC does not support -dumpspecs, we # should let nvcc choose another compiler (by default, gcc, if it is # installed). If gcc is not installed, the build will probably fail. $CC -dumpspecs >/dev/null 2>&1 if test $? -eq 0 -a x$starpu_windows != xyes; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi if test "$have_valid_cuda" = "no" ; then __cuda_dir="$CUDA_ROOT" __cuda_include_dir="$CUDA_PATH" __cuda_lib_dir="$CUDA_INC_PATH" if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available in $__cuda_dir" >&5 $as_echo_n "checking whether CUDA is available in $__cuda_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available" >&5 $as_echo_n "checking whether CUDA is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_h" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then __cuda_L="-L${__cuda_lib_dir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do __cuda_L="-L${__cuda_dir}/${__cuda_libdir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_cuda" = yes ; then break fi done else __cuda_L="" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then # Extract the first word of "nvcc", so it can be a program name with args. set dummy nvcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NVCC+:} false; then : $as_echo_n "(cached) " >&6 else case $NVCC in [\\/]* | ?:[\\/]*) ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NVCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="not-found" ;; esac fi NVCC=$ac_cv_path_NVCC if test -n "$NVCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 $as_echo "$NVCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$NVCC" = "xnot-found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'nvcc' not found, disabling CUDA" >&5 $as_echo "$as_me: WARNING: 'nvcc' not found, disabling CUDA" >&2;} have_valid_cuda=no else { $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 rm -f cuda_test* fi # nvcc is a wrapper around GCC, and calls it with the -dumpspecs # option, which is GCC specific. If $CC does not support -dumpspecs, we # should let nvcc choose another compiler (by default, gcc, if it is # installed). If gcc is not installed, the build will probably fail. $CC -dumpspecs >/dev/null 2>&1 if test $? -eq 0 -a x$starpu_windows != xyes; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi fi if test "$have_valid_cuda" = "no" ; then for f in "/usr/local/cuda" "/c/cuda" "/cygdrive/c/cuda" "/opt/cuda" "$CUDA_ROOT" "$CUDA_PATH" "$CUDA_INC_PATH/.." "$CUDA_INC/.." "$CUDA_BIN/.." "$CUDA_SDK/.." "$CUDA_INSTALL_PATH" "$CUDA_TOOLKIT"; do if test -n "$f" ; then __cuda_dir="$f" __cuda_include_dir="no" __cuda_lib_dir="no" if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available in $__cuda_dir" >&5 $as_echo_n "checking whether CUDA is available in $__cuda_dir... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available" >&5 $as_echo_n "checking whether CUDA is available... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_h" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then __cuda_L="-L${__cuda_lib_dir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do __cuda_L="-L${__cuda_dir}/${__cuda_libdir}" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" if test "$have_valid_cuda" = yes ; then break fi done else __cuda_L="" SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is available with: $__cuda_L" >&5 $as_echo_n "checking whether CUDA is available with: $__cuda_L... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcuda" >&5 $as_echo_n "checking for main in -lcuda... " >&6; } if ${ac_cv_lib_cuda_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcuda $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cuda_main=yes else ac_cv_lib_cuda_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_main" >&5 $as_echo "$ac_cv_lib_cuda_main" >&6; } if test "x$ac_cv_lib_cuda_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cuda=ac_cv_lib_cuda_main unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcudart" >&5 $as_echo_n "checking for main in -lcudart... " >&6; } if ${ac_cv_lib_cudart_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcudart $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cudart_main=yes else ac_cv_lib_cudart_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_main" >&5 $as_echo "$ac_cv_lib_cudart_main" >&6; } if test "x$ac_cv_lib_cudart_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cudart=ac_cv_lib_cudart_main unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcublas" >&5 $as_echo_n "checking for main in -lcublas... " >&6; } if ${ac_cv_lib_cublas_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcublas $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cublas_main=yes else ac_cv_lib_cublas_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cublas_main" >&5 $as_echo "$ac_cv_lib_cublas_main" >&6; } if test "x$ac_cv_lib_cublas_main" = xyes; then : have_valid_cuda=yes else have_valid_cuda=no fi ac_cv_lib_cublas=ac_cv_lib_cublas_main unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then # Extract the first word of "nvcc", so it can be a program name with args. set dummy nvcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_NVCC+:} false; then : $as_echo_n "(cached) " >&6 else case $NVCC in [\\/]* | ?:[\\/]*) ac_cv_path_NVCC="$NVCC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_NVCC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_NVCC" && ac_cv_path_NVCC="not-found" ;; esac fi NVCC=$ac_cv_path_NVCC if test -n "$NVCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NVCC" >&5 $as_echo "$NVCC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$NVCC" = "xnot-found"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'nvcc' not found, disabling CUDA" >&5 $as_echo "$as_me: WARNING: 'nvcc' not found, disabling CUDA" >&2;} have_valid_cuda=no else { $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 rm -f cuda_test* fi # nvcc is a wrapper around GCC, and calls it with the -dumpspecs # option, which is GCC specific. If $CC does not support -dumpspecs, we # should let nvcc choose another compiler (by default, gcc, if it is # installed). If gcc is not installed, the build will probably fail. $CC -dumpspecs >/dev/null 2>&1 if test $? -eq 0 -a x$starpu_windows != xyes; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi if test "$have_valid_cuda" = "yes" ; then break fi fi done fi # Check cuda is compatible with the C compiler { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA is working" >&5 $as_echo_n "checking whether CUDA is working... " >&6; } if test "$have_valid_cuda" = "yes" ; then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${STARPU_CUDA_CPPFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS} -lcuda" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test "$cross_compiling" = yes; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run test program while cross compiling See \`config.log' for more details" "$LINENO" 5; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : have_valid_cuda="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: CUDA found and can be compiled, but compiled application can not be run, is the CUDA path missing in LD_LIBRARY_PATH?" >&5 $as_echo "CUDA found and can be compiled, but compiled application can not be run, is the CUDA path missing in LD_LIBRARY_PATH?" >&6; } have_valid_cuda="no" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else as_fn_error $? "CUDA found, but cuda.h could not be compiled" "$LINENO" 5 have_valid_cuda="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_valid_cuda" >&5 $as_echo "$have_valid_cuda" >&6; } # in case CUDA was explicitely required, but is not available, this is an error if test x$enable_cuda = xyes -a x$have_valid_cuda = xno; then as_fn_error $? "cannot find CUDA" "$LINENO" 5 fi # now we enable CUDA if and only if a proper setup is available enable_cuda=$have_valid_cuda fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA should be used" >&5 $as_echo_n "checking whether CUDA should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cuda" >&5 $as_echo "$enable_cuda" >&6; } STARPU_USE_CUDA=$enable_cuda if test x$enable_cuda = xyes; then STARPU_USE_CUDA_TRUE= STARPU_USE_CUDA_FALSE='#' else STARPU_USE_CUDA_TRUE='#' STARPU_USE_CUDA_FALSE= fi if test x$enable_cuda = xyes; then $as_echo "#define STARPU_USE_CUDA 1" >>confdefs.h # On Darwin, the libstdc++ dependency is not automatically added by nvcc # case "$target" in # *-*darwin*) AC_HAVE_LIBRARY([stdc++], []) ;; # #*-*darwin*) AC_HAVE_LIBRARY([stdc++], [STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lstdc++"]) ;; # esac STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcuda" STARPU_CUFFT_LDFLAGS="-lcufft" if test "$F77" = "gfortran" -o "$FC" = "gfortran" ; then STARPU_CUDA_FORTRAN_LDFLAGS="-lgfortran" fi #in case this is a 64bit setup, we tell nvcc to use a -m64 flag if test x$SIZEOF_VOID_P = x8; then NVCCFLAGS="${NVCCFLAGS} -m64" fi for ac_header in cuda_gl_interop.h do : ac_fn_c_check_header_mongrel "$LINENO" "cuda_gl_interop.h" "ac_cv_header_cuda_gl_interop_h" "$ac_includes_default" if test "x$ac_cv_header_cuda_gl_interop_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CUDA_GL_INTEROP_H 1 _ACEOF fi done fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi have_magma=no if test x$enable_cuda = xyes; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAGMA" >&5 $as_echo_n "checking for MAGMA... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$MAGMA_CFLAGS"; then pkg_cv_MAGMA_CFLAGS="$MAGMA_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"magma\""; } >&5 ($PKG_CONFIG --exists --print-errors "magma") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MAGMA_CFLAGS=`$PKG_CONFIG --cflags "magma" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$MAGMA_LIBS"; then pkg_cv_MAGMA_LIBS="$MAGMA_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"magma\""; } >&5 ($PKG_CONFIG --exists --print-errors "magma") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MAGMA_LIBS=`$PKG_CONFIG --libs "magma" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MAGMA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "magma"` else MAGMA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "magma"` fi # Put the nasty error message in config.log where it belongs echo "$MAGMA_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else MAGMA_CFLAGS=$pkg_cv_MAGMA_CFLAGS MAGMA_LIBS=$pkg_cv_MAGMA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_MAGMA 1" >>confdefs.h STARPU_HAVE_MAGMA=1 have_magma=yes fi fi if test x$have_magma = xyes; then STARPU_HAVE_MAGMA_TRUE= STARPU_HAVE_MAGMA_FALSE='#' else STARPU_HAVE_MAGMA_TRUE='#' STARPU_HAVE_MAGMA_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MAGMA should be used" >&5 $as_echo_n "checking whether MAGMA should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_magma" >&5 $as_echo "$have_magma" >&6; } # cufftDoubleComplex may not be available on an old CUDA setup ac_fn_c_check_type "$LINENO" "cufftDoubleComplex" "ac_cv_type_cufftDoubleComplex" "#include " if test "x$ac_cv_type_cufftDoubleComplex" = xyes; then : have_cufftdoublecomplex=yes else have_cufftdoublecomplex=no fi if test x$have_cufftdoublecomplex = xyes; then STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE= STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE='#' else STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE='#' STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE= fi if test x$have_cufftdoublecomplex = xyes; then $as_echo "#define STARPU_HAVE_CUFFTDOUBLECOMPLEX 1" >>confdefs.h fi # The CURAND library is only available since CUDA 3.2 have_curand=$enable_cuda if test x$enable_cuda = xyes; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lcurand" >&5 $as_echo_n "checking for main in -lcurand... " >&6; } if ${ac_cv_lib_curand_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurand $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curand_main=yes else ac_cv_lib_curand_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curand_main" >&5 $as_echo "$ac_cv_lib_curand_main" >&6; } if test "x$ac_cv_lib_curand_main" = xyes; then : have_curand=yes else have_curand=no fi ac_cv_lib_curand=ac_cv_lib_curand_main LDFLAGS="${SAVED_LDFLAGS}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CURAND is available" >&5 $as_echo_n "checking whether CURAND is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_curand" >&5 $as_echo "$have_curand" >&6; } if test x$have_curand = xyes; then $as_echo "#define STARPU_HAVE_CURAND 1" >>confdefs.h STARPU_CURAND_LDFLAGS="$STARPU_CURAND_LDFLAGS -lcurand" fi # Peer transfers are only supported since CUDA 4.0 # Disable them if user explicity wants to disable them # Check whether --enable-cuda_memcpy_peer was given. if test "${enable_cuda_memcpy_peer+set}" = set; then : enableval=$enable_cuda_memcpy_peer; else enable_cuda_memcpy_peer=yes fi have_cuda_memcpy_peer=no if test x$enable_cuda_memcpy_peer = xyes -a x$enable_cuda = xyes ; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" ac_fn_c_check_func "$LINENO" "cudaMemcpyPeer" "ac_cv_func_cudaMemcpyPeer" if test "x$ac_cv_func_cudaMemcpyPeer" = xyes; then : have_cuda_memcpy_peer=yes else have_cuda_memcpy_peer=no fi LDFLAGS="${SAVED_LDFLAGS}" fi if test x$have_cuda_memcpy_peer = xyes; then $as_echo "#define HAVE_CUDA_MEMCPY_PEER /**/" >>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 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" 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 ############################################################################### # # # Drivers # # # ############################################################################### # Check whether --enable-opencl-simulator was given. if test "${enable_opencl_simulator+set}" = set; then : enableval=$enable_opencl_simulator; enable_opencl_simulator=$enableval else enable_opencl_simulator=no fi if test x$enable_opencl_simulator = xyes; then enable_simgrid=yes $as_echo "#define STARPU_OPENCL_SIMULATOR 1" >>confdefs.h fi # Check whether --with-simgrid-dir was given. if test "${with_simgrid_dir+set}" = set; then : withval=$with_simgrid_dir; simgrid_dir="$withval" # in case this was not explicit yet enable_simgrid=yes else simgrid_dir=no fi # Check whether --with-simgrid-include-dir was given. if test "${with_simgrid_include_dir+set}" = set; then : withval=$with_simgrid_include_dir; simgrid_include_dir="$withval" # in case this was not explicit yet enable_simgrid=yes else simgrid_include_dir=no fi # Check whether --with-simgrid-lib-dir was given. if test "${with_simgrid_lib_dir+set}" = set; then : withval=$with_simgrid_lib_dir; simgrid_lib_dir="$withval" # in case this was not explicit yet enable_simgrid=yes else simgrid_lib_dir=no fi # Check whether --enable-simgrid was given. if test "${enable_simgrid+set}" = set; then : enableval=$enable_simgrid; enable_simgrid=$enableval else enable_simgrid=no fi if test x$enable_simgrid = xyes ; then if test -n "$SIMGRID_CFLAGS" ; then CFLAGS="$SIMGRID_CFLAGS $CFLAGS" CXXFLAGS="$SIMGRID_CFLAGS $CXXFLAGS" NVCCFLAGS="$SIMGRID_CFLAGS $NVCCFLAGS" fi if test -n "$SIMGRID_LIBS" ; then LDFLAGS="$SIMGRID_LIBS $LDFLAGS" fi if test "$simgrid_dir" != "no" ; then CFLAGS="-I$simgrid_dir/include $CFLAGS" CXXFLAGS="-I$simgrid_dir/include $CXXFLAGS" NVCCFLAGS="-I$simgrid_dir/include $NVCCFLAGS" LDFLAGS="-L$simgrid_dir/lib $LDFLAGS" fi if test "$simgrid_include_dir" != "no" ; then CFLAGS="-I$simgrid_include_dir $CFLAGS" CXXFLAGS="-I$simgrid_include_dir $CXXFLAGS" NVCCFLAGS="-I$simgrid_include_dir $NVCCFLAGS" fi if test "$simgrid_lib_dir" != "no" ; then LDFLAGS="-L$simgrid_lib_dir $LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lsimgrid" >&5 $as_echo_n "checking for main in -lsimgrid... " >&6; } if ${ac_cv_lib_simgrid_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsimgrid $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_simgrid_main=yes else ac_cv_lib_simgrid_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_simgrid_main" >&5 $as_echo "$ac_cv_lib_simgrid_main" >&6; } if test "x$ac_cv_lib_simgrid_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSIMGRID 1 _ACEOF LIBS="-lsimgrid $LIBS" else as_fn_error $? "Simgrid support needs simgrid installed" "$LINENO" 5 fi ac_cv_lib_simgrid=ac_cv_lib_simgrid_main for ac_header in simgrid/msg.h do : ac_fn_c_check_header_mongrel "$LINENO" "simgrid/msg.h" "ac_cv_header_simgrid_msg_h" "$ac_includes_default" if test "x$ac_cv_header_simgrid_msg_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIMGRID_MSG_H 1 _ACEOF $as_echo "#define STARPU_HAVE_SIMGRID_MSG_H 1" >>confdefs.h fi done for ac_func in xbt_mutex_try_acquire do : ac_fn_c_check_func "$LINENO" "xbt_mutex_try_acquire" "ac_cv_func_xbt_mutex_try_acquire" if test "x$ac_cv_func_xbt_mutex_try_acquire" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XBT_MUTEX_TRY_ACQUIRE 1 _ACEOF fi done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif int main () { msg_host_t foo; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else as_fn_error $? "StarPU needs a version of Simgrid which defines the type msg_host_t (should be any version >= 3.8.1)" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext $as_echo "#define STARPU_SIMGRID 1" >>confdefs.h # We won't bind or detect anything with_hwloc=no 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 disabled" >&5 $as_echo_n "checking whether blocking drivers should be disabled... " >&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 ############################################################################### # # # 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 if test x$enable_debug = xyes; then $as_echo "#define STARPU_DEBUG 1" >>confdefs.h CFLAGS="$CFLAGS -O0" CXXFLAGS="$CXXFLAGS -O0" enable_spinlock_check=yes else CFLAGS="-O3 $CFLAGS" CXXFLAGS="-O3 $CXXFLAGS" fi CFLAGS+=" -gdwarf-2 -g3 " CXXFLAGS+=" -gdwarf-2 -g3 " if test x$enable_spinlock_check = xyes; then $as_echo "#define STARPU_SPINLOCK_CHECK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether extra checks should be performed" >&5 $as_echo_n "checking whether extra checks should be performed... " >&6; } # Check whether --enable-fast was given. if test "${enable_fast+set}" = set; then : enableval=$enable_fast; enable_fast=$enableval else enable_fast=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_fast" >&5 $as_echo "$enable_fast" >&6; } if test x$enable_fast = xyes; then $as_echo "#define STARPU_NO_ASSERT 1" >>confdefs.h 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 { $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" LDFLAGS="${LDFLAGS} --coverage" fi # shall we use FxT to generate trace of the execution ? { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether FxT traces should be generated" >&5 $as_echo_n "checking whether FxT traces should be generated... " >&6; } # Check whether --with-fxt was given. if test "${with_fxt+set}" = set; then : withval=$with_fxt; if test x$withval != xno; then use_fxt=yes if test x$withval = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } use_fxt_from_system=yes else # use specified path # TODO check if the dir is actually containing FxT use_fxt_from_system=no fxtdir=$withval { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes using $fxtdir" >&5 $as_echo "yes using $fxtdir" >&6; } FXTDIR=$fxtdir fi else use_fxt=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else use_fxt=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi STARPU_USE_FXT=$use_fxt if test x$use_fxt = xyes; then STARPU_USE_FXT_TRUE= STARPU_USE_FXT_FALSE='#' else STARPU_USE_FXT_TRUE='#' STARPU_USE_FXT_FALSE= fi if test x$use_fxt = xyes; then $as_echo "#define STARPU_USE_FXT 1" >>confdefs.h $as_echo "#define CONFIG_FUT 1" >>confdefs.h if test x$use_fxt_from_system = xno; then save_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" PKG_CONFIG_PATH="$fxtdir/lib/pkgconfig:$PKG_CONFIG_PATH" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FXT" >&5 $as_echo_n "checking for FXT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FXT_CFLAGS"; then pkg_cv_FXT_CFLAGS="$FXT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_CFLAGS=`$PKG_CONFIG --cflags "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FXT_LIBS"; then pkg_cv_FXT_LIBS="$FXT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_LIBS=`$PKG_CONFIG --libs "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fxt"` else FXT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fxt"` fi # Put the nasty error message in config.log where it belongs echo "$FXT_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&5 $as_echo "$as_me: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&2;} FXT_CFLAGS="-I$fxtdir/include/ " FXT_LDFLAGS="-L$fxtdir/lib/" FXT_LIBS="-lfxt" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&5 $as_echo "$as_me: WARNING: Old FxT without fxt.pc file, hoping link will succeed" >&2;} FXT_CFLAGS="-I$fxtdir/include/ " FXT_LDFLAGS="-L$fxtdir/lib/" FXT_LIBS="-lfxt" else FXT_CFLAGS=$pkg_cv_FXT_CFLAGS FXT_LIBS=$pkg_cv_FXT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi PKG_CONFIG_PATH="$save_PKG_CONFIG_PATH" else pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FXT" >&5 $as_echo_n "checking for FXT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FXT_CFLAGS"; then pkg_cv_FXT_CFLAGS="$FXT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_CFLAGS=`$PKG_CONFIG --cflags "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FXT_LIBS"; then pkg_cv_FXT_LIBS="$FXT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "fxt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FXT_LIBS=`$PKG_CONFIG --libs "fxt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fxt"` else FXT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fxt"` fi # Put the nasty error message in config.log where it belongs echo "$FXT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (fxt) were not met: $FXT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FXT_CFLAGS and FXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FXT_CFLAGS and FXT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FXT_CFLAGS=$pkg_cv_FXT_CFLAGS FXT_LIBS=$pkg_cv_FXT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi fi save_LIBS="$LIBS" LIBS="$LIBS $FXT_LIBS" save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $FXT_LDFLAGS" for ac_func in enable_fut_flush do : ac_fn_c_check_func "$LINENO" "enable_fut_flush" "ac_cv_func_enable_fut_flush" if test "x$ac_cv_func_enable_fut_flush" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ENABLE_FUT_FLUSH 1 _ACEOF fi done for ac_func in fut_set_filename do : ac_fn_c_check_func "$LINENO" "fut_set_filename" "ac_cv_func_fut_set_filename" if test "x$ac_cv_func_fut_set_filename" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FUT_SET_FILENAME 1 _ACEOF fi done LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $FXT_CFLAGS" ac_fn_c_check_decl "$LINENO" "enable_fut_flush" "ac_cv_have_decl_enable_fut_flush" "$ac_includes_default" 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" "$ac_includes_default" if test "x$ac_cv_have_decl_fut_set_filename" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_FUT_SET_FILENAME $ac_have_decl _ACEOF CFLAGS="$save_CFLAGS" ########################################## # Poti is a library to generate paje trace files ########################################## pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for POTI" >&5 $as_echo_n "checking for POTI... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$POTI_CFLAGS"; then pkg_cv_POTI_CFLAGS="$POTI_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"poti\""; } >&5 ($PKG_CONFIG --exists --print-errors "poti") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_POTI_CFLAGS=`$PKG_CONFIG --cflags "poti" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$POTI_LIBS"; then pkg_cv_POTI_LIBS="$POTI_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"poti\""; } >&5 ($PKG_CONFIG --exists --print-errors "poti") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_POTI_LIBS=`$PKG_CONFIG --libs "poti" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then POTI_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "poti"` else POTI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "poti"` fi # Put the nasty error message in config.log where it belongs echo "$POTI_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else POTI_CFLAGS=$pkg_cv_POTI_CFLAGS POTI_LIBS=$pkg_cv_POTI_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_POTI 1" >>confdefs.h fi FXT_CFLAGS="$FXT_CFLAGS $POTI_CFLAGS" FXT_LIBS="$FXT_LIBS $POTI_LIBS" 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 -fprofile-arcs " LDFLAGS="${LDFLAGS} -pg -fprofile-arcs " fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether performance model debugging should be enabled" >&5 $as_echo_n "checking whether performance model debugging should be enabled... " >&6; } # Check whether --enable-model-debug was given. if test "${enable_model_debug+set}" = set; then : enableval=$enable_model_debug; enable_model_debug=$enableval else enable_model_debug=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_model_debug" >&5 $as_echo "$enable_model_debug" >&6; } if test x$enable_model_debug = xyes; then $as_echo "#define STARPU_MODEL_DEBUG 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether statistics should be generated" >&5 $as_echo_n "checking whether statistics should be generated... " >&6; } # Check whether --enable-stats was given. if test "${enable_stats+set}" = set; then : enableval=$enable_stats; enable_stats=$enableval else enable_stats=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_stats" >&5 $as_echo "$enable_stats" >&6; } STATS=$enable_stats STARPU_ENABLE_STATS=$enable_stats if test x$enable_stats = xyes; then $as_echo "#define STARPU_ENABLE_STATS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether memory stats should be displayed" >&5 $as_echo_n "checking whether memory stats should be displayed... " >&6; } # Check whether --enable-memory-stats was given. if test "${enable_memory_stats+set}" = set; then : enableval=$enable_memory_stats; enable_memory_stats=$enableval else enable_memory_stats=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_memory_stats" >&5 $as_echo "$enable_memory_stats" >&6; } if test x$enable_memory_stats = xyes; then $as_echo "#define STARPU_MEMORY_STATS 1" >>confdefs.h fi 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 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 ############################################################################### # # # 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 # TODO: add option to choose maxnodes if test x$enable_simgrid = xyes ; then # We still need the room for the virtual CUDA/OpenCL devices maxnodes=16 else # We have one memory node shared by all CPU workers, one node per GPU nodes=1 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 # 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 { $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 fi nmaxworkers=`expr 16 \* \( \( $maxcpus + $nmaxcudadev + $nmaxopencldev + 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 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 ############################################################################### # # # MPI # # # ############################################################################### # Check whether --with-mpicc was given. if test "${with_mpicc+set}" = set; then : withval=$with_mpicc; if test x$withval = xyes; then as_fn_error $? "--with-mpicc must be given a pathname" "$LINENO" 5 else mpicc_path=$withval fi else # nothing was specified: default value is used # Extract the first word of "mpicc", so it can be a program name with args. set dummy 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 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_mpicc_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_mpicc_path" && ac_cv_path_mpicc_path="no" ;; esac fi mpicc_path=$ac_cv_path_mpicc_path if test -n "$mpicc_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicc_path" >&5 $as_echo "$mpicc_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # We test if the MPICC compiler exists if test ! -x $mpicc_path; then #MPICC does not exists or is not executable { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpicc compiler is not valid" >&5 $as_echo "The mpicc compiler is not valid" >&6; } use_mpi=no else use_mpi=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking mpicc path" >&5 $as_echo_n "checking mpicc path... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpicc_path" >&5 $as_echo "$mpicc_path" >&6; } MPICC=$mpicc_path if test x$use_mpi = xyes; then cc_or_mpicc=$mpicc_path # For some reason, libtool uses gcc instead of mpicc when linking # libstarpumpi. # On Darwin (and maybe other systems ?) the linker will fail (undefined # references to MPI_*). We manually add the required flags to fix this # issue. MPICC_LDFLAGS=`$mpicc_path --showme:link` else cc_or_mpicc=$CC fi CC_OR_MPICC=$cc_or_mpicc # If the user specifically asks for it, or if we are in a developer checkout, we enable mpi check # Check whether --enable-mpi-check was given. if test "${enable_mpi_check+set}" = set; then : enableval=$enable_mpi_check; fi running_mpi_check=no if test $svndir = 1 -o -d "$srcdir/.git" ; then running_mpi_check=yes fi if test x$enable_mpi_check = xyes ; then running_mpi_check=yes fi if test x$enable_mpi_check = xno ; then running_mpi_check=no fi # Check if mpiexec is available # Check whether --with-mpiexec was given. if test "${with_mpiexec+set}" = set; then : withval=$with_mpiexec; if test x$withval = xyes; then as_fn_error $? "--with-mpiexec must be given a pathname" "$LINENO" 5 else mpiexec_path=$withval fi else # nothing was specified: look in the path # Extract the first word of "mpiexec", so it can be a program name with args. set dummy mpiexec; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_mpiexec_path+:} false; then : $as_echo_n "(cached) " >&6 else case $mpiexec_path in [\\/]* | ?:[\\/]*) ac_cv_path_mpiexec_path="$mpiexec_path" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$(dirname $mpicc_path):$PATH" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_mpiexec_path="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_mpiexec_path" && ac_cv_path_mpiexec_path="no" ;; esac fi mpiexec_path=$ac_cv_path_mpiexec_path if test -n "$mpiexec_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpiexec_path" >&5 $as_echo "$mpiexec_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpiexec is available" >&5 $as_echo_n "checking whether mpiexec is available... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mpiexec_path" >&5 $as_echo "$mpiexec_path" >&6; } # We test if MPIEXEC exists if test ! -x $mpiexec_path; then #MPIEXEC does not exists or is not executable { $as_echo "$as_me:${as_lineno-$LINENO}: result: The mpiexec script is not valid" >&5 $as_echo "The mpiexec script is not valid" >&6; } running_mpi_check=no mpiexec_path="" fi if test x$running_mpi_check = xyes; then STARPU_MPI_CHECK_TRUE= STARPU_MPI_CHECK_FALSE='#' else STARPU_MPI_CHECK_TRUE='#' STARPU_MPI_CHECK_FALSE= fi if test x$use_mpi = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MPI tests should be run" >&5 $as_echo_n "checking whether MPI tests should be run... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $running_mpi_check" >&5 $as_echo "$running_mpi_check" >&6; } MPIEXEC=$mpiexec_path fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the StarPU MPI library should be generated" >&5 $as_echo_n "checking whether the StarPU MPI library should be generated... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_mpi" >&5 $as_echo "$use_mpi" >&6; } USE_MPI=$use_mpi if test x$use_mpi = xyes; then USE_MPI_TRUE= USE_MPI_FALSE='#' else USE_MPI_TRUE='#' USE_MPI_FALSE= fi if test x$use_mpi = xyes; then $as_echo "#define STARPU_USE_MPI /**/" >>confdefs.h else running_mpi_check=no fi # Check whether --enable-mpi-progression-hook was given. if test "${enable_mpi_progression_hook+set}" = set; then : enableval=$enable_mpi_progression_hook; enable_mpi_progression_hook=$enableval else enable_mpi_progression_hook=no fi if test x$enable_mpi_progression_hook = xyes; then $as_echo "#define STARPU_MPI_ACTIVITY 1" >>confdefs.h fi ############################################################################### # # # StarPU-Top # # # ############################################################################### # Check whether --enable-starpu-top was given. if test "${enable_starpu_top+set}" = set; then : enableval=$enable_starpu_top; enable_starpu_top="$enableval" else enable_starpu_top="maybe" fi # Check whether StarPU-Top can be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking for StarPU-Top" >&5 $as_echo_n "checking for StarPU-Top... " >&6; } if test "x$enable_starpu_top" != "xno" ; then can_build_starpu_top=no for ac_prog in qmake-qt4 qmake do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_QMAKE+:} false; then : $as_echo_n "(cached) " >&6 else case $QMAKE in [\\/]* | ?:[\\/]*) ac_cv_path_QMAKE="$QMAKE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_QMAKE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi QMAKE=$ac_cv_path_QMAKE if test -n "$QMAKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKE" >&5 $as_echo "$QMAKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$QMAKE" && break done test -n "$QMAKE" || QMAKE="not-found" if test x$QMAKE != xnot-found; then QMAKE_VERSION=`$QMAKE --version 2>&1 | head -n 1 | cut -d '.' -f 1 | cut -d ' ' -f 3` if test $QMAKE_VERSION -ge 2 ; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtGui QtNetwork QtOpenGL QtSql\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtGui QtNetwork QtOpenGL QtSql") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then QT_MAJVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 1` QT_MINVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 2` if test $QT_MAJVERSION -gt 4 -o \( $QT_MAJVERSION -eq 4 -a $QT_MINVERSION -ge 7 \) ; then can_build_starpu_top=yes fi QWT_PRI=embed # Check whether --with-qwt-include-dir was given. if test "${with_qwt_include_dir+set}" = set; then : withval=$with_qwt_include_dir; STARPU_QWT_INCLUDE="$withval" QWT_PRI=system fi # Check whether --with-qwt-lib-dir was given. if test "${with_qwt_lib_dir+set}" = set; then : withval=$with_qwt_lib_dir; STARPU_QWT_LDFLAGS="-L$withval" QWT_PRI=system fi # Check whether --with-qwt-lib was given. if test "${with_qwt_lib+set}" = set; then : withval=$with_qwt_lib; STARPU_QWT_LDFLAGS="${STARPU_QWT_LDFLAGS} -l$withval" QWT_PRI=system fi fi fi fi fi if test "x$enable_starpu_top" != "xno" ; then build_starpu_top=$can_build_starpu_top else build_starpu_top=no fi STARPU_USE_TOP=$build_starpu_top if test "x$build_starpu_top" = "xyes"; then BUILD_STARPU_TOP_TRUE= BUILD_STARPU_TOP_FALSE='#' else BUILD_STARPU_TOP_TRUE='#' BUILD_STARPU_TOP_FALSE= fi if test "x$build_starpu_top" = "xyes"; then $as_echo "#define STARPU_USE_TOP 1" >>confdefs.h fi ############################################################################### # # # Flags for C Compiler # # # ############################################################################### # IS_SUPPORTED_CFLAG(flag) # ------------------------ # Check if the CFLAGS `flag' is supported by the compiler { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wall" >&5 $as_echo_n "checking whether compiler support -Wall... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wall" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wall" { $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 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Werror=implicit" >&5 $as_echo_n "checking whether compiler support -Werror=implicit... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=implicit" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Werror=implicit" { $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 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Werror=implicit-function-declaration" >&5 $as_echo_n "checking whether compiler support -Werror=implicit-function-declaration... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=implicit-function-declaration" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$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; } else { $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 CFLAGS="$SAVED_CFLAGS" if test "x$STARPU_DEVEL" != x; then $as_echo "#define STARPU_DEVEL 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wextra" >&5 $as_echo_n "checking whether compiler support -Wextra... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wextra" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wextra" { $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 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wunused" >&5 $as_echo_n "checking whether compiler support -Wunused... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wunused" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wunused" { $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 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wundef" >&5 $as_echo_n "checking whether compiler support -Wundef... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wundef" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wundef" { $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 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Wshadow" >&5 $as_echo_n "checking whether compiler support -Wshadow... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Wshadow" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS -Wshadow" { $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 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler support -Werror=pointer-arith" >&5 $as_echo_n "checking whether compiler support -Werror=pointer-arith... " >&6; } SAVED_CFLAGS="$CFLAGS" CFLAGS="-Werror=pointer-arith" # -we10006" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { const char *hello = "Hello World"; ; return 0; } _ACEOF if ac_fn_c_try_compile "$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; } else { $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 CFLAGS="$SAVED_CFLAGS" fi if test "x$STARPU_DEVEL" != x; then STARPU_DEVEL_TRUE= STARPU_DEVEL_FALSE='#' else STARPU_DEVEL_TRUE='#' STARPU_DEVEL_FALSE= fi # Same value as Automake's, for use in other places. pkglibdir="\${libdir}/$PACKAGE" ############################################################################### # # # GCC extensions # # # ############################################################################### # Check whether --enable-gcc-extensions was given. if test "${enable_gcc_extensions+set}" = set; then : enableval=$enable_gcc_extensions; enable_gcc_plugin="$enableval" else enable_gcc_plugin="maybe" fi if test "x$enable_gcc_plugin" = "xyes" -o "x$enable_gcc_plugin" = "xmaybe" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GCC supports plug-ins" >&5 $as_echo_n "checking whether GCC supports plug-ins... " >&6; } if ${ac_cv_have_gcc_plugins+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$GCC" = xyes; then # ICC 12.1.0 and Clang 3.1 (among others) support `--version', # define `__GNUC__', and provide a `-print-file-name=plugin' # that returns GCC's valid header directory. This makes them # hardly distinguishable from GCC. Actually, ICC 12.1.0 is able # to compile our plug-in, but silently ignores `-fplugin', leading # to obvious build failures; thus, it is explicitly excluded below. GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #if defined __INTEL_COMPILER || defined __ICC Beware, this compiler is a fake. Don't use it. #endif tree fndecl; gimple call; int main () { /* Clang 3.1 doesn't support nested functions, so try to discriminate it this way. */ tree foo (void) { return lookup_name (get_identifier ("puts")); } fndecl = foo (); call = gimple_build_call (fndecl, 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_have_gcc_plugins="yes" else ac_cv_have_gcc_plugins="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" else ac_cv_have_gcc_plugins="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_gcc_plugins" >&5 $as_echo "$ac_cv_have_gcc_plugins" >&6; } if test "x$ac_cv_have_gcc_plugins" = "xyes"; then GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac ac_fn_c_check_decl "$LINENO" "build_call_expr_loc_array" "ac_cv_have_decl_build_call_expr_loc_array" "#include #include #include " if test "x$ac_cv_have_decl_build_call_expr_loc_array" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "build_call_expr_loc_vec" "ac_cv_have_decl_build_call_expr_loc_vec" "#include #include #include " if test "x$ac_cv_have_decl_build_call_expr_loc_vec" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "build_array_ref" "ac_cv_have_decl_build_array_ref" "#include #include #include " if test "x$ac_cv_have_decl_build_array_ref" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_ARRAY_REF $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "build_zero_cst" "ac_cv_have_decl_build_zero_cst" "#include #include #include " if test "x$ac_cv_have_decl_build_zero_cst" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILD_ZERO_CST $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "builtin_decl_explicit" "ac_cv_have_decl_builtin_decl_explicit" "#include #include #include " if test "x$ac_cv_have_decl_builtin_decl_explicit" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_BUILTIN_DECL_EXPLICIT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "ptr_derefs_may_alias_p" "ac_cv_have_decl_ptr_derefs_may_alias_p" "#include #include #include " if test "x$ac_cv_have_decl_ptr_derefs_may_alias_p" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PTR_DEREFS_MAY_ALIAS_P $ac_have_decl _ACEOF for ac_header in c-common.h c-pragma.h c-family/c-common.h c-family/c-pragma.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#include #include " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_member "$LINENO" "struct attribute_spec" "affects_type_identity" "ac_cv_member_struct_attribute_spec_affects_type_identity" "#include #include " if test "x$ac_cv_member_struct_attribute_spec_affects_type_identity" = xyes; then : $as_echo "#define HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY 1" >>confdefs.h fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" cat >>confdefs.h <<_ACEOF #define STARPU_INCLUDE_DIR "`test "x$prefix" = xNONE && prefix=$ac_default_prefix ; eval "echo $includedir"`/starpu/$STARPU_EFFECTIVE_VERSION" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking which compiler to use to build GCC plug-ins" >&5 $as_echo_n "checking which compiler to use to build GCC plug-ins... " >&6; } if ${ac_cv_starpu_gcc_for_plugin+:} false; then : $as_echo_n "(cached) " >&6 else for GCC_FOR_PLUGIN in "$CC" "$CXX" "" do if test "x$GCC_FOR_PLUGIN" = "x"; then break; fi cat > conftest.c < #include #include int plugin_is_GPL_compatible; extern struct cpp_reader *parse_in; /* C-family front-ends */ static void define_something (void *gcc_data, void *user_data) { cpp_define (parse_in, "CONFTEST_GCC_PLUGIN=1"); } int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { if (!plugin_default_version_check (version, &gcc_version)) return 1; register_callback ("conftest", PLUGIN_START_UNIT, define_something, NULL); return 0; } END_OF_CONFTEST # Build the plug-in. rm -f conftest.so GCC_PLUGIN_INCLUDE_DIR="`"$CC" -print-file-name=plugin`/include" save_CPPFLAGS="$CPPFLAGS" save_LDFLAGS="$LDFLAGS" CPPFLAGS="-I$GCC_PLUGIN_INCLUDE_DIR" case "$host_os" in darwin*) # Darwin's linker errors out when encountering undefined # symbols, by default. Tell it to ignore them. LDFLAGS="-Wl,-undefined -Wl,dynamic_lookup";; esac { { ac_try=""$GCC_FOR_PLUGIN" "$CPPFLAGS" -fPIC -shared conftest.c -o conftest.so" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval ""$GCC_FOR_PLUGIN" "$CPPFLAGS" -fPIC -shared conftest.c -o conftest.so") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } || { as_fn_error $? "failed to build a GCC plug-in with \`$GCC_FOR_PLUGIN'" "$LINENO" 5 } CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" # Attempt to use it. save_CFLAGS="$CFLAGS" CFLAGS="-fplugin=$PWD/conftest.so" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef CONFTEST_GCC_PLUGIN # error plug-in not loaded #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_starpu_gcc_for_plugin="$GCC_FOR_PLUGIN" else : fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$save_CFLAGS" rm -f conftest.so conftest.c if test "x$ac_cv_starpu_gcc_for_plugin" != "x"; then # We're done. break fi done if test "x$ac_cv_starpu_gcc_for_plugin" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } as_fn_error $? "could not find a suitable compiler for GCC plug-ins" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_starpu_gcc_for_plugin" >&5 $as_echo "$ac_cv_starpu_gcc_for_plugin" >&6; } GCC_FOR_PLUGIN="$ac_cv_starpu_gcc_for_plugin" if test "$GCC_FOR_PLUGIN" = "$CXX"; then GCC_FOR_PLUGIN_LIBTOOL_TAG="CXX" # Require C++11, for lambdas and `auto'. GCC_FOR_PLUGIN="$GCC_FOR_PLUGIN -std=c++11" else GCC_FOR_PLUGIN_LIBTOOL_TAG="CC" fi fi if test "x$ac_cv_have_gcc_plugins" = "xno" ; then if test "x$enable_gcc_plugin" = "xyes" ; then # Since this was explicitly asked for, error out. as_fn_error $? "This compiler lacks GCC plug-in support." "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GCC plug-ins not supported; StarPU's GCC plug-in will not be built" >&5 $as_echo "$as_me: WARNING: GCC plug-ins not supported; StarPU's GCC plug-in will not be built" >&2;} fi else # What GCC version are we using? if ac_fn_c_compute_int "$LINENO" "__GNUC__" "STARPU_GCC_VERSION_MAJOR" ""; then : fi if ac_fn_c_compute_int "$LINENO" "__GNUC_MINOR__" "STARPU_GCC_VERSION_MINOR" ""; then : fi # The `.so' itself cannot be called `starpu-gcc.so' (because # `-fplugin-arg-' option names and such must match the `.so' # name), so use a meaningful directory name. gccplugindir="\${pkglibdir}/${STARPU_EFFECTIVE_VERSION}/gcc/${STARPU_GCC_VERSION_MAJOR}.${STARPU_GCC_VERSION_MINOR}" # Lines to be inserted in the `.pc' file. GCC_PLUGIN_DIR_PKGCONFIG="gccplugindir=$gccplugindir" GCC_PLUGIN_PKGCONFIG="gccplugin=\${gccplugindir}/starpu.so" fi fi if test "x$ac_cv_have_decl_ptr_derefs_may_alias_p" = "xyes"; then HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE= HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE='#' else HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE='#' HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE= fi if test "x$ac_cv_have_gcc_plugins" = "xyes" ; then build_gcc_plugin="yes" # GNU Guile 1.8/2.0 is used to run the test suite. # Extract the first word of "guile", so it can be a program name with args. set dummy guile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GUILE+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE="$GUILE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GUILE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GUILE=$ac_cv_path_GUILE if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GUILE" != "x"; then if test "x$enable_cpu" = "xyes"; then run_gcc_plugin_test_suite="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CPU back-end disabled; GCC plug-in test suite will not be run" >&5 $as_echo "$as_me: WARNING: CPU back-end disabled; GCC plug-in test suite will not be run" >&2;} run_gcc_plugin_test_suite="no" fi else run_gcc_plugin_test_suite="no" fi else build_gcc_plugin="no" run_gcc_plugin_test_suite="no" fi # Bison is used to generate the C expression parser. The generated # parser is part of the distribution, though. YACC=${YACC-"${am_missing_run}bison"} if test "x$build_gcc_plugin" = "xyes"; then BUILD_GCC_PLUGIN_TRUE= BUILD_GCC_PLUGIN_FALSE='#' else BUILD_GCC_PLUGIN_TRUE='#' BUILD_GCC_PLUGIN_FALSE= fi if test "x$run_gcc_plugin_test_suite" = "xyes"; then RUN_GCC_PLUGIN_TESTS_TRUE= RUN_GCC_PLUGIN_TESTS_FALSE='#' else RUN_GCC_PLUGIN_TESTS_TRUE='#' RUN_GCC_PLUGIN_TESTS_FALSE= fi ############################################################################### # # # SOCL interface # # # ############################################################################### # Check whether --enable-socl was given. if test "${enable_socl+set}" = set; then : enableval=$enable_socl; enable_socl="$enableval" else enable_socl="maybe" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOCL" >&5 $as_echo_n "checking for SOCL... " >&6; } # in case SOCL was explicitely required, but is not available, this is an error if test "x$enable_socl" = "xyes" -a "$have_valid_opencl" = "no" ; then as_fn_error $? "SOCL cannot be enabled without OpenCL" "$LINENO" 5 fi # now we enable SOCL if and only if a proper setup is available if test "x$enable_socl" = "xyes" -o "x$enable_socl" = "xmaybe" ; then build_socl=$have_valid_opencl else build_socl=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $build_socl" >&5 $as_echo "$build_socl" >&6; } if test "x$build_socl" = "xyes"; then BUILD_SOCL_TRUE= BUILD_SOCL_FALSE='#' else BUILD_SOCL_TRUE='#' BUILD_SOCL_FALSE= fi if test "x$build_socl" = "xyes"; then STARPU_USE_SOCL_TRUE= STARPU_USE_SOCL_FALSE='#' else STARPU_USE_SOCL_TRUE='#' STARPU_USE_SOCL_FALSE= fi if test "$build_socl" = "yes" ; then for ac_func in clGetExtensionFunctionAddressForPlatform do : ac_fn_c_check_func "$LINENO" "clGetExtensionFunctionAddressForPlatform" "ac_cv_func_clGetExtensionFunctionAddressForPlatform" if test "x$ac_cv_func_clGetExtensionFunctionAddressForPlatform" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM 1 _ACEOF fi done if test -n "$SOCL_OCL_LIB_OPENCL" -a -f $SOCL_OCL_LIB_OPENCL ; then run_socl_check=yes SOCL_OCL_LIB_OPENCL_DIR=$(dirname $SOCL_OCL_LIB_OPENCL) else run_socl_check=no fi else run_socl_check=no fi ############################################################################### # # # Debugging # # # ############################################################################### # Extract the first word of "gdb", so it can be a program name with args. set dummy gdb; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GDB+:} false; then : $as_echo_n "(cached) " >&6 else case $GDB in [\\/]* | ?:[\\/]*) ac_cv_path_GDB="$GDB" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GDB="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GDB" && ac_cv_path_GDB="not-found" ;; esac fi GDB=$ac_cv_path_GDB if test -n "$GDB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDB" >&5 $as_echo "$GDB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GDB" != "xnot-found"; then cat >>confdefs.h <<_ACEOF #define STARPU_GDB_PATH "$GDB" _ACEOF fi ############################################################################### # # # Examples # # # ############################################################################### # Check whether --enable-build-examples was given. if test "${enable_build_examples+set}" = set; then : enableval=$enable_build_examples; enable_build_examples=$enableval else enable_build_examples=yes fi # check stuff for examples (todo) if test x$enable_build_examples != xno; then BUILD_EXAMPLES_TRUE= BUILD_EXAMPLES_FALSE='#' else BUILD_EXAMPLES_TRUE='#' BUILD_EXAMPLES_FALSE= fi # Check whether --enable-opengl-render was given. if test "${enable_opengl_render+set}" = set; then : enableval=$enable_opengl_render; enable_opengl_render=$enableval else enable_opengl_render=no fi if test x$enable_opengl_render = xyes; then _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glutInit in -lglut" >&5 $as_echo_n "checking for glutInit in -lglut... " >&6; } if ${ac_cv_lib_glut_glutInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lglut $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glutInit (); int main () { return glutInit (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_glut_glutInit=yes else ac_cv_lib_glut_glutInit=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_glut_glutInit" >&5 $as_echo "$ac_cv_lib_glut_glutInit" >&6; } if test "x$ac_cv_lib_glut_glutInit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLUT 1 _ACEOF LIBS="-lglut $LIBS" else as_fn_error $? "cannot find glut" "$LINENO" 5 fi STARPU_OPENGL_RENDER_LDFLAGS="$STARPU_OPENGL_RENDER_LDFLAGS $LIBS" LIBS=$_LIBS_SAV _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXCreateContext in -lGL" >&5 $as_echo_n "checking for glXCreateContext in -lGL... " >&6; } if ${ac_cv_lib_GL_glXCreateContext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glXCreateContext (); int main () { return glXCreateContext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GL_glXCreateContext=yes else ac_cv_lib_GL_glXCreateContext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXCreateContext" >&5 $as_echo "$ac_cv_lib_GL_glXCreateContext" >&6; } if test "x$ac_cv_lib_GL_glXCreateContext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGL 1 _ACEOF LIBS="-lGL $LIBS" else as_fn_error $? "cannot find GL" "$LINENO" 5 fi STARPU_OPENGL_RENDER_LDFLAGS="$STARPU_OPENGL_RENDER_LDFLAGS $LIBS" LIBS=$_LIBS_SAV _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluLookAt in -lGLU" >&5 $as_echo_n "checking for gluLookAt in -lGLU... " >&6; } if ${ac_cv_lib_GLU_gluLookAt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLU $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluLookAt (); int main () { return gluLookAt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GLU_gluLookAt=yes else ac_cv_lib_GLU_gluLookAt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluLookAt" >&5 $as_echo "$ac_cv_lib_GLU_gluLookAt" >&6; } if test "x$ac_cv_lib_GLU_gluLookAt" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLU 1 _ACEOF LIBS="-lGLU $LIBS" else as_fn_error $? "cannot find GLU" "$LINENO" 5 fi STARPU_OPENGL_RENDER_LDFLAGS="$STARPU_OPENGL_RENDER_LDFLAGS $LIBS" LIBS=$_LIBS_SAV $as_echo "#define STARPU_OPENGL_RENDER 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OpenGL rendering is enabled" >&5 $as_echo_n "checking whether OpenGL rendering is enabled... " >&6; } STARPU_OPENGL_RENDER=$enable_opengl_render { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_opengl_render" >&5 $as_echo "$enable_opengl_render" >&6; } if test "x$enable_opengl_render" = xyes; then HAVE_OPENGL_TRUE= HAVE_OPENGL_FALSE='#' else HAVE_OPENGL_TRUE='#' HAVE_OPENGL_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi if test "x$no_x" != "xyes"; then $as_echo "#define STARPU_HAVE_X11 1" >>confdefs.h fi if test "x$no_x" != "xyes"; then HAVE_X11_TRUE= HAVE_X11_FALSE='#' else HAVE_X11_TRUE='#' HAVE_X11_FALSE= fi # In case there are BLAS kernels that are used by the example applications # we may specify which library to use. Note that this is not used for StarPU # itself. blas_lib=maybe # Check whether --enable-blas-lib was given. if test "${enable_blas_lib+set}" = set; then : enableval=$enable_blas_lib; if test "x$enableval" = "xatlas" ; then blas_lib=atlas elif test "x$enableval" = "xgoto" ; then blas_lib=goto elif test "x$enableval" = "xnone" ; then blas_lib=none elif test x$enableval = 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; then # Should we use MKL ? # 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; LDFLAGS="${LDFLAGS} $withval" blas_lib=mkl fi if test x$blas_lib = xmkl; then $as_echo "#define STARPU_MKL 1" >>confdefs.h fi fi if test x$blas_lib = xmaybe; then #perhaps it is possible to use some BLAS lib from the system use_system_blas=no _LIBS_SAV="$LIBS" LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sgemm_" >&5 $as_echo_n "checking for library containing sgemm_... " >&6; } if ${ac_cv_search_sgemm_+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sgemm_ (); int main () { return sgemm_ (); ; return 0; } _ACEOF for ac_lib in '' blas; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sgemm_=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sgemm_+:} false; then : break fi done if ${ac_cv_search_sgemm_+:} false; then : else ac_cv_search_sgemm_=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sgemm_" >&5 $as_echo "$ac_cv_search_sgemm_" >&6; } ac_res=$ac_cv_search_sgemm_ if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" use_system_blas=yes fi STARPU_BLAS_LDFLAGS="$STARPU_BLAS_LDFLAGS $LIBS" LIBS=$_LIBS_SAV if test x$use_system_blas = xyes; then $as_echo "#define STARPU_SYSTEM_BLAS 1" >>confdefs.h blas_lib=system elif test x"$BLAS_LIBS" != x; then $as_echo "#define STARPU_SYSTEM_BLAS 1" >>confdefs.h STARPU_BLAS_LDFLAGS="$BLAS_LIBS" blas_lib=system else blas_lib=none fi fi if test x$blas_lib = xatlas; then ATLAS_BLAS_LIB_TRUE= ATLAS_BLAS_LIB_FALSE='#' else ATLAS_BLAS_LIB_TRUE='#' ATLAS_BLAS_LIB_FALSE= fi if test x$blas_lib = xgoto; then GOTO_BLAS_LIB_TRUE= GOTO_BLAS_LIB_FALSE='#' else GOTO_BLAS_LIB_TRUE='#' GOTO_BLAS_LIB_FALSE= fi if test x$blas_lib = xmkl; then MKL_BLAS_LIB_TRUE= MKL_BLAS_LIB_FALSE='#' else MKL_BLAS_LIB_TRUE='#' MKL_BLAS_LIB_FALSE= fi if test x$blas_lib = xsystem; then SYSTEM_BLAS_LIB_TRUE= SYSTEM_BLAS_LIB_FALSE='#' else SYSTEM_BLAS_LIB_TRUE='#' SYSTEM_BLAS_LIB_FALSE= fi if test x$blas_lib = xnone -a x$enable_simgrid = xno; then NO_BLAS_LIB_TRUE= NO_BLAS_LIB_FALSE='#' else NO_BLAS_LIB_TRUE='#' NO_BLAS_LIB_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking which BLAS lib should be used" >&5 $as_echo_n "checking which BLAS lib should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $blas_lib" >&5 $as_echo "$blas_lib" >&6; } BLAS_LIB=$blas_lib ########################################## # FFT # ########################################## have_fftw=no have_fftwf=no have_fftwl=no fft_support=no # Check whether --enable-starpufft was given. if test "${enable_starpufft+set}" = set; then : enableval=$enable_starpufft; enable_starpufft=$enableval else enable_starpufft=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTW" >&5 $as_echo_n "checking for FFTW... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FFTW_CFLAGS"; then pkg_cv_FFTW_CFLAGS="$FFTW_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTW_CFLAGS=`$PKG_CONFIG --cflags "fftw3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FFTW_LIBS"; then pkg_cv_FFTW_LIBS="$FFTW_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTW_LIBS=`$PKG_CONFIG --libs "fftw3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTW_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3"` else FFTW_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3"` fi # Put the nasty error message in config.log where it belongs echo "$FFTW_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else FFTW_CFLAGS=$pkg_cv_FFTW_CFLAGS FFTW_LIBS=$pkg_cv_FFTW_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_FFTW 1" >>confdefs.h STARPU_HAVE_FFTW=1 have_fftw=yes fi if test x$have_fftw = xyes; then STARPU_HAVE_FFTW_TRUE= STARPU_HAVE_FFTW_FALSE='#' else STARPU_HAVE_FFTW_TRUE='#' STARPU_HAVE_FFTW_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTWF" >&5 $as_echo_n "checking for FFTWF... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FFTWF_CFLAGS"; then pkg_cv_FFTWF_CFLAGS="$FFTWF_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3f\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3f") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWF_CFLAGS=`$PKG_CONFIG --cflags "fftw3f" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FFTWF_LIBS"; then pkg_cv_FFTWF_LIBS="$FFTWF_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3f\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3f") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWF_LIBS=`$PKG_CONFIG --libs "fftw3f" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTWF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3f"` else FFTWF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3f"` fi # Put the nasty error message in config.log where it belongs echo "$FFTWF_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else FFTWF_CFLAGS=$pkg_cv_FFTWF_CFLAGS FFTWF_LIBS=$pkg_cv_FFTWF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_FFTWF 1" >>confdefs.h STARPU_HAVE_FFTWF=1 have_fftwf=yes fi if test x$have_fftwf = xyes; then STARPU_HAVE_FFTWF_TRUE= STARPU_HAVE_FFTWF_FALSE='#' else STARPU_HAVE_FFTWF_TRUE='#' STARPU_HAVE_FFTWF_FALSE= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FFTWL" >&5 $as_echo_n "checking for FFTWL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FFTWL_CFLAGS"; then pkg_cv_FFTWL_CFLAGS="$FFTWL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3l\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWL_CFLAGS=`$PKG_CONFIG --cflags "fftw3l" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FFTWL_LIBS"; then pkg_cv_FFTWL_LIBS="$FFTWL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fftw3l\""; } >&5 ($PKG_CONFIG --exists --print-errors "fftw3l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FFTWL_LIBS=`$PKG_CONFIG --libs "fftw3l" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FFTWL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fftw3l"` else FFTWL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fftw3l"` fi # Put the nasty error message in config.log where it belongs echo "$FFTWL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : elif test $pkg_failed = untried; then : else FFTWL_CFLAGS=$pkg_cv_FFTWL_CFLAGS FFTWL_LIBS=$pkg_cv_FFTWL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define STARPU_HAVE_FFTWL 1" >>confdefs.h HAVE_FFTWFL=1 have_fftwl=yes fi if test x$have_fftwl = xyes; then STARPU_HAVE_FFTWL_TRUE= STARPU_HAVE_FFTWL_FALSE='#' else STARPU_HAVE_FFTWL_TRUE='#' STARPU_HAVE_FFTWL_FALSE= fi if test x$enable_starpufft = xyes -a \( \( x$enable_cpu = xyes -a x$have_fftw = xyes -a x$have_fftwf = xyes \) -o x$have_cufftdoublecomplex = xyes \); then fft_support=yes fi if test x$fft_support = xyes; then BUILD_STARPUFFT_TRUE= BUILD_STARPUFFT_FALSE='#' else BUILD_STARPUFFT_TRUE='#' BUILD_STARPUFFT_FALSE= fi # Check whether --enable-starpufft-examples was given. if test "${enable_starpufft_examples+set}" = set; then : enableval=$enable_starpufft_examples; enable_starpufft_examples=$enableval else enable_starpufft_examples=no fi if test x$enable_starpufft_examples = xyes; then BUILD_STARPUFFT_EXAMPLES_TRUE= BUILD_STARPUFFT_EXAMPLES_FALSE='#' else BUILD_STARPUFFT_EXAMPLES_TRUE='#' BUILD_STARPUFFT_EXAMPLES_FALSE= fi ########################################## # hwloc # ########################################## # 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_from_system=yes use_hwloc=yes else # use specified path use_hwloc_from_system=no if test ! -d "$withval" ; then as_fn_error $? "\"Directory specified for hwloc <$withval> does not exist\"" "$LINENO" 5 fi hwloc_dir=$withval use_hwloc=yes fi else use_hwloc=no fi else use_hwloc=maybe use_hwloc_from_system=yes fi SAVED_LDFLAGS="${LDFLAGS}" SAVED_CPPFLAGS="${CPPFLAGS}" if test "$use_hwloc" = "no"; then : have_valid_hwloc=no else if test "$use_hwloc_from_system" = "yes"; 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 have_pkgconfig_hwloc=no elif test $pkg_failed = untried; then have_valid_hwloc=no have_pkgconfig_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 have_pkgconfig_hwloc=yes fi else #else have_pkgconfig_hwloc=no CPPFLAGS="${SAVED_CPPFLAGS} -I$hwloc_dir/include" ac_fn_c_check_header_mongrel "$LINENO" "hwloc.h" "ac_cv_header_hwloc_h" "$ac_includes_default" if test "x$ac_cv_header_hwloc_h" = xyes; then : have_valid_hwloc=yes else have_valid_hwloc=no fi LDFLAGS="${SAVED_LDFLAGS} -L$hwloc_dir/lib" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lhwloc" >&5 $as_echo_n "checking for main in -lhwloc... " >&6; } if ${ac_cv_lib_hwloc_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lhwloc $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_hwloc_main=yes else ac_cv_lib_hwloc_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_hwloc_main" >&5 $as_echo "$ac_cv_lib_hwloc_main" >&6; } if test "x$ac_cv_lib_hwloc_main" = xyes; then : have_valid_hwloc=yes else have_valid_hwloc=no fi ac_cv_lib_hwloc=ac_cv_lib_hwloc_main fi fi # in case hwloc was explicitely required, but is not available, this is an error if test "$use_hwloc" = "yes" -a "$have_valid_hwloc" = "no"; then : as_fn_error $? "cannot find hwloc" "$LINENO" 5 fi # in case hwloc is not available but was not explicitely disabled, this is an error if test "$have_valid_hwloc" = "no" -a "$use_hwloc" != "no"; then : as_fn_error $? "hwloc 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 hwloc. However, if you really want to use StarPU without enabling hwloc, please restart configure by specifying the option '--without-hwloc'." "$LINENO" 5 fi if test "$have_valid_hwloc" = "yes"; then : $as_echo "#define STARPU_HAVE_HWLOC 1" >>confdefs.h HWLOC_REQUIRES=hwloc STARPU_HAVE_HWLOC=1 if test "$have_pkgconfig_hwloc" = "no"; then : HWLOC_CFLAGS="-I$hwloc_dir/include" HWLOC_LIBS="-L$hwloc_dir/lib -lhwloc" fi fi LDFLAGS="${SAVED_LDFLAGS}" CPPFLAGS="${SAVED_CPPFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether hwloc should be used" >&5 $as_echo_n "checking whether hwloc should be used... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_valid_hwloc" >&5 $as_echo "$have_valid_hwloc" >&6; } # is the header file f77.h available ? ac_fn_c_check_header_mongrel "$LINENO" "f77.h" "ac_cv_header_f77_h" "$ac_includes_default" if test "x$ac_cv_header_f77_h" = xyes; then : have_f77_h=yes else have_f77_h=no fi STARPU_HAVE_F77_H=$have_f77_h if test x$have_f77_h = xyes; then STARPU_HAVE_F77_H_TRUE= STARPU_HAVE_F77_H_FALSE='#' else STARPU_HAVE_F77_H_TRUE='#' STARPU_HAVE_F77_H_FALSE= fi if test x$have_f77_h = xyes; then $as_echo "#define STARPU_HAVE_F77_H 1" >>confdefs.h fi # Check if icc is available for ac_prog in icc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ICC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ICC"; then ac_cv_prog_ICC="$ICC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ICC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ICC=$ac_cv_prog_ICC if test -n "$ICC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICC" >&5 $as_echo "$ICC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ICC" && break done # If cuda and icc are both available, check they are compatible if test "$enable_cuda" = "yes" -a "$ICC" != ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CUDA and ICC are compatible" >&5 $as_echo_n "checking whether CUDA and ICC are compatible... " >&6; } OLD_CC="$CC" CC="$ICC" OLD_CFLAGS="$CFLAGS" CFLAGS="-I$PWD/include -I$srcdir/include" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else ICC="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC="$OLD_CC" CFLAGS="$OLD_CFLAGS" fi # Fortran compiler if test "x$FC" != "x"; then $as_echo "#define STARPU_HAVE_FC /**/" >>confdefs.h fi if test "x$FC" != "x"; then STARPU_HAVE_FC_TRUE= STARPU_HAVE_FC_FALSE='#' else STARPU_HAVE_FC_TRUE='#' STARPU_HAVE_FC_FALSE= 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 /**/" >>confdefs.h fi if test "x$ICC" != "x"; then STARPU_HAVE_ICC_TRUE= STARPU_HAVE_ICC_FALSE='#' else STARPU_HAVE_ICC_TRUE='#' STARPU_HAVE_ICC_FALSE= fi # Do not generate manpages for the tools if we do not have help2man for ac_prog in help2man do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_HELP2MAN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HELP2MAN"; then ac_cv_prog_HELP2MAN="$HELP2MAN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_HELP2MAN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi HELP2MAN=$ac_cv_prog_HELP2MAN if test -n "$HELP2MAN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HELP2MAN" >&5 $as_echo "$HELP2MAN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$HELP2MAN" && break done # Disable on windows if test "$starpu_windows" = "yes" ; then HELP2MAN="" fi if test "x$HELP2MAN" != "x"; then STARPU_HAVE_HELP2MAN_TRUE= STARPU_HAVE_HELP2MAN_FALSE='#' else STARPU_HAVE_HELP2MAN_TRUE='#' STARPU_HAVE_HELP2MAN_FALSE= fi ac_fn_c_check_member "$LINENO" "struct cudaDeviceProp" "pciDomainID" "ac_cv_member_struct_cudaDeviceProp_pciDomainID" "#include " if test "x$ac_cv_member_struct_cudaDeviceProp_pciDomainID" = xyes; then : $as_echo "#define STARPU_HAVE_DOMAINID 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct cudaDeviceProp" "pciBusID" "ac_cv_member_struct_cudaDeviceProp_pciBusID" "#include " if test "x$ac_cv_member_struct_cudaDeviceProp_pciBusID" = xyes; then : $as_echo "#define STARPU_HAVE_BUSID 1" >>confdefs.h fi if true; then STARPU_HAVE_AM111_TRUE= STARPU_HAVE_AM111_FALSE='#' else STARPU_HAVE_AM111_TRUE='#' STARPU_HAVE_AM111_FALSE= fi ########################################## # Documentation # ########################################## # Check whether --enable-build-doc was given. if test "${enable_build_doc+set}" = set; then : enableval=$enable_build_doc; enable_build_doc=$enableval else enable_build_doc=yes fi if test "$enable_build_doc" = "yes" ; then # Check whether doxygen needed tools are installed # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_doxygencommand+:} false; then : $as_echo_n "(cached) " >&6 else case $doxygencommand in [\\/]* | ?:[\\/]*) ac_cv_path_doxygencommand="$doxygencommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_doxygencommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi doxygencommand=$ac_cv_path_doxygencommand if test -n "$doxygencommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doxygencommand" >&5 $as_echo "$doxygencommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$doxygencommand" = "" ; then enable_build_doc="no" else DOXYGEN_VERSION_MAJOR=`$doxygencommand --version| cut -d '.' -f1` DOXYGEN_VERSION_MINOR=`$doxygencommand --version| cut -d '.' -f2` if test $DOXYGEN_VERSION_MAJOR -ge 1 -a $DOXYGEN_VERSION_MINOR -ge 8 ; then enable_build_doc="yes" else enable_build_doc="no" fi fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_pdflatexcommand+:} false; then : $as_echo_n "(cached) " >&6 else case $pdflatexcommand in [\\/]* | ?:[\\/]*) ac_cv_path_pdflatexcommand="$pdflatexcommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_pdflatexcommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi pdflatexcommand=$ac_cv_path_pdflatexcommand if test -n "$pdflatexcommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pdflatexcommand" >&5 $as_echo "$pdflatexcommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$pdflatexcommand" = "" ; then enable_build_doc="no" fi # Extract the first word of "epstopdf", so it can be a program name with args. set dummy epstopdf; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_epstopdfcommand+:} false; then : $as_echo_n "(cached) " >&6 else case $epstopdfcommand in [\\/]* | ?:[\\/]*) ac_cv_path_epstopdfcommand="$epstopdfcommand" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_epstopdfcommand="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi epstopdfcommand=$ac_cv_path_epstopdfcommand if test -n "$epstopdfcommand"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $epstopdfcommand" >&5 $as_echo "$epstopdfcommand" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$epstopdfcommand" = "" ; then enable_build_doc="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether documentation should be compiled" >&5 $as_echo_n "checking whether documentation should be compiled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_build_doc" >&5 $as_echo "$enable_build_doc" >&6; } if test x$enable_build_doc != xno; then BUILD_DOC_TRUE= BUILD_DOC_FALSE='#' else BUILD_DOC_TRUE='#' BUILD_DOC_FALSE= fi ############################################################################### # # # Final settings # # # ############################################################################### # these are the flags needed for static linking LIBSTARPU_LDFLAGS="$STARPU_GLPK_LDFLAGS" LIBSTARPU_LINK=libstarpu-$STARPU_EFFECTIVE_VERSION.la if test x$enable_perf_debug = xyes; then LIBSTARPU_LINK=".libs/libstarpu-$STARPU_EFFECTIVE_VERSION.a $LIBSTARPU_LDFLAGS $HWLOC_LIBS $SIMGRID_LIBS $STARPU_CUDA_LDFLAGS $STARPU_OPENCL_LDFLAGS" fi # File configuration ac_config_commands="$ac_config_commands executable-scripts" # Create links to ICD files in build/socl/vendors directory. SOCL will use this # directory as the OCL_ICD_VENDORS directory SOCL_VENDORS="vendors/install/socl.icd" for icd in /etc/OpenCL/vendors/*.icd ; do if test -f $icd ; then if test "$(basename $icd)" != "socl.icd" ; then new_icd=$(basename $icd) ac_config_links="$ac_config_links socl/vendors/$new_icd:$icd" SOCL_VENDORS="$SOCL_VENDORS vendors/$new_icd" fi fi done ac_config_files="$ac_config_files tests/regression/regression.sh tests/regression/profiles tests/regression/profiles.build.only" ac_config_headers="$ac_config_headers src/common/config.h include/starpu_config.h gcc-plugin/include/starpu-gcc/config.h starpu-top/config.h" SANITIZE=$(echo $CFLAGS | grep sanitize) if test -n "$SANITIZE"; then STARPU_SANITIZE_TRUE= STARPU_SANITIZE_FALSE='#' else STARPU_SANITIZE_TRUE='#' STARPU_SANITIZE_FALSE= fi ac_config_files="$ac_config_files Makefile src/Makefile tools/Makefile tools/starpu_codelet_profile tools/starpu_codelet_histo_profile tools/starpu_workers_activity tools/starpu_paje_draw_histogram tools/starpu_paje_state_stats tools/starpu_paje_summary tools/starpu_paje_sort 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 mpi/libstarpumpi.pc mpi/starpumpi-1.0.pc mpi/starpumpi-1.1.pc starpufft/Makefile starpufft/src/Makefile starpufft/tests/Makefile starpufft/libstarpufft.pc starpufft/starpufft-1.0.pc starpufft/starpufft-1.1.pc examples/Makefile examples/stencil/Makefile tests/Makefile mpi/Makefile mpi/src/Makefile mpi/tests/Makefile mpi/examples/Makefile starpu-top/StarPU-Top.pro starpu-top/StarPU-Top-qwt-embed.pri starpu-top/StarPU-Top-qwt-system.pri gcc-plugin/Makefile gcc-plugin/src/Makefile gcc-plugin/tests/Makefile gcc-plugin/tests/run-test gcc-plugin/examples/Makefile sc_hypervisor/Makefile sc_hypervisor/src/Makefile sc_hypervisor/examples/Makefile doc/Makefile doc/doxygen/Makefile doc/doxygen/doxygen-config.cfg doc/doxygen/doxygen_filter.sh tools/mvsc/starpu_var.bat" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_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_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_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_USE_CPU_TRUE}" && test -z "${STARPU_USE_CPU_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_CPU\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_CUDA_TRUE}" && test -z "${STARPU_USE_CUDA_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_CUDA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_MAGMA_TRUE}" && test -z "${STARPU_HAVE_MAGMA_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_MAGMA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_CUFFTDOUBLECOMPLEX_TRUE}" && test -z "${STARPU_HAVE_CUFFTDOUBLECOMPLEX_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_CUFFTDOUBLECOMPLEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_OPENCL_TRUE}" && test -z "${STARPU_USE_OPENCL_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_OPENCL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_SIMGRID_TRUE}" && test -z "${STARPU_SIMGRID_FALSE}"; then as_fn_error $? "conditional \"STARPU_SIMGRID\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_COVERAGE_ENABLED_TRUE}" && test -z "${STARPU_COVERAGE_ENABLED_FALSE}"; then as_fn_error $? "conditional \"STARPU_COVERAGE_ENABLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_FXT_TRUE}" && test -z "${STARPU_USE_FXT_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_FXT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_MPI_CHECK_TRUE}" && test -z "${STARPU_MPI_CHECK_FALSE}"; then as_fn_error $? "conditional \"STARPU_MPI_CHECK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_MPI_TRUE}" && test -z "${USE_MPI_FALSE}"; then as_fn_error $? "conditional \"USE_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STARPU_TOP_TRUE}" && test -z "${BUILD_STARPU_TOP_FALSE}"; then as_fn_error $? "conditional \"BUILD_STARPU_TOP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_DEVEL_TRUE}" && test -z "${STARPU_DEVEL_FALSE}"; then as_fn_error $? "conditional \"STARPU_DEVEL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_PTR_DEREFS_MAY_ALIAS_P_TRUE}" && test -z "${HAVE_PTR_DEREFS_MAY_ALIAS_P_FALSE}"; then as_fn_error $? "conditional \"HAVE_PTR_DEREFS_MAY_ALIAS_P\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_GCC_PLUGIN_TRUE}" && test -z "${BUILD_GCC_PLUGIN_FALSE}"; then as_fn_error $? "conditional \"BUILD_GCC_PLUGIN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RUN_GCC_PLUGIN_TESTS_TRUE}" && test -z "${RUN_GCC_PLUGIN_TESTS_FALSE}"; then as_fn_error $? "conditional \"RUN_GCC_PLUGIN_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_SOCL_TRUE}" && test -z "${BUILD_SOCL_FALSE}"; then as_fn_error $? "conditional \"BUILD_SOCL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_USE_SOCL_TRUE}" && test -z "${STARPU_USE_SOCL_FALSE}"; then as_fn_error $? "conditional \"STARPU_USE_SOCL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENGL_TRUE}" && test -z "${HAVE_OPENGL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENGL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_X11_TRUE}" && test -z "${HAVE_X11_FALSE}"; then as_fn_error $? "conditional \"HAVE_X11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ATLAS_BLAS_LIB_TRUE}" && test -z "${ATLAS_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"ATLAS_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GOTO_BLAS_LIB_TRUE}" && test -z "${GOTO_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"GOTO_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MKL_BLAS_LIB_TRUE}" && test -z "${MKL_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"MKL_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SYSTEM_BLAS_LIB_TRUE}" && test -z "${SYSTEM_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"SYSTEM_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NO_BLAS_LIB_TRUE}" && test -z "${NO_BLAS_LIB_FALSE}"; then as_fn_error $? "conditional \"NO_BLAS_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FFTW_TRUE}" && test -z "${STARPU_HAVE_FFTW_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FFTW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FFTWF_TRUE}" && test -z "${STARPU_HAVE_FFTWF_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FFTWF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_FFTWL_TRUE}" && test -z "${STARPU_HAVE_FFTWL_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_FFTWL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STARPUFFT_TRUE}" && test -z "${BUILD_STARPUFFT_FALSE}"; then as_fn_error $? "conditional \"BUILD_STARPUFFT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_STARPUFFT_EXAMPLES_TRUE}" && test -z "${BUILD_STARPUFFT_EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"BUILD_STARPUFFT_EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_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_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_ICC_TRUE}" && test -z "${STARPU_HAVE_ICC_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_ICC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_HELP2MAN_TRUE}" && test -z "${STARPU_HAVE_HELP2MAN_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_HELP2MAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_AM111_TRUE}" && test -z "${STARPU_HAVE_AM111_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_AM111\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STARPU_HAVE_AM111_TRUE}" && test -z "${STARPU_HAVE_AM111_FALSE}"; then as_fn_error $? "conditional \"STARPU_HAVE_AM111\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_DOC_TRUE}" && test -z "${BUILD_DOC_FALSE}"; then as_fn_error $? "conditional \"BUILD_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${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.1.5, 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.1.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`' predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`' postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`' predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`' postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ LD_F77 \ LD_FC \ reload_flag_CXX \ reload_flag_F77 \ reload_flag_FC \ compiler_CXX \ compiler_F77 \ compiler_FC \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_F77 \ lt_prog_compiler_no_builtin_flag_FC \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_pic_FC \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_wl_FC \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_F77 \ lt_prog_compiler_static_FC \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_F77 \ lt_cv_prog_compiler_c_o_FC \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_F77 \ export_dynamic_flag_spec_FC \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_F77 \ whole_archive_flag_spec_FC \ compiler_needs_object_CXX \ compiler_needs_object_F77 \ compiler_needs_object_FC \ with_gnu_ld_CXX \ with_gnu_ld_F77 \ with_gnu_ld_FC \ allow_undefined_flag_CXX \ allow_undefined_flag_F77 \ allow_undefined_flag_FC \ no_undefined_flag_CXX \ no_undefined_flag_F77 \ no_undefined_flag_FC \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_FC \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_F77 \ hardcode_libdir_separator_FC \ exclude_expsyms_CXX \ exclude_expsyms_F77 \ exclude_expsyms_FC \ include_expsyms_CXX \ include_expsyms_F77 \ include_expsyms_FC \ file_list_spec_CXX \ file_list_spec_F77 \ file_list_spec_FC \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_F77 \ compiler_lib_search_dirs_FC \ predep_objects_CXX \ predep_objects_F77 \ predep_objects_FC \ postdep_objects_CXX \ postdep_objects_F77 \ postdep_objects_FC \ predeps_CXX \ predeps_F77 \ predeps_FC \ postdeps_CXX \ postdeps_F77 \ postdeps_FC \ compiler_lib_search_path_CXX \ compiler_lib_search_path_F77 \ compiler_lib_search_path_FC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ reload_cmds_F77 \ reload_cmds_FC \ old_archive_cmds_CXX \ old_archive_cmds_F77 \ old_archive_cmds_FC \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_F77 \ old_archive_from_new_cmds_FC \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_F77 \ old_archive_from_expsyms_cmds_FC \ archive_cmds_CXX \ archive_cmds_F77 \ archive_cmds_FC \ archive_expsym_cmds_CXX \ archive_expsym_cmds_F77 \ archive_expsym_cmds_FC \ module_cmds_CXX \ module_cmds_F77 \ module_cmds_FC \ module_expsym_cmds_CXX \ module_expsym_cmds_F77 \ module_expsym_cmds_FC \ export_symbols_cmds_CXX \ export_symbols_cmds_F77 \ export_symbols_cmds_FC \ prelink_cmds_CXX \ prelink_cmds_F77 \ prelink_cmds_FC \ postlink_cmds_CXX \ postlink_cmds_F77 \ postlink_cmds_FC; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "executable-scripts") CONFIG_COMMANDS="$CONFIG_COMMANDS executable-scripts" ;; "socl/vendors/$new_icd") CONFIG_LINKS="$CONFIG_LINKS socl/vendors/$new_icd:$icd" ;; "tests/regression/regression.sh") CONFIG_FILES="$CONFIG_FILES tests/regression/regression.sh" ;; "tests/regression/profiles") CONFIG_FILES="$CONFIG_FILES tests/regression/profiles" ;; "tests/regression/profiles.build.only") CONFIG_FILES="$CONFIG_FILES tests/regression/profiles.build.only" ;; "src/common/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/common/config.h" ;; "include/starpu_config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/starpu_config.h" ;; "gcc-plugin/include/starpu-gcc/config.h") CONFIG_HEADERS="$CONFIG_HEADERS gcc-plugin/include/starpu-gcc/config.h" ;; "starpu-top/config.h") CONFIG_HEADERS="$CONFIG_HEADERS starpu-top/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "tools/starpu_codelet_profile") CONFIG_FILES="$CONFIG_FILES tools/starpu_codelet_profile" ;; "tools/starpu_codelet_histo_profile") CONFIG_FILES="$CONFIG_FILES tools/starpu_codelet_histo_profile" ;; "tools/starpu_workers_activity") CONFIG_FILES="$CONFIG_FILES tools/starpu_workers_activity" ;; "tools/starpu_paje_draw_histogram") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_draw_histogram" ;; "tools/starpu_paje_state_stats") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_state_stats" ;; "tools/starpu_paje_summary") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_summary" ;; "tools/starpu_paje_sort") CONFIG_FILES="$CONFIG_FILES tools/starpu_paje_sort" ;; "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" ;; "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" ;; "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" ;; "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" ;; "mpi/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/Makefile" ;; "mpi/src/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/src/Makefile" ;; "mpi/tests/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/tests/Makefile" ;; "mpi/examples/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/examples/Makefile" ;; "starpu-top/StarPU-Top.pro") CONFIG_FILES="$CONFIG_FILES starpu-top/StarPU-Top.pro" ;; "starpu-top/StarPU-Top-qwt-embed.pri") CONFIG_FILES="$CONFIG_FILES starpu-top/StarPU-Top-qwt-embed.pri" ;; "starpu-top/StarPU-Top-qwt-system.pri") CONFIG_FILES="$CONFIG_FILES starpu-top/StarPU-Top-qwt-system.pri" ;; "gcc-plugin/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/Makefile" ;; "gcc-plugin/src/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/src/Makefile" ;; "gcc-plugin/tests/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/tests/Makefile" ;; "gcc-plugin/tests/run-test") CONFIG_FILES="$CONFIG_FILES gcc-plugin/tests/run-test" ;; "gcc-plugin/examples/Makefile") CONFIG_FILES="$CONFIG_FILES gcc-plugin/examples/Makefile" ;; "sc_hypervisor/Makefile") CONFIG_FILES="$CONFIG_FILES sc_hypervisor/Makefile" ;; "sc_hypervisor/src/Makefile") CONFIG_FILES="$CONFIG_FILES sc_hypervisor/src/Makefile" ;; "sc_hypervisor/examples/Makefile") CONFIG_FILES="$CONFIG_FILES sc_hypervisor/examples/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/doxygen/Makefile") CONFIG_FILES="$CONFIG_FILES doc/doxygen/Makefile" ;; "doc/doxygen/doxygen-config.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen/doxygen-config.cfg" ;; "doc/doxygen/doxygen_filter.sh") CONFIG_FILES="$CONFIG_FILES doc/doxygen/doxygen_filter.sh" ;; "tools/mvsc/starpu_var.bat") CONFIG_FILES="$CONFIG_FILES tools/mvsc/starpu_var.bat" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 $as_echo "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX F77 FC " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: F77 # The linker used to build libraries. LD=$lt_LD_F77 # How to create reloadable object files. reload_flag=$lt_reload_flag_F77 reload_cmds=$lt_reload_cmds_F77 # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_F77 # A language specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU compiler? with_gcc=$GCC_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_F77 # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_F77 # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_F77 # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_F77 # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_F77 # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_F77 # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_F77 # Specify filename containing input files. file_list_spec=$lt_file_list_spec_F77 # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_F77 postdep_objects=$lt_postdep_objects_F77 predeps=$lt_predeps_F77 postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # ### END LIBTOOL TAG CONFIG: F77 _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: FC # The linker used to build libraries. LD=$lt_LD_FC # How to create reloadable object files. reload_flag=$lt_reload_flag_FC reload_cmds=$lt_reload_cmds_FC # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_FC # A language specific compiler. CC=$lt_compiler_FC # Is the compiler the GNU compiler? with_gcc=$GCC_FC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_FC # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_FC # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_FC # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_FC # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_FC # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_FC archive_expsym_cmds=$lt_archive_expsym_cmds_FC # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_FC module_expsym_cmds=$lt_module_expsym_cmds_FC # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_FC # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_FC # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_FC # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_FC # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_FC # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_FC # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_FC # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_FC # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_FC # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_FC # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_FC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_FC # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_FC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_FC # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_FC # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_FC # Specify filename containing input files. file_list_spec=$lt_file_list_spec_FC # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_FC # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_FC postdep_objects=$lt_postdep_objects_FC predeps=$lt_predeps_FC postdeps=$lt_postdeps_FC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_FC # ### END LIBTOOL TAG CONFIG: FC _LT_EOF ;; "executable-scripts":C) chmod +x tests/regression/regression.sh chmod +x gcc-plugin/tests/run-test chmod +x tools/starpu_codelet_profile chmod +x tools/starpu_codelet_histo_profile chmod +x tools/starpu_workers_activity chmod +x tools/starpu_paje_draw_histogram chmod +x tools/starpu_paje_state_stats chmod +x tools/starpu_paje_summary chmod +x tools/starpu_paje_sort chmod +x doc/doxygen/doxygen_filter.sh ;; 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 Compile-time limits (change these with --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev, --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 memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $have_cuda_memcpy_peer Allocation cache: $enable_allocation_cache Magma enabled: $have_magma BLAS library: $blas_lib hwloc: $have_valid_hwloc FxT trace enabled: $use_fxt StarPU-Top: $build_starpu_top Documentation: $enable_build_doc Examples: $enable_build_examples StarPU Extensions: MPI enabled: $use_mpi MPI test suite: $running_mpi_check FFT Support: $fft_support GCC plug-in: $build_gcc_plugin GCC plug-in test suite (requires GNU Guile): $run_gcc_plugin_test_suite SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ac_cv_header_Ayudame_h " >&5 $as_echo "$as_me: CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl Compile-time limits (change these with --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev, --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 memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $have_cuda_memcpy_peer Allocation cache: $enable_allocation_cache Magma enabled: $have_magma BLAS library: $blas_lib hwloc: $have_valid_hwloc FxT trace enabled: $use_fxt StarPU-Top: $build_starpu_top Documentation: $enable_build_doc Examples: $enable_build_examples StarPU Extensions: MPI enabled: $use_mpi MPI test suite: $running_mpi_check FFT Support: $fft_support GCC plug-in: $build_gcc_plugin GCC plug-in test suite (requires GNU Guile): $run_gcc_plugin_test_suite SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ac_cv_header_Ayudame_h " >&6;} if test "$build_socl" = "yes" -a "$run_socl_check" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SOCL test suite will not be run as the environment variable SOCL_OCL_LIB_OPENCL is not defined. To run the tests, you need to install the OCL implementation of ICD (https://forge.imag.fr/projects/ocl-icd/ or Debian package ocl-icd-libopencl1) and set the variable SOCL_OCL_LIB_OPENCL to the location of the libOpenCL.so." >&5 $as_echo "$as_me: WARNING: SOCL test suite will not be run as the environment variable SOCL_OCL_LIB_OPENCL is not defined. To run the tests, you need to install the OCL implementation of ICD (https://forge.imag.fr/projects/ocl-icd/ or Debian package ocl-icd-libopencl1) and set the variable SOCL_OCL_LIB_OPENCL to the location of the libOpenCL.so." >&6;} fi if test x"$have_valid_hwloc" = xno -a "$enable_simgrid" = "no" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: hwloc was not enabled. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install hwloc" >&5 $as_echo "$as_me: WARNING: hwloc was not enabled. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install hwloc" >&6;} fi starpu-1.1.5/build-aux/0002755000373600000000000000000012571541166011732 500000000000000starpu-1.1.5/build-aux/depcomp0000755000373600000000000005601612571536634013241 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.1.5/build-aux/config.sub0000755000373600000000000010535412571536631013644 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-08-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: starpu-1.1.5/build-aux/test-driver0000755000373600000000000001027712571536634014061 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2013 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 estatus=1 fi case $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 outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.1.5/build-aux/ar-lib0000755000373600000000000001330212571536631012744 00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2013 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: starpu-1.1.5/build-aux/ltmain.sh0000644000373600000000000105202612571536624013501 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.7 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.7" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 starpu-1.1.5/build-aux/svn2cl.xsl0000644000373600000000000003735112571536600013615 00000000000000 / / [r ] * , . , [DEL] [CPY] [ADD] starpu-1.1.5/build-aux/missing0000755000373600000000000001533012571536631013252 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.1.5/build-aux/ylwrap0000755000373600000000000001531212571536632013120 00000000000000#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2013-01-12.17; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.1.5/build-aux/install-sh0000755000373600000000000003325512571536631013665 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # 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_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done 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 do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/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. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.1.5/build-aux/compile0000755000373600000000000001624512571536631013237 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: starpu-1.1.5/aclocal.m40000644000373600000000000012621012571536626011625 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 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-2013 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.14' 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.14.1], [], [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.14.1])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-2013 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-2013 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], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 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-2013 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-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 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. 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 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-2013 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}" != 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-2013 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-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 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-2013 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-2013 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-2013 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-2013 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-2013 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-2013 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-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acinclude.m4]) m4_include([m4/gcc.m4]) m4_include([m4/libs.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/pkg.m4]) starpu-1.1.5/starpu-top/0002755000373600000000000000000012571541160012150 500000000000000starpu-1.1.5/starpu-top/aboutdialog.cpp0000644000373600000000000000225512571536557015106 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "aboutdialog.h" #include "ui_aboutdialog.h" #include AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDialog) { ui->setupUi(this); qDebug() << "AboutDialog : initializing"; } AboutDialog::~AboutDialog() { qDebug() << "AboutDialog : terminating"; delete ui; } starpu-1.1.5/starpu-top/abstractwidgetwindow.h0000644000373600000000000000440312571536557016515 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ABSTRACTWIDGETWINDOW_H #define ABSTRACTWIDGETWINDOW_H class WidgetWindowsManager; class MainWindow; #include #include #include #include class AbstractWidgetWindow : public QWidget { /* Abstract class representing a widget window. It can be put "outside" (flying window) or "inside" (MDI) at any moment. The widget window is managed by the widget windows manager. */ Q_OBJECT public: explicit AbstractWidgetWindow( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside = false); virtual ~AbstractWidgetWindow(); // Getters int windowId() const; bool isInside() const; // Setters void setInside(bool inside); protected: // Components WidgetWindowsManager *_widgetWindowsManager; MainWindow *_mainWindow; QPoint dragPosition; // GUI components QSizeGrip *_sizeGrip; QToolButton *_inOutButton; // Metadata int _windowId; bool _inside; // Window id generation int generateWindowId(); // Events void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void resizeEvent(QResizeEvent *event); virtual void closeEvent(QCloseEvent *ce) = 0; private slots: // GUI interactions void on_inOutButton_clicked(); }; #endif // ABSTRACTWIDGETWINDOW_H starpu-1.1.5/starpu-top/StarPU-Top.pro.in0000644000373600000000000000014312571536560015141 00000000000000SRCDIR=@srcdir@ include ($$SRCDIR/StarPU-Top-common.pri) include (StarPU-Top-qwt-@QWT_PRI@.pri) starpu-1.1.5/starpu-top/StarPU-Top-qwt-system.pri0000644000373600000000000000003312571536666016666 00000000000000LIBS += INCLUDEPATH += starpu-1.1.5/starpu-top/dataaggregatorwidget.cpp0000644000373600000000000003043412571536555016772 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "dataaggregatorwidget.h" #include "mainwindow.h" #include "widgetwindowsmanager.h" #include "datawidget.h" #include "configurationmanager.h" #include #include #include #include #include #include #include DataAggregatorWidget::DataAggregatorWidget( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside, QList dataIds) : AbstractWidgetWindow(widgetWindowsManager, mainWindow, inside) { // Init UI setWindowTitle(tr("Aggregator")); setWindowIcon(QIcon(":/images/widget.png")); // Buttons QToolBar *buttonsToolBar = new QToolBar(); // In/out button buttonsToolBar->addWidget(_inOutButton); // Add data button _addDataButton = new QToolButton(); _addDataButton->setIcon(QIcon(":/images/add.png")); _addDataButton->setPopupMode(QToolButton::InstantPopup); _addDataButton->setToolTip(tr("Add data source")); buttonsToolBar->addSeparator(); buttonsToolBar->addWidget(_addDataButton); // Remove data button _removeDataButton = new QToolButton(); _removeDataButton->setIcon(QIcon(":/images/remove.png")); _removeDataButton->setPopupMode(QToolButton::InstantPopup); _removeDataButton->setToolTip(tr("Remove data source")); buttonsToolBar->addWidget(_removeDataButton); // Set layout QVBoxLayout *layout = new QVBoxLayout(); setLayout(layout); layout->addWidget(buttonsToolBar); // Init actions for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++) { if (_mainWindow->dataDescriptions()->at(i)->type != DATA_TYPE_BOOL) { QAction *addDataAction = new QAction( _mainWindow->dataDescriptions()->at(i)->descriptionString, _addDataButton); addDataAction->setData(_mainWindow->dataDescriptions()->at(i)->id); QObject::connect(addDataAction, SIGNAL(triggered()), this, SLOT(dataAdded())); if (_mainWindow->dataDescriptions()->at(i)->widget == DATA_WIDGET_NONE) { addDataAction->setEnabled(false); } _addDataButton->addAction(addDataAction); } } // Init curve colors _curveColors.append(Qt::black); _curveColors.append(Qt::red); _curveColors.append(Qt::green); _curveColors.append(Qt::blue); _curveColors.append(Qt::magenta); _curveColors.append(Qt::yellow); _curveColors.append(Qt::gray); _curveColors.append(Qt::darkRed); _curveColors.append(Qt::darkGreen); _curveColors.append(Qt::darkBlue); _curveColors.append(Qt::darkCyan); _curveColors.append(Qt::darkMagenta); _curveColors.append(Qt::darkYellow); _curveColors.append(Qt::cyan); _colorIterator = new QListIterator (_curveColors); // Create internal widget createInternalWidget(); // Know when a data source is disabled / enabled QObject::connect(_mainWindow, SIGNAL(dataDisabled(int)), this, SLOT(disableData(int))); QObject::connect(_mainWindow, SIGNAL(dataEnabled(int)), this, SLOT(enableData(int))); // Init data if (dataIds.empty() == false) { for (int i = 0; i < dataIds.count(); i++) { addData(dataIds.at(i)); } } // Setup automatic cleanup QObject::connect(this, SIGNAL(destroyed()), _mainWindow, SLOT(removeDestroyedDataAggregatorWidgets())); qDebug() << "DataAggregatorWidget" << windowId() << ": initializing"; } DataAggregatorWidget::~DataAggregatorWidget() { delete _colorIterator; delete _addDataButton; delete _removeDataButton; delete _plot; qDebug() << "DataAggregatorWidget" << windowId() << ": terminating"; } void DataAggregatorWidget::closeEvent(QCloseEvent *ce) { ce->accept(); } void DataAggregatorWidget::createInternalWidget() { _plot = new QwtPlot(QwtText(tr("Aggregator"))); QwtLegend *legend = new QwtLegend; legend->setItemMode(QwtLegend::CheckableItem); _plot->insertLegend(legend, QwtPlot::BottomLegend); _plot->setMinimumSize(300, 200); _plot->setAttribute(Qt::WA_DeleteOnClose); layout()->addWidget(_plot); QObject::connect(_plot, SIGNAL(legendChecked(QwtPlotItem *, bool)), SLOT(curveChecked(QwtPlotItem *, bool))); } void DataAggregatorWidget::addData(int dataId) { DataWidget *dataWidget = _mainWindow->dataWidgetFromDataId(dataId); if (dataWidget != 0) { qDebug() << "Aggregator" << _windowId << ": adding new data of id" << dataId; switch (dataWidget->description()->type) { case DATA_TYPE_INT: { QObject::connect(dataWidget, SIGNAL(valueChanged(int,int)), this, SLOT(update(int,int))); break; } case DATA_TYPE_FLOAT: { QObject::connect(dataWidget, SIGNAL(valueChanged(double,int)), this, SLOT(update(double,int))); break; } default: qDebug() << "Aggregator" << _windowId << ": attempt to add data of unsupported type (id :" << dataId << ")"; } QwtPlotCurve *curve = new QwtPlotCurve( _mainWindow->dataDescriptionFromId(dataId)->descriptionString); if (_mainWindow->configurationManager()->antialiasing() == true) { curve->setRenderHint(QwtPlotItem::RenderAntialiased); } QColor c; if (_colorIterator->hasNext()) { c = _colorIterator->next(); c.setAlpha(150); curve->setPen(c); } _curves.insert(dataId, curve); CurveData curveData; curveData.xData = new QVector (); curveData.yData = new QVector (); _curvesData.insert(dataId, curveData); curve->attach(_plot); } else { qDebug() << "Aggregator" << _windowId << ": failed to add data of id" << dataId; } } void DataAggregatorWidget::removeData(int dataId) { DataWidget *dataWidget = _mainWindow->dataWidgetFromDataId(dataId); if (dataWidget != 0) { qDebug() << "Aggregator" << _windowId << ": removing data of id" << dataId; switch (dataWidget->description()->type) { case DATA_TYPE_INT: QObject::disconnect(dataWidget, SIGNAL(valueChanged(int,int)), this, SLOT(update(int,int))); break; case DATA_TYPE_FLOAT: QObject::disconnect(dataWidget, SIGNAL(valueChanged(double,int)), this, SLOT(update(double,int))); break; default: ; } _curves.value(dataId)->detach(); _curvesData.remove(dataId); _curves.remove(dataId); } else { qDebug() << "Aggregator" << _windowId << ": failed to remove data of id" << dataId; } } void DataAggregatorWidget::update(int value, int dataId) { qDebug() << "Aggregator" << _windowId << ": updating data of id" << dataId << "with value" << value; _curvesData.value(dataId).xData->append(_mainWindow ->effectiveRunningTime()); _curvesData.value(dataId).yData->append(value); #if QWT_VERSION >= 0x060000 _curves.value(dataId)->setRawSamples( _curvesData.value(dataId).xData->data(), _curvesData.value(dataId).yData->data(), _curvesData.value(dataId).xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif _plot->replot(); } void DataAggregatorWidget::update(double value, int dataId) { qDebug() << "Aggregator" << _windowId << ": updating data of id" << dataId << "with value" << value; _curvesData.value(dataId).xData->append(_mainWindow ->effectiveRunningTime()); _curvesData.value(dataId).yData->append(value); #if QWT_VERSION >= 0x060000 _curves.value(dataId)->setRawSamples( _curvesData.value(dataId).xData->data(), _curvesData.value(dataId).yData->data(), _curvesData.value(dataId).xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif _plot->replot(); } QSize DataAggregatorWidget::minimumInternalWidgetSize() const { return _plot->minimumSize(); } QList DataAggregatorWidget::aggregatedData() const { QList addedData; for (int i = 0; i < _curves.values().count(); i++) { addedData.append(_curves.key(_curves.values().at(i))); } return addedData; } void DataAggregatorWidget::curveChecked(QwtPlotItem *curve, bool checked) { curve->setVisible(!checked); } void DataAggregatorWidget::dataAdded() { QAction *action = (QAction*) QObject::sender(); int dataId = action->data().toInt(); _addDataButton->removeAction(action); addData(dataId); QAction *removeDataAction = new QAction( _mainWindow->dataDescriptionFromId(dataId)->descriptionString, _removeDataButton); removeDataAction->setData(dataId); QObject::connect(removeDataAction, SIGNAL(triggered()), this, SLOT(dataRemoved())); _removeDataButton->addAction(removeDataAction); } void DataAggregatorWidget::dataRemoved() { QAction *action = (QAction*) QObject::sender(); int dataId = action->data().toInt(); _removeDataButton->removeAction(action); removeData(dataId); QAction *addDataAction = new QAction( _mainWindow->dataDescriptionFromId(dataId)->descriptionString, _addDataButton); addDataAction->setData(dataId); QObject::connect(addDataAction, SIGNAL(triggered()), this, SLOT(dataAdded())); _addDataButton->addAction(addDataAction); } void DataAggregatorWidget::disableData(int dataId) { // Search the action on the add button for (int i = 0; i < _addDataButton->actions().count(); i++) { if (_addDataButton->actions().at(i)->data().toInt() == dataId) { _addDataButton->actions().at(i)->setEnabled(false); return; } } // If not found, it has already been added for (int i = 0; i < _removeDataButton->actions().count(); i++) { if (_removeDataButton->actions().at(i)->data().toInt() == dataId) { _removeDataButton->removeAction(_removeDataButton->actions().at(i)); removeData(dataId); QAction *action = new QAction( _mainWindow->dataDescriptionFromId(dataId) ->descriptionString, _addDataButton); action->setData(dataId); QObject::connect(action, SIGNAL(triggered()), this, SLOT(dataAdded())); action->setEnabled(false); _addDataButton->addAction(action); return; } } } void DataAggregatorWidget::enableData(int dataId) { // Search the action on the add button for (int i = 0; i < _addDataButton->actions().count(); i++) { if (_addDataButton->actions().at(i)->data().toInt() == dataId) { _addDataButton->actions().at(i)->setEnabled(true); return; } } } starpu-1.1.5/starpu-top/datawidget.h0000644000373600000000000000454312571536557014400 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DATAWIDGET_H #define DATAWIDGET_H class MainWindow; class WidgetWindowsManager; class QwtPlotCurve; class QwtPlot; #include "starpu_top_types.h" #include "abstractwidgetwindow.h" class DataWidget : public AbstractWidgetWindow { /* Displays a single type of data in an internal widget, under different forms defined by the data widget specifications. The internal widget can be changed at any time. */ Q_OBJECT public: explicit DataWidget( DataDescription *dataDescription, WidgetWindowsManager *widgetWindowManager, MainWindow *mainWindow, bool inside = false); ~DataWidget(); // Getters DataDescription *description() const; QSize minimumInternalWidgetSize() const; private: // Events void closeEvent(QCloseEvent *ce); // Metadata DataDescription *_dataDescription; const QHash *_dataWidgetNames; QList _dataWidgetPossibilities; // GUI components QWidget *_internalWidget; QwtPlotCurve *_curve; CurveData *_curveData; public slots: // Setters void setValue(bool value); void setValue(int value); void setValue(double value); // Other methods void recreateInternalWidget(); private slots: void createInternalWidget(); void widgetTypeChanged(); void updateAction(DataWidgetType newWidget); signals: void valueChanged(bool value, int dataId); void valueChanged(int value, int dataId); void valueChanged(double value, int dataId); }; #endif // DATAWIDGET_H starpu-1.1.5/starpu-top/configurationmanager.cpp0000644000373600000000000000613312571536560017007 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "configurationmanager.h" #include ConfigurationManager::ConfigurationManager() { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "ConfigurationManager's' constructor", "Singleton pattern violated - " "ConfigurationManager instanciated more than once"); qDebug() << "ConfigurationManager : initializing"; // Init settings _applicationSettings = new QSettings(CONFIG_FILE_DIR+"/"+CONFIG_FILE_NAME, QSettings::IniFormat); instanciated = true; } ConfigurationManager::~ConfigurationManager() { qDebug() << "ConfigurationManager : terminating"; delete _applicationSettings; } // Getters QString ConfigurationManager::serverHost() const { return _applicationSettings->value("connection/serverhost", QString("localhost")).toString(); } int ConfigurationManager::serverPort() const { return _applicationSettings->value("connection/serverport", 2011).toInt(); } bool ConfigurationManager::ssh() const { return _applicationSettings->value("connection/ssh", false).toBool(); } QString ConfigurationManager::commandLine() const { return _applicationSettings->value("connection/commandline", QString("ssh -L")).toString(); } bool ConfigurationManager::antialiasing() const { return _applicationSettings->value("display/antialiasing", true).toBool(); } // Setters void ConfigurationManager::setServerHost(QString serverIP) { _applicationSettings->setValue("connection/serverhost", serverIP); } void ConfigurationManager::setServerPort(int serverPort) { _applicationSettings->setValue("connection/serverport", serverPort); } void ConfigurationManager::setSSH(bool enabled) { _applicationSettings->setValue("connection/ssh", enabled); } void ConfigurationManager::setCommandLine(QString commandLine) { _applicationSettings->setValue("connection/commandline", commandLine); } void ConfigurationManager::setAntialiasing(bool enabled) { _applicationSettings->setValue("display/antialiasing", enabled); } // Other methods void ConfigurationManager::syncConfiguration() { qDebug() << "ConfigurationManager : synchronizing application settings"; _applicationSettings->sync(); } starpu-1.1.5/starpu-top/extradist0000644000373600000000000002256212571536557014045 00000000000000EXTRA_DIST += \ starpu-top/extradist \ starpu-top/configurationmanager.h \ starpu-top/taskmanager.cpp \ starpu-top/aboutdialog.cpp \ starpu-top/aboutdialog.h \ starpu-top/widgetwindowsmanager.cpp \ starpu-top/widgetwindowsmanager.h \ starpu-top/abstractwidgetwindow.cpp \ starpu-top/communicationthread.h \ starpu-top/configurationmanager.cpp \ starpu-top/starpu_top_types.h \ starpu-top/mainwindow.ui \ starpu-top/mainwindow.cpp \ starpu-top/sessionsetupmanager.cpp \ starpu-top/resources.qrc \ starpu-top/images \ starpu-top/images/connect.png \ starpu-top/images/debugon.png \ starpu-top/images/help.png \ starpu-top/images/starpu_top.png \ starpu-top/images/widget.png \ starpu-top/images/lock.png \ starpu-top/images/about.png \ starpu-top/images/add.png \ starpu-top/images/preferences.png \ starpu-top/images/outside.png \ starpu-top/images/inside.png \ starpu-top/images/quit.png \ starpu-top/images/remove.png \ starpu-top/images/play.png \ starpu-top/images/windows.png \ starpu-top/images/debugoff.png \ starpu-top/abstractwidgetwindow.h \ starpu-top/interactivewidget.h \ starpu-top/main.cpp \ starpu-top/debugconsole.h \ starpu-top/TODO.txt \ starpu-top/StarPU-Top-qwt-embed.pri \ starpu-top/qledindicator \ starpu-top/qledindicator/qledindicator.cpp \ starpu-top/qledindicator/qledindicator.h \ starpu-top/communicationthread.cpp \ starpu-top/debugconsole.ui \ starpu-top/dataaggregatorwidget.cpp \ starpu-top/datawidget.cpp \ starpu-top/datawidget.h \ starpu-top/debugconsole.cpp \ starpu-top/ganttwidget.h \ starpu-top/mainwindow.h \ starpu-top/ganttwidget.cpp \ starpu-top/qwt \ starpu-top/qwt/qwt_spline.cpp \ starpu-top/qwt/qwt_double_range.h \ starpu-top/qwt/qwt_plot_curve.cpp \ starpu-top/qwt/qwt_math.h \ starpu-top/qwt/qwt_scale_draw.cpp \ starpu-top/qwt/qwt_slider.h \ starpu-top/qwt/qwt_interval.h \ starpu-top/qwt/qwt_thermo.h \ starpu-top/qwt/qwt_text_label.h \ starpu-top/qwt/qwt_series_data.h \ starpu-top/qwt/qwt_plot_curve.h \ starpu-top/qwt/qwt_knob.h \ starpu-top/qwt/qwt_plot_seriesitem.h \ starpu-top/qwt/qwt_painter.h \ starpu-top/qwt/qwt_dial.cpp \ starpu-top/qwt/qwt_scale_map.cpp \ starpu-top/qwt/qwt_global.h \ starpu-top/qwt/qwt_double_range.cpp \ starpu-top/qwt/qwt_point_polar.h \ starpu-top/qwt/qwt_painter.cpp \ starpu-top/qwt/qwt_abstract_scale.cpp \ starpu-top/qwt/qwt_plot_dict.cpp \ starpu-top/qwt/qwt_series_data.cpp \ starpu-top/qwt/qwt_wheel.h \ starpu-top/qwt/qwt_plot_seriesitem.cpp \ starpu-top/qwt/qwt_abstract_scale_draw.h \ starpu-top/qwt/qwt_symbol.h \ starpu-top/qwt/qwt_text_engine.cpp \ starpu-top/qwt/qwt_plot_layout.cpp \ starpu-top/qwt/qwt_round_scale_draw.cpp \ starpu-top/qwt/qwt_plot.cpp \ starpu-top/qwt/qwt_clipper.cpp \ starpu-top/qwt/qwt_clipper.h \ starpu-top/qwt/qwt_point_3d.cpp \ starpu-top/qwt/qwt_legend.cpp \ starpu-top/qwt/qwt_scale_widget.h \ starpu-top/qwt/qwt_interval.cpp \ starpu-top/qwt/qwt_scale_draw.h \ starpu-top/qwt/qwt_plot_dict.h \ starpu-top/qwt/qwt_text.cpp \ starpu-top/qwt/qwt_scale_widget.cpp \ starpu-top/qwt/qwt_legend_item.cpp \ starpu-top/qwt/qwt_abstract_scale.h \ starpu-top/qwt/qwt_spline.h \ starpu-top/qwt/qwt_plot_canvas.h \ starpu-top/qwt/qwt_color_map.cpp \ starpu-top/qwt/qwt_dial_needle.h \ starpu-top/qwt/qwt_scale_map.h \ starpu-top/qwt/qwt_legend_item.h \ starpu-top/qwt/qwt_legend_itemmanager.h \ starpu-top/qwt/qwt_curve_fitter.h \ starpu-top/qwt/qwt_dyngrid_layout.cpp \ starpu-top/qwt/qwt_color_map.h \ starpu-top/qwt/qwt_scale_div.h \ starpu-top/qwt/qwt_plot_xml.cpp \ starpu-top/qwt/qwt_round_scale_draw.h \ starpu-top/qwt/qwt_text_engine.h \ starpu-top/qwt/qwt_dial.h \ starpu-top/qwt/qwt_dyngrid_layout.h \ starpu-top/qwt/qwt_plot_item.cpp \ starpu-top/qwt/qwt_curve_fitter.cpp \ starpu-top/qwt/qwt_dial_needle.cpp \ starpu-top/qwt/qwt_plot_item.h \ starpu-top/qwt/qwt_plot_axis.cpp \ starpu-top/qwt/qwt_slider.cpp \ starpu-top/qwt/qwt_text_label.cpp \ starpu-top/qwt/qwt_abstract_slider.h \ starpu-top/qwt/qwt_math.cpp \ starpu-top/qwt/qwt_abstract_slider.cpp \ starpu-top/qwt/qwt_plot_canvas.cpp \ starpu-top/qwt/qwt_thermo.cpp \ starpu-top/qwt/qwt_point_3d.h \ starpu-top/qwt/qwt_abstract_scale_draw.cpp \ starpu-top/qwt/qwt_plot_layout.h \ starpu-top/qwt/qwt_symbol.cpp \ starpu-top/qwt/qwt_plot.h \ starpu-top/qwt/qwt_text.h \ starpu-top/qwt/qwt_wheel.cpp \ starpu-top/qwt/qwt_point_polar.cpp \ starpu-top/qwt/qwt_scale_engine.h \ starpu-top/qwt/qwt_scale_engine.cpp \ starpu-top/qwt/qwt_scale_div.cpp \ starpu-top/qwt/qwt_knob.cpp \ starpu-top/qwt/qwt_legend.h \ starpu-top/taskmanager.h \ starpu-top/preferencesdialog.cpp \ starpu-top/communicationmanager.h \ starpu-top/aboutdialog.ui \ starpu-top/StarPU-Top-qwt-system.pri \ starpu-top/StarPU-Top.pro.user \ starpu-top/communicationmanager.cpp \ starpu-top/interactivewidget.cpp \ starpu-top/preferencesdialog.ui \ starpu-top/sessionsetupmanager.h \ starpu-top/StarPU-Top.pro.user.1.3 \ starpu-top/StarPU-Top-common.pri \ starpu-top/dataaggregatorwidget.h \ starpu-top/preferencesdialog.h \ starpu-top/StarPU-Top.pro.in starpu-1.1.5/starpu-top/resources.qrc0000644000373600000000000000125412571536557014627 00000000000000 images/play.png images/connect.png images/quit.png images/preferences.png images/help.png images/inside.png images/outside.png images/about.png images/debugoff.png images/debugon.png images/add.png images/remove.png images/widget.png images/starpu_top.png images/windows.png images/lock.png starpu-1.1.5/starpu-top/sessionsetupmanager.h0000644000373600000000000000420212571536560016344 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef SESSIONSETUPMANAGER_H #define SESSIONSETUPMANAGER_H class MainWindow; #include "starpu_top_types.h" #include static const QString SESSION_SETUPS_DIR = "./sessionsetups"; static const QString SESSION_SETUPS_FILEEXT = ".ses"; class SessionSetupManager: public QObject { /* Saves and loads a session setup. The session setup includes the geometries and states of the widget windows and the descriptions of the data and the parameters. */ Q_OBJECT public: SessionSetupManager(MainWindow *mainWindow); ~SessionSetupManager(); private: // Data MainWindow *_mainWindow; QSettings *_sessionStateSettings; public slots: bool saveSessionSetup(QString sessionSetupName); bool loadSessionSetup(QString sessionSetupName); signals: void descriptionsSetupLoaded( QList dataDescriptionsSetup, QList paramDescriptionsSetup); void mainWindowSetupLoaded(MainWindowSetup mainWindowSetup); void parametersDockSetupLoaded(ParametersDockSetup parametersDockSetup); void widgetWindowsSetupLoaded(QList dataWidgetsSetup, QList dataAggregatorWidgetsSetup); }; #endif // SESSIONSETUPMANAGER_H starpu-1.1.5/starpu-top/widgetwindowsmanager.cpp0000644000373600000000000001443412571536557017047 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "widgetwindowsmanager.h" #include "mainwindow.h" #include "abstractwidgetwindow.h" #include "datawidget.h" #include "dataaggregatorwidget.h" #include WidgetWindowsManager::WidgetWindowsManager(MainWindow *mainWindow, QMdiArea *mdiArea) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "WidgetWindowsManager's' constructor", "Singleton pattern violated - " "WidgetWindowsManager instanciated more than once"); qDebug() << "WindowsWidgetManager : initializing"; _mainWindow = mainWindow; _mdiArea = mdiArea; instanciated = true; } WidgetWindowsManager::~WidgetWindowsManager() { qDebug() << "WindowsWidgetManager : terminating"; } void WidgetWindowsManager::displayWidgetWindow( AbstractWidgetWindow *widgetWindow) const { qDebug() << "WidgetWindowsManager : displaying widget window"; if (widgetWindow->isInside() == true) { // MDI mode _mdiArea->addSubWindow(widgetWindow); } widgetWindow->setVisible(true); } void WidgetWindowsManager::mdiToFlyingWindows() const { qDebug() << "WidgetWindowsManager : putting all widget windows outside"; _mdiArea->setVisible(false); // Data widgets for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = _mainWindow->dataWidgets()->at(i); if (widgetWindow != 0) { if (widgetWindow->isInside()) { _mdiArea->removeSubWindow(widgetWindow); widgetWindow->setInside(false); displayWidgetWindow(widgetWindow); } } } // Data aggregator widgets for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = (AbstractWidgetWindow*) _mainWindow ->dataAggregatorWidgets()->at(i).data(); if (widgetWindow != 0) { if (widgetWindow->isInside()) { _mdiArea->removeSubWindow(widgetWindow); widgetWindow->setInside(false); displayWidgetWindow(widgetWindow); } } } _mdiArea->closeAllSubWindows(); } void WidgetWindowsManager::flyingWindowsToMdi() const { qDebug() << "WidgetWindowsManager : putting all widget windows inside"; _mdiArea->setVisible(true); // Data widgets for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = _mainWindow->dataWidgets()->at(i); if (widgetWindow != 0) { if (widgetWindow->isInside() == false) { widgetWindow->setInside(true); displayWidgetWindow(widgetWindow); } } } // Data aggregator widgets for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { AbstractWidgetWindow *widgetWindow = (AbstractWidgetWindow*) _mainWindow ->dataAggregatorWidgets()->at(i).data(); if (widgetWindow != 0) { if (widgetWindow->isInside() == false) { widgetWindow->setInside(true); displayWidgetWindow(widgetWindow); } } } } void WidgetWindowsManager::mdiToFlyingWindow( AbstractWidgetWindow *widgetWindow) const { QWidget* parentWindow = widgetWindow->parentWidget(); _mdiArea->removeSubWindow(widgetWindow); _mdiArea->removeSubWindow(parentWindow); displayWidgetWindow(widgetWindow); } void WidgetWindowsManager::flyingWindowToMdi( AbstractWidgetWindow *widgetWindow) const { if (_mdiArea->isVisible() == false) _mdiArea->setVisible(true); displayWidgetWindow(widgetWindow); } void WidgetWindowsManager::closeWidgetWindow( AbstractWidgetWindow *widgetWindow) const { if (widgetWindow->isInside()) { QWidget* parentWindow = widgetWindow->parentWidget(); _mdiArea->removeSubWindow(widgetWindow); _mdiArea->removeSubWindow(parentWindow); } widgetWindow->close(); } void WidgetWindowsManager::closeWidgetWindows() const { qDebug() << "WidgetWindowsManager : closing all widget windows"; // Data widgets for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { AbstractWidgetWindow* widgetWindow = _mainWindow->dataWidgets()->at(i).data(); if (widgetWindow != 0) { closeWidgetWindow(widgetWindow); } } // Data aggregator widgets for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { AbstractWidgetWindow * widgetWindow = (AbstractWidgetWindow*) _mainWindow ->dataAggregatorWidgets()->at(i).data(); if (widgetWindow != 0) { closeWidgetWindow(widgetWindow); } } } const QList WidgetWindowsManager::widgetWindows() const { QList widgetWindows; // Get data widget windows for (int i = 0; i < _mainWindow->dataWidgets()->count(); i++) { widgetWindows.append(_mainWindow->dataWidgets()->at(i)); } // Get data aggregator widget windows for (int i = 0; i < _mainWindow->dataAggregatorWidgets()->count(); i++) { widgetWindows.append(_mainWindow->dataAggregatorWidgets()->at(i)); } return widgetWindows; } starpu-1.1.5/starpu-top/widgetwindowsmanager.h0000644000373600000000000000361412571536560016504 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef WIDGETWINDOWSMANAGER_H #define WIDGETWINDOWSMANAGER_H #include #include #include #include class MainWindow; class AbstractWidgetWindow; class WidgetWindowsManager { /* Manages the widget windows of the current session and can save their states and geometries for use in another session */ public: WidgetWindowsManager( MainWindow *mainWindow, QMdiArea *mdiArea); ~WidgetWindowsManager(); void displayWidgetWindow(AbstractWidgetWindow *widgetWindow) const; void flyingWindowsToMdi() const; void mdiToFlyingWindows() const; void flyingWindowToMdi(AbstractWidgetWindow *widgetWindow) const; void mdiToFlyingWindow(AbstractWidgetWindow *widgetWindow) const; void closeWidgetWindow(AbstractWidgetWindow *widgetWindow) const; void closeWidgetWindows() const; const QList widgetWindows() const; private: // Data MainWindow *_mainWindow; QMdiArea *_mdiArea; }; #endif // WIDGETWINDOWSMANAGER_H starpu-1.1.5/starpu-top/qwt/0000755000373600000000000000000012571536560012771 500000000000000starpu-1.1.5/starpu-top/qwt/qwt_text_label.h0000644000373600000000000000335412571536560016105 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_LABEL_H #define QWT_TEXT_LABEL_H #include "qwt_global.h" #include "qwt_text.h" #include class QString; class QPaintEvent; class QPainter; /*! \brief A Widget which displays a QwtText */ class QWT_EXPORT QwtTextLabel : public QFrame { Q_OBJECT Q_PROPERTY( int indent READ indent WRITE setIndent ) Q_PROPERTY( int margin READ margin WRITE setMargin ) public: explicit QwtTextLabel( QWidget *parent = NULL ); explicit QwtTextLabel( const QwtText &, QWidget *parent = NULL ); virtual ~QwtTextLabel(); public Q_SLOTS: void setText( const QString &, QwtText::TextFormat textFormat = QwtText::AutoText ); virtual void setText( const QwtText & ); void clear(); public: const QwtText &text() const; int indent() const; void setIndent( int ); int margin() const; void setMargin( int ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual int heightForWidth( int ) const; QRect textRect() const; protected: virtual void paintEvent( QPaintEvent *e ); virtual void drawContents( QPainter * ); virtual void drawText( QPainter *, const QRect & ); private: void init(); int defaultIndent() const; class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_canvas.h0000644000373600000000000000604312571536560016271 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CANVAS_H #define QWT_PLOT_CANVAS_H #include "qwt_global.h" #include #include class QwtPlot; class QPixmap; /*! \brief Canvas of a QwtPlot. \sa QwtPlot */ class QWT_EXPORT QwtPlotCanvas : public QFrame { Q_OBJECT public: /*! \brief Paint attributes - PaintCached\n Paint double buffered and reuse the content of the pixmap buffer for some spontaneous repaints that happen when a plot gets unhidden, deiconified or changes the focus. Disabling the cache will improve the performance for incremental paints (using QwtPlotCurve::draw). - PaintPacked\n Suppress system background repaints and paint it together with the canvas contents. Painting packed might avoid flickering for expensive repaints, when there is a notable gap between painting the background and the plot contents. The default setting enables PaintCached and PaintPacked \sa setPaintAttribute(), testPaintAttribute(), paintCache() */ enum PaintAttribute { PaintCached = 1, PaintPacked = 2 }; /*! \brief Focus indicator - NoFocusIndicator\n Don't paint a focus indicator - CanvasFocusIndicator\n The focus is related to the complete canvas. Paint the focus indicator using paintFocus() - ItemFocusIndicator\n The focus is related to an item (curve, point, ...) on the canvas. It is up to the application to display a focus indication using f.e. highlighting. \sa setFocusIndicator(), focusIndicator(), paintFocus() */ enum FocusIndicator { NoFocusIndicator, CanvasFocusIndicator, ItemFocusIndicator }; explicit QwtPlotCanvas( QwtPlot * ); virtual ~QwtPlotCanvas(); QwtPlot *plot(); const QwtPlot *plot() const; void setFocusIndicator( FocusIndicator ); FocusIndicator focusIndicator() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; QPixmap *paintCache(); const QPixmap *paintCache() const; void invalidatePaintCache(); void replot(); protected: virtual void hideEvent( QHideEvent * ); virtual void paintEvent( QPaintEvent * ); virtual void drawContents( QPainter * ); virtual void drawFocusIndicator( QPainter * ); void drawCanvas( QPainter *painter = NULL ); private: void setSystemBackground( bool ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_point_polar.h0000644000373600000000000000614512571536557016317 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef _QWT_POINT_POLAR_H_ #define _QWT_POINT_POLAR_H_ 1 #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A point in polar coordinates In polar coordinates a point is determined by an angle and a distance. See http://en.wikipedia.org/wiki/Polar_coordinate_system */ class QWT_EXPORT QwtPointPolar { public: QwtPointPolar(); QwtPointPolar( double azimuth, double radius ); QwtPointPolar( const QwtPointPolar & ); QwtPointPolar( const QPointF & ); void setPoint( const QPointF & ); QPointF toPoint() const; bool isValid() const; bool isNull() const; double radius() const; double azimuth() const; double &rRadius(); double &rAzimuth(); void setRadius( double ); void setAzimuth( double ); bool operator==( const QwtPointPolar & ) const; bool operator!=( const QwtPointPolar & ) const; QwtPointPolar normalized() const; private: double d_azimuth; double d_radius; }; /*! Constructs a null point, with a radius and azimuth set to 0.0. \sa QPointF::isNull */ inline QwtPointPolar::QwtPointPolar(): d_azimuth( 0.0 ), d_radius( 0.0 ) { } /*! Constructs a point with coordinates specified by radius and azimuth. \param azimuth Azimuth \param radius Radius */ inline QwtPointPolar::QwtPointPolar( double azimuth, double radius ): d_azimuth( azimuth ), d_radius( radius ) { } /*! Constructs a point using the values of the point specified. \param other Other point */ inline QwtPointPolar::QwtPointPolar( const QwtPointPolar &other ): d_azimuth( other.d_azimuth ), d_radius( other.d_radius ) { } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isValid() const { return d_radius >= 0.0; } //! Returns true if radius() >= 0.0 inline bool QwtPointPolar::isNull() const { return d_radius == 0.0; } //! Returns the radius. inline double QwtPointPolar::radius() const { return d_radius; } //! Returns the azimuth. inline double QwtPointPolar::azimuth() const { return d_azimuth; } //! Returns the radius. inline double &QwtPointPolar::rRadius() { return d_radius; } //! Returns the azimuth. inline double &QwtPointPolar::rAzimuth() { return d_azimuth; } //! Sets the radius to radius. inline void QwtPointPolar::setRadius( double radius ) { d_radius = radius; } //! Sets the atimuth to atimuth. inline void QwtPointPolar::setAzimuth( double azimuth ) { d_azimuth = azimuth; } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPointPolar & ); #endif #endif starpu-1.1.5/starpu-top/qwt/qwt_interval.cpp0000644000373600000000000002026712571536557016151 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_interval.h" #include "qwt_math.h" #include /*! \brief Normalize the limits of the interval If maxValue() < minValue() the limits will be inverted. \return Normalized interval \sa isValid(), inverted() */ QwtInterval QwtInterval::normalized() const { if ( d_minValue > d_maxValue ) { return inverted(); } if ( d_minValue == d_maxValue && d_borderFlags == ExcludeMinimum ) { return inverted(); } return *this; } /*! Invert the limits of the interval \return Inverted interval \sa normalized() */ QwtInterval QwtInterval::inverted() const { int borderFlags = 0; if ( d_borderFlags & ExcludeMinimum ) borderFlags |= ExcludeMaximum; if ( d_borderFlags & ExcludeMaximum ) borderFlags |= ExcludeMinimum; return QwtInterval( d_maxValue, d_minValue, borderFlags ); } /*! Test if a value is inside an interval \param value Value \return true, if value >= minValue() && value <= maxValue() */ bool QwtInterval::contains( double value ) const { if ( !isValid() ) return false; if ( value < d_minValue || value > d_maxValue ) return false; if ( value == d_minValue && d_borderFlags & ExcludeMinimum ) return false; if ( value == d_maxValue && d_borderFlags & ExcludeMaximum ) return false; return true; } //! Unite 2 intervals QwtInterval QwtInterval::unite( const QwtInterval &other ) const { /* If one of the intervals is invalid return the other one. If both are invalid return an invalid default interval */ if ( !isValid() ) { if ( !other.isValid() ) return QwtInterval(); else return other; } if ( !other.isValid() ) return *this; QwtInterval united; int flags = 0; // minimum if ( d_minValue < other.minValue() ) { united.setMinValue( d_minValue ); flags &= d_borderFlags & ExcludeMinimum; } else if ( other.minValue() < d_minValue ) { united.setMinValue( other.minValue() ); flags &= other.borderFlags() & ExcludeMinimum; } else // d_minValue == other.minValue() { united.setMinValue( d_minValue ); flags &= ( d_borderFlags & other.borderFlags() ) & ExcludeMinimum; } // maximum if ( d_maxValue > other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & ExcludeMaximum; } else if ( other.maxValue() > d_maxValue ) { united.setMaxValue( other.maxValue() ); flags &= other.borderFlags() & ExcludeMaximum; } else // d_maxValue == other.maxValue() ) { united.setMaxValue( d_maxValue ); flags &= d_borderFlags & other.borderFlags() & ExcludeMaximum; } united.setBorderFlags( flags ); return united; } //! Intersect 2 intervals QwtInterval QwtInterval::intersect( const QwtInterval &other ) const { if ( !other.isValid() || !isValid() ) return QwtInterval(); QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMinimum ) qSwap( i1, i2 ); } if ( i1.maxValue() < i2.minValue() ) { return QwtInterval(); } if ( i1.maxValue() == i2.minValue() ) { if ( i1.borderFlags() & ExcludeMaximum || i2.borderFlags() & ExcludeMinimum ) { return QwtInterval(); } } QwtInterval intersected; int flags = 0; intersected.setMinValue( i2.minValue() ); flags |= i2.borderFlags() & ExcludeMinimum; if ( i1.maxValue() < i2.maxValue() ) { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & ExcludeMaximum; } else if ( i2.maxValue() < i1.maxValue() ) { intersected.setMaxValue( i2.maxValue() ); flags |= i2.borderFlags() & ExcludeMaximum; } else // i1.maxValue() == i2.maxValue() { intersected.setMaxValue( i1.maxValue() ); flags |= i1.borderFlags() & i2.borderFlags() & ExcludeMaximum; } intersected.setBorderFlags( flags ); return intersected; } //! Unites this interval with the given interval. QwtInterval& QwtInterval::operator|=( const QwtInterval & interval ) { *this = *this | interval; return *this; } //! Intersects this interval with the given interval. QwtInterval& QwtInterval::operator&=( const QwtInterval & interval ) { *this = *this & interval; return *this; } /*! Test if two intervals overlap */ bool QwtInterval::intersects( const QwtInterval &other ) const { if ( !isValid() || !other.isValid() ) return false; QwtInterval i1 = *this; QwtInterval i2 = other; // swap i1/i2, so that the minimum of i1 // is smaller then the minimum of i2 if ( i1.minValue() > i2.minValue() ) { qSwap( i1, i2 ); } else if ( i1.minValue() == i2.minValue() && i1.borderFlags() & ExcludeMinimum ) { qSwap( i1, i2 ); } if ( i1.maxValue() > i2.minValue() ) { return true; } if ( i1.maxValue() == i2.minValue() ) { return !( ( i1.borderFlags() & ExcludeMaximum ) || ( i2.borderFlags() & ExcludeMinimum ) ); } return false; } /*! Adjust the limit that is closer to value, so that value becomes the center of the interval. \param value Center \return Interval with value as center */ QwtInterval QwtInterval::symmetrize( double value ) const { if ( !isValid() ) return *this; const double delta = qMax( qAbs( value - d_maxValue ), qAbs( value - d_minValue ) ); return QwtInterval( value - delta, value + delta ); } /*! Limit the interval, keeping the border modes \param lowerBound Lower limit \param upperBound Upper limit \return Limited interval */ QwtInterval QwtInterval::limited( double lowerBound, double upperBound ) const { if ( !isValid() || lowerBound > upperBound ) return QwtInterval(); double minValue = qMax( d_minValue, lowerBound ); minValue = qMin( minValue, upperBound ); double maxValue = qMax( d_maxValue, lowerBound ); maxValue = qMin( maxValue, upperBound ); return QwtInterval( minValue, maxValue, d_borderFlags ); } /*! Extend the interval If value is below minValue, value becomes the lower limit. If value is above maxValue, value becomes the upper limit. extend has no effect for invalid intervals \param value Value \sa isValid() */ QwtInterval QwtInterval::extend( double value ) const { if ( !isValid() ) return *this; return QwtInterval( qMin( value, d_minValue ), qMax( value, d_maxValue ), d_borderFlags ); } /*! Extend an interval \param value Value \return Reference of the extended interval \sa extend() */ QwtInterval& QwtInterval::operator|=( double value ) { *this = *this | value; return *this; } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtInterval &interval ) { const int flags = interval.borderFlags(); debug.nospace() << "QwtInterval(" << ( ( flags & QwtInterval::ExcludeMinimum ) ? "]" : "[" ) << interval.minValue() << "," << interval.maxValue() << ( ( flags & QwtInterval::ExcludeMaximum ) ? "[" : "]" ) << ")"; return debug.space(); } #endif starpu-1.1.5/starpu-top/qwt/qwt_spline.cpp0000644000373600000000000002106512571536560015606 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_spline.h" #include "qwt_math.h" class QwtSpline::PrivateData { public: PrivateData(): splineType( QwtSpline::Natural ) { } QwtSpline::SplineType splineType; // coefficient vectors QVector a; QVector b; QVector c; // control points QPolygonF points; }; static int lookup( double x, const QPolygonF &values ) { #if 0 //qLowerBound/qHigherBound ??? #endif int i1; const int size = ( int )values.size(); if ( x <= values[0].x() ) i1 = 0; else if ( x >= values[size - 2].x() ) i1 = size - 2; else { i1 = 0; int i2 = size - 2; int i3 = 0; while ( i2 - i1 > 1 ) { i3 = i1 + ( ( i2 - i1 ) >> 1 ); if ( values[i3].x() > x ) i2 = i3; else i1 = i3; } } return i1; } //! Constructor QwtSpline::QwtSpline() { d_data = new PrivateData; } /*! Copy constructor \param other Spline used for initilization */ QwtSpline::QwtSpline( const QwtSpline& other ) { d_data = new PrivateData( *other.d_data ); } /*! Assignment operator \param other Spline used for initilization */ QwtSpline &QwtSpline::operator=( const QwtSpline & other ) { *d_data = *other.d_data; return *this; } //! Destructor QwtSpline::~QwtSpline() { delete d_data; } /*! Select the algorithm used for calculating the spline \param splineType Spline type \sa splineType() */ void QwtSpline::setSplineType( SplineType splineType ) { d_data->splineType = splineType; } /*! \return the spline type \sa setSplineType() */ QwtSpline::SplineType QwtSpline::splineType() const { return d_data->splineType; } /*! \brief Calculate the spline coefficients Depending on the value of \a periodic, this function will determine the coefficients for a natural or a periodic spline and store them internally. \param points Points \return true if successful \warning The sequence of x (but not y) values has to be strictly monotone increasing, which means points[i].x() < points[i+1].x(). If this is not the case, the function will return false */ bool QwtSpline::setPoints( const QPolygonF& points ) { const int size = points.size(); if ( size <= 2 ) { reset(); return false; } d_data->points = points; d_data->a.resize( size - 1 ); d_data->b.resize( size - 1 ); d_data->c.resize( size - 1 ); bool ok; if ( d_data->splineType == Periodic ) ok = buildPeriodicSpline( points ); else ok = buildNaturalSpline( points ); if ( !ok ) reset(); return ok; } /*! Return points passed by setPoints */ QPolygonF QwtSpline::points() const { return d_data->points; } //! \return A coefficients const QVector &QwtSpline::coefficientsA() const { return d_data->a; } //! \return B coefficients const QVector &QwtSpline::coefficientsB() const { return d_data->b; } //! \return C coefficients const QVector &QwtSpline::coefficientsC() const { return d_data->c; } //! Free allocated memory and set size to 0 void QwtSpline::reset() { d_data->a.resize( 0 ); d_data->b.resize( 0 ); d_data->c.resize( 0 ); d_data->points.resize( 0 ); } //! True if valid bool QwtSpline::isValid() const { return d_data->a.size() > 0; } /*! Calculate the interpolated function value corresponding to a given argument x. */ double QwtSpline::value( double x ) const { if ( d_data->a.size() == 0 ) return 0.0; const int i = lookup( x, d_data->points ); const double delta = x - d_data->points[i].x(); return( ( ( ( d_data->a[i] * delta ) + d_data->b[i] ) * delta + d_data->c[i] ) * delta + d_data->points[i].y() ); } /*! \brief Determines the coefficients for a natural spline \return true if successful */ bool QwtSpline::buildNaturalSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); // set up tridiagonal equation system; use coefficient // vectors as temporary buffers QVector h( size - 1 ); for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0 ) return false; } QVector d( size - 1 ); double dy1 = ( p[1].y() - p[0].y() ) / h[0]; for ( i = 1; i < size - 1; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( h[i-1] + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; } // // solve it // // L-U Factorization for ( i = 1; i < size - 2; i++ ) { c[i] /= a[i]; a[i+1] -= b[i] * c[i]; } // forward elimination QVector s( size ); s[1] = d[1]; for ( i = 2; i < size - 1; i++ ) s[i] = d[i] - c[i-1] * s[i-1]; // backward elimination s[size - 2] = - s[size - 2] / a[size - 2]; for ( i = size - 3; i > 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] ) / a[i]; s[size - 1] = s[0] = 0.0; // // Finally, determine the spline coefficients // for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } /*! \brief Determines the coefficients for a periodic spline \return true if successful */ bool QwtSpline::buildPeriodicSpline( const QPolygonF &points ) { int i; const QPointF *p = points.data(); const int size = points.size(); double *a = d_data->a.data(); double *b = d_data->b.data(); double *c = d_data->c.data(); QVector d( size - 1 ); QVector h( size - 1 ); QVector s( size ); // // setup equation system; use coefficient // vectors as temporary buffers // for ( i = 0; i < size - 1; i++ ) { h[i] = p[i+1].x() - p[i].x(); if ( h[i] <= 0.0 ) return false; } const int imax = size - 2; double htmp = h[imax]; double dy1 = ( p[0].y() - p[imax].y() ) / htmp; for ( i = 0; i <= imax; i++ ) { b[i] = c[i] = h[i]; a[i] = 2.0 * ( htmp + h[i] ); const double dy2 = ( p[i+1].y() - p[i].y() ) / h[i]; d[i] = 6.0 * ( dy1 - dy2 ); dy1 = dy2; htmp = h[i]; } // // solve it // // L-U Factorization a[0] = qSqrt( a[0] ); c[0] = h[imax] / a[0]; double sum = 0; for ( i = 0; i < imax - 1; i++ ) { b[i] /= a[i]; if ( i > 0 ) c[i] = - c[i-1] * b[i-1] / a[i]; a[i+1] = qSqrt( a[i+1] - qwtSqr( b[i] ) ); sum += qwtSqr( c[i] ); } b[imax-1] = ( b[imax-1] - c[imax-2] * b[imax-2] ) / a[imax-1]; a[imax] = qSqrt( a[imax] - qwtSqr( b[imax-1] ) - sum ); // forward elimination s[0] = d[0] / a[0]; sum = 0; for ( i = 1; i < imax; i++ ) { s[i] = ( d[i] - b[i-1] * s[i-1] ) / a[i]; sum += c[i-1] * s[i-1]; } s[imax] = ( d[imax] - b[imax-1] * s[imax-1] - sum ) / a[imax]; // backward elimination s[imax] = - s[imax] / a[imax]; s[imax-1] = -( s[imax-1] + b[imax-1] * s[imax] ) / a[imax-1]; for ( i = imax - 2; i >= 0; i-- ) s[i] = - ( s[i] + b[i] * s[i+1] + c[i] * s[imax] ) / a[i]; // // Finally, determine the spline coefficients // s[size-1] = s[0]; for ( i = 0; i < size - 1; i++ ) { a[i] = ( s[i+1] - s[i] ) / ( 6.0 * h[i] ); b[i] = 0.5 * s[i]; c[i] = ( p[i+1].y() - p[i].y() ) / h[i] - ( s[i+1] + 2.0 * s[i] ) * h[i] / 6.0; } return true; } starpu-1.1.5/starpu-top/qwt/qwt_plot_axis.cpp0000644000373600000000000004015012571536557016320 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_math.h" #include "qwt_scale_widget.h" #include "qwt_scale_div.h" #include "qwt_scale_engine.h" class QwtPlot::AxisData { public: bool isEnabled; bool doAutoScale; double minValue; double maxValue; double stepSize; int maxMajor; int maxMinor; QwtScaleDiv scaleDiv; QwtScaleEngine *scaleEngine; QwtScaleWidget *scaleWidget; }; //! Initialize axes void QwtPlot::initAxesData() { int axisId; for ( axisId = 0; axisId < axisCnt; axisId++ ) d_axisData[axisId] = new AxisData; d_axisData[yLeft]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::LeftScale, this ); d_axisData[yRight]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::RightScale, this ); d_axisData[xTop]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::TopScale, this ); d_axisData[xBottom]->scaleWidget = new QwtScaleWidget( QwtScaleDraw::BottomScale, this ); QFont fscl( fontInfo().family(), 10 ); QFont fttl( fontInfo().family(), 12, QFont::Bold ); for ( axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; d.scaleWidget->setFont( fscl ); d.scaleWidget->setMargin( 2 ); QwtText text = d.scaleWidget->title(); text.setFont( fttl ); d.scaleWidget->setTitle( text ); d.doAutoScale = true; d.minValue = 0.0; d.maxValue = 1000.0; d.stepSize = 0.0; d.maxMinor = 5; d.maxMajor = 8; d.scaleEngine = new QwtLinearScaleEngine; d.scaleDiv.invalidate(); } d_axisData[yLeft]->isEnabled = true; d_axisData[yRight]->isEnabled = false; d_axisData[xBottom]->isEnabled = true; d_axisData[xTop]->isEnabled = false; } void QwtPlot::deleteAxesData() { for ( int axisId = 0; axisId < axisCnt; axisId++ ) { delete d_axisData[axisId]->scaleEngine; delete d_axisData[axisId]; d_axisData[axisId] = NULL; } } /*! \return specified axis, or NULL if axisId is invalid. \param axisId axis index */ const QwtScaleWidget *QwtPlot::axisWidget( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! \return specified axis, or NULL if axisId is invalid. \param axisId axis index */ QwtScaleWidget *QwtPlot::axisWidget( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleWidget; return NULL; } /*! Change the scale engine for an axis \param axisId axis index \param scaleEngine Scale engine \sa axisScaleEngine() */ void QwtPlot::setAxisScaleEngine( int axisId, QwtScaleEngine *scaleEngine ) { if ( axisValid( axisId ) && scaleEngine != NULL ) { AxisData &d = *d_axisData[axisId]; delete d.scaleEngine; d.scaleEngine = scaleEngine; d.scaleDiv.invalidate(); autoRefresh(); } } /*! \param axisId axis index \return Scale engine for a specific axis */ QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \param axisId axis index \return Scale engine for a specific axis */ const QwtScaleEngine *QwtPlot::axisScaleEngine( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->scaleEngine; else return NULL; } /*! \return \c true if autoscaling is enabled \param axisId axis index */ bool QwtPlot::axisAutoScale( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->doAutoScale; else return false; } /*! \return \c true if a specified axis is enabled \param axisId axis index */ bool QwtPlot::axisEnabled( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->isEnabled; else return false; } /*! \return the font of the scale labels for a specified axis \param axisId axis index */ QFont QwtPlot::axisFont( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->font(); else return QFont(); } /*! \return the maximum number of major ticks for a specified axis \param axisId axis index sa setAxisMaxMajor() */ int QwtPlot::axisMaxMajor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMajor; else return 0; } /*! \return the maximum number of minor ticks for a specified axis \param axisId axis index sa setAxisMaxMinor() */ int QwtPlot::axisMaxMinor( int axisId ) const { if ( axisValid( axisId ) ) return d_axisData[axisId]->maxMinor; else return 0; } /*! \brief Return the scale division of a specified axis axisScaleDiv(axisId)->lowerBound(), axisScaleDiv(axisId)->upperBound() are the current limits of the axis scale. \param axisId axis index \return Scale division \sa QwtScaleDiv, setAxisScaleDiv() */ const QwtScaleDiv *QwtPlot::axisScaleDiv( int axisId ) const { if ( !axisValid( axisId ) ) return NULL; return &d_axisData[axisId]->scaleDiv; } /*! \brief Return the scale division of a specified axis axisScaleDiv(axisId)->lowerBound(), axisScaleDiv(axisId)->upperBound() are the current limits of the axis scale. \param axisId axis index \return Scale division \sa QwtScaleDiv, setAxisScaleDiv() */ QwtScaleDiv *QwtPlot::axisScaleDiv( int axisId ) { if ( !axisValid( axisId ) ) return NULL; return &d_axisData[axisId]->scaleDiv; } /*! \returns the scale draw of a specified axis \param axisId axis index \return specified scaleDraw for axis, or NULL if axis is invalid. \sa QwtScaleDraw */ const QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) const { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! \returns the scale draw of a specified axis \param axisId axis index \return specified scaleDraw for axis, or NULL if axis is invalid. \sa QwtScaleDraw */ QwtScaleDraw *QwtPlot::axisScaleDraw( int axisId ) { if ( !axisValid( axisId ) ) return NULL; return axisWidget( axisId )->scaleDraw(); } /*! Return the step size parameter, that has been set in setAxisScale. This doesn't need to be the step size of the current scale. \param axisId axis index \return step size parameter value \sa setAxisScale() */ double QwtPlot::axisStepSize( int axisId ) const { if ( !axisValid( axisId ) ) return 0; return d_axisData[axisId]->stepSize; } /*! \return the title of a specified axis \param axisId axis index */ QwtText QwtPlot::axisTitle( int axisId ) const { if ( axisValid( axisId ) ) return axisWidget( axisId )->title(); else return QwtText(); } /*! \brief Enable or disable a specified axis When an axis is disabled, this only means that it is not visible on the screen. Curves, markers and can be attached to disabled axes, and transformation of screen coordinates into values works as normal. Only xBottom and yLeft are enabled by default. \param axisId axis index \param tf \c true (enabled) or \c false (disabled) */ void QwtPlot::enableAxis( int axisId, bool tf ) { if ( axisValid( axisId ) && tf != d_axisData[axisId]->isEnabled ) { d_axisData[axisId]->isEnabled = tf; updateLayout(); } } /*! Transform the x or y coordinate of a position in the drawing region into a value. \param axisId axis index \param pos position \warning The position can be an x or a y coordinate, depending on the specified axis. */ double QwtPlot::invTransform( int axisId, int pos ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).invTransform( pos ) ); else return 0.0; } /*! \brief Transform a value into a coordinate in the plotting region \param axisId axis index \param value value \return X or y coordinate in the plotting region corresponding to the value. */ double QwtPlot::transform( int axisId, double value ) const { if ( axisValid( axisId ) ) return( canvasMap( axisId ).transform( value ) ); else return 0.0; } /*! \brief Change the font of an axis \param axisId axis index \param f font \warning This function changes the font of the tick labels, not of the axis title. */ void QwtPlot::setAxisFont( int axisId, const QFont &f ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setFont( f ); } /*! \brief Enable autoscaling for a specified axis This member function is used to switch back to autoscaling mode after a fixed scale has been set. Autoscaling is enabled by default. \param axisId axis index \sa setAxisScale(), setAxisScaleDiv() */ void QwtPlot::setAxisAutoScale( int axisId ) { if ( axisValid( axisId ) && !d_axisData[axisId]->doAutoScale ) { d_axisData[axisId]->doAutoScale = true; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. \param axisId axis index \param min \param max minimum and maximum of the scale \param stepSize Major step size. If step == 0, the step size is calculated automatically using the maxMajor setting. \sa setAxisMaxMajor(), setAxisAutoScale(), axisStepSize() */ void QwtPlot::setAxisScale( int axisId, double min, double max, double stepSize ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.scaleDiv.invalidate(); d.minValue = min; d.maxValue = max; d.stepSize = stepSize; autoRefresh(); } } /*! \brief Disable autoscaling and specify a fixed scale for a selected axis. \param axisId axis index \param scaleDiv Scale division \sa setAxisScale(), setAxisAutoScale() */ void QwtPlot::setAxisScaleDiv( int axisId, const QwtScaleDiv &scaleDiv ) { if ( axisValid( axisId ) ) { AxisData &d = *d_axisData[axisId]; d.doAutoScale = false; d.scaleDiv = scaleDiv; autoRefresh(); } } /*! \brief Set a scale draw \param axisId axis index \param scaleDraw object responsible for drawing scales. By passing scaleDraw it is possible to extend QwtScaleDraw functionality and let it take place in QwtPlot. Please note that scaleDraw has to be created with new and will be deleted by the corresponding QwtScale member ( like a child object ). \sa QwtScaleDraw, QwtScaleWidget \warning The attributes of scaleDraw will be overwritten by those of the previous QwtScaleDraw. */ void QwtPlot::setAxisScaleDraw( int axisId, QwtScaleDraw *scaleDraw ) { if ( axisValid( axisId ) ) { axisWidget( axisId )->setScaleDraw( scaleDraw ); autoRefresh(); } } /*! Change the alignment of the tick labels \param axisId axis index \param alignment Or'd Qt::AlignmentFlags \sa QwtScaleDraw::setLabelAlignment() */ void QwtPlot::setAxisLabelAlignment( int axisId, Qt::Alignment alignment ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelAlignment( alignment ); } /*! Rotate all tick labels \param axisId axis index \param rotation Angle in degrees. When changing the label rotation, the label alignment might be adjusted too. \sa QwtScaleDraw::setLabelRotation(), setAxisLabelAlignment() */ void QwtPlot::setAxisLabelRotation( int axisId, double rotation ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setLabelRotation( rotation ); } /*! Set the maximum number of minor scale intervals for a specified axis \param axisId axis index \param maxMinor maximum number of minor steps \sa axisMaxMinor() */ void QwtPlot::setAxisMaxMinor( int axisId, int maxMinor ) { if ( axisValid( axisId ) ) { if ( maxMinor < 0 ) maxMinor = 0; if ( maxMinor > 100 ) maxMinor = 100; AxisData &d = *d_axisData[axisId]; if ( maxMinor != d.maxMinor ) { d.maxMinor = maxMinor; d.scaleDiv.invalidate(); autoRefresh(); } } } /*! Set the maximum number of major scale intervals for a specified axis \param axisId axis index \param maxMajor maximum number of major steps \sa axisMaxMajor() */ void QwtPlot::setAxisMaxMajor( int axisId, int maxMajor ) { if ( axisValid( axisId ) ) { if ( maxMajor < 1 ) maxMajor = 1; if ( maxMajor > 1000 ) maxMajor = 10000; AxisData &d = *d_axisData[axisId]; if ( maxMajor != d.maxMajor ) { d.maxMajor = maxMajor; d.scaleDiv.invalidate(); autoRefresh(); } } } /*! \brief Change the title of a specified axis \param axisId axis index \param title axis title */ void QwtPlot::setAxisTitle( int axisId, const QString &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } /*! \brief Change the title of a specified axis \param axisId axis index \param title axis title */ void QwtPlot::setAxisTitle( int axisId, const QwtText &title ) { if ( axisValid( axisId ) ) axisWidget( axisId )->setTitle( title ); } //! Rebuild the scales void QwtPlot::updateAxes() { // Find bounding interval of the item data // for all axes, where autoscaling is enabled QwtInterval intv[axisCnt]; const QwtPlotItemList& itmList = itemList(); QwtPlotItemIterator it; for ( it = itmList.begin(); it != itmList.end(); ++it ) { const QwtPlotItem *item = *it; if ( !item->testItemAttribute( QwtPlotItem::AutoScale ) ) continue; if ( axisAutoScale( item->xAxis() ) || axisAutoScale( item->yAxis() ) ) { const QRectF rect = item->boundingRect(); intv[item->xAxis()] |= QwtInterval( rect.left(), rect.right() ); intv[item->yAxis()] |= QwtInterval( rect.top(), rect.bottom() ); } } // Adjust scales for ( int axisId = 0; axisId < axisCnt; axisId++ ) { AxisData &d = *d_axisData[axisId]; double minValue = d.minValue; double maxValue = d.maxValue; double stepSize = d.stepSize; if ( d.doAutoScale && intv[axisId].isValid() ) { d.scaleDiv.invalidate(); minValue = intv[axisId].minValue(); maxValue = intv[axisId].maxValue(); d.scaleEngine->autoScale( d.maxMajor, minValue, maxValue, stepSize ); } if ( !d.scaleDiv.isValid() ) { d.scaleDiv = d.scaleEngine->divideScale( minValue, maxValue, d.maxMajor, d.maxMinor, stepSize ); } QwtScaleWidget *scaleWidget = axisWidget( axisId ); scaleWidget->setScaleDiv( d.scaleEngine->transformation(), d.scaleDiv ); int startDist, endDist; scaleWidget->getBorderDistHint( startDist, endDist ); scaleWidget->setBorderDist( startDist, endDist ); } for ( it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; item->updateScaleDiv( *axisScaleDiv( item->xAxis() ), *axisScaleDiv( item->yAxis() ) ); } } starpu-1.1.5/starpu-top/qwt/qwt_scale_map.h0000644000373600000000000001151612571536557015713 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_MAP_H #define QWT_SCALE_MAP_H #include "qwt_global.h" #include "qwt_math.h" #ifndef QT_NO_DEBUG_STREAM #include #endif class QRectF; /*! \brief Operations for linear or logarithmic (base 10) transformations */ class QWT_EXPORT QwtScaleTransformation { public: /*! - Linear\n Transformation between 2 linear scales - Log10 Transformation between a linear and a logarithmic ( base 10 ) scale - Other Any other type of transformation */ enum Type { Linear, Log10, Other }; QwtScaleTransformation( Type type ); virtual ~QwtScaleTransformation(); virtual double xForm( double x, double s1, double s2, double p1, double p2 ) const; virtual double invXForm( double x, double s1, double s2, double p1, double p2 ) const; Type type() const; virtual QwtScaleTransformation *copy() const; private: QwtScaleTransformation(); QwtScaleTransformation &operator=( const QwtScaleTransformation ); const Type d_type; }; //! \return Transformation type inline QwtScaleTransformation::Type QwtScaleTransformation::type() const { return d_type; } /*! \brief A scale map QwtScaleMap offers transformations from a scale into a paint interval and vice versa. */ class QWT_EXPORT QwtScaleMap { public: QwtScaleMap(); QwtScaleMap( const QwtScaleMap& ); ~QwtScaleMap(); QwtScaleMap &operator=( const QwtScaleMap & ); void setTransformation( QwtScaleTransformation * ); const QwtScaleTransformation *transformation() const; void setPaintInterval( double p1, double p2 ); void setScaleInterval( double s1, double s2 ); double transform( double s ) const; double invTransform( double p ) const; double p1() const; double p2() const; double s1() const; double s2() const; double pDist() const; double sDist() const; QT_STATIC_CONST double LogMin; QT_STATIC_CONST double LogMax; static QRectF transform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); static QRectF invTransform( const QwtScaleMap &, const QwtScaleMap &, const QRectF & ); bool isInverting() const; private: void newFactor(); double d_s1, d_s2; // scale interval boundaries double d_p1, d_p2; // paint device interval boundaries double d_cnv; // conversion factor QwtScaleTransformation *d_transformation; }; /*! \return First border of the scale interval */ inline double QwtScaleMap::s1() const { return d_s1; } /*! \return Second border of the scale interval */ inline double QwtScaleMap::s2() const { return d_s2; } /*! \return First border of the paint interval */ inline double QwtScaleMap::p1() const { return d_p1; } /*! \return Second border of the paint interval */ inline double QwtScaleMap::p2() const { return d_p2; } /*! \return qwtAbs(p2() - p1()) */ inline double QwtScaleMap::pDist() const { return qAbs( d_p2 - d_p1 ); } /*! \return qwtAbs(s2() - s1()) */ inline double QwtScaleMap::sDist() const { return qAbs( d_s2 - d_s1 ); } /*! Transform a point related to the scale interval into an point related to the interval of the paint device \param s Value relative to the coordinates of the scale */ inline double QwtScaleMap::transform( double s ) const { // try to inline code from QwtScaleTransformation if ( d_transformation->type() == QwtScaleTransformation::Linear ) return d_p1 + ( s - d_s1 ) * d_cnv; if ( d_transformation->type() == QwtScaleTransformation::Log10 ) return d_p1 + log( s / d_s1 ) * d_cnv; return d_transformation->xForm( s, d_s1, d_s2, d_p1, d_p2 ); } /*! Transform an paint device value into a value in the interval of the scale. \param p Value relative to the coordinates of the paint device \sa transform() */ inline double QwtScaleMap::invTransform( double p ) const { return d_transformation->invXForm( p, d_p1, d_p2, d_s1, d_s2 ); } //! \return True, when ( p1() < p2() ) != ( s1() < s2() ) inline bool QwtScaleMap::isInverting() const { return ( ( d_p1 < d_p2 ) != ( d_s1 < d_s2 ) ); } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtScaleMap & ); #endif #endif starpu-1.1.5/starpu-top/qwt/qwt_scale_draw.h0000644000373600000000000000574312571536557016100 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DRAW_H #define QWT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include #include #include /*! \brief A class for drawing scales QwtScaleDraw can be used to draw linear or logarithmic scales. A scale has a position, an alignment and a length, which can be specified . The labels can be rotated and aligned to the ticks using setLabelRotation() and setLabelAlignment(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtScaleDraw: public QwtAbstractScaleDraw { public: /*! Alignment of the scale draw \sa setAlignment(), alignment() */ enum Alignment { BottomScale, TopScale, LeftScale, RightScale }; QwtScaleDraw(); virtual ~QwtScaleDraw(); void getBorderDistHint( const QFont &, int &start, int &end ) const; int minLabelDist( const QFont & ) const; int minLength( const QFont & ) const; virtual double extent( const QFont & ) const; void move( double x, double y ); void move( const QPointF & ); void setLength( double length ); Alignment alignment() const; void setAlignment( Alignment ); Qt::Orientation orientation() const; QPointF pos() const; double length() const; void setLabelAlignment( Qt::Alignment ); Qt::Alignment labelAlignment() const; void setLabelRotation( double rotation ); double labelRotation() const; int maxLabelHeight( const QFont & ) const; int maxLabelWidth( const QFont & ) const; QPointF labelPosition( double val ) const; QRectF labelRect( const QFont &, double val ) const; QSizeF labelSize( const QFont &, double val ) const; QRect boundingLabelRect( const QFont &, double val ) const; protected: QTransform labelTransformation( const QPointF &, const QSizeF & ) const; virtual void drawTick( QPainter *, double val, double len ) const; virtual void drawBackbone( QPainter * ) const; virtual void drawLabel( QPainter *, double val ) const; private: QwtScaleDraw( const QwtScaleDraw & ); QwtScaleDraw &operator=( const QwtScaleDraw &other ); void updateMap(); class PrivateData; PrivateData *d_data; }; /*! Move the position of the scale \sa move(const QPointF &) */ inline void QwtScaleDraw::move( double x, double y ) { move( QPointF( x, y ) ); } #endif starpu-1.1.5/starpu-top/qwt/qwt_color_map.h0000644000373600000000000001221212571536557015734 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_COLOR_MAP_H #define QWT_COLOR_MAP_H #include "qwt_global.h" #include "qwt_interval.h" #include #include /*! \brief QwtColorMap is used to map values into colors. For displaying 3D data on a 2D plane the 3rd dimension is often displayed using colors, like f.e in a spectrogram. Each color map is optimized to return colors for only one of the following image formats: - QImage::Format_Indexed8\n - QImage::Format_ARGB32\n \sa QwtPlotSpectrogram, QwtScaleWidget */ class QWT_EXPORT QwtColorMap { public: /*! - RGB\n The map is intended to map into QRgb values. - Indexed\n The map is intended to map into 8 bit values, that are indices into the color table. \sa rgb(), colorIndex(), colorTable() */ enum Format { RGB, Indexed }; QwtColorMap( Format = QwtColorMap::RGB ); virtual ~QwtColorMap(); Format format() const; /*! Map a value of a given interval into a rgb value. \param interval Range for the values \param value Value \return rgb value, corresponding to value */ virtual QRgb rgb( const QwtInterval &interval, double value ) const = 0; /*! Map a value of a given interval into a color index \param interval Range for the values \param value Value \return color index, corresponding to value */ virtual unsigned char colorIndex( const QwtInterval &interval, double value ) const = 0; QColor color( const QwtInterval &, double value ) const; virtual QVector colorTable( const QwtInterval & ) const; private: Format d_format; }; /*! \brief QwtLinearColorMap builds a color map from color stops. A color stop is a color at a specific position. The valid range for the positions is [0.0, 1.0]. When mapping a value into a color it is translated into this interval. If mode() == FixedColors the color is calculated from the next lower color stop. If mode() == ScaledColors the color is calculated by interpolating the colors of the adjacent stops. */ class QWT_EXPORT QwtLinearColorMap: public QwtColorMap { public: /*! Mode of color map \sa setMode(), mode() */ enum Mode { FixedColors, ScaledColors }; QwtLinearColorMap( QwtColorMap::Format = QwtColorMap::RGB ); QwtLinearColorMap( const QColor &from, const QColor &to, QwtColorMap::Format = QwtColorMap::RGB ); virtual ~QwtLinearColorMap(); void setMode( Mode ); Mode mode() const; void setColorInterval( const QColor &color1, const QColor &color2 ); void addColorStop( double value, const QColor& ); QVector colorStops() const; QColor color1() const; QColor color2() const; virtual QRgb rgb( const QwtInterval &, double value ) const; virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class ColorStops; private: // Disabled copy constructor and operator= QwtLinearColorMap( const QwtLinearColorMap & ); QwtLinearColorMap &operator=( const QwtLinearColorMap & ); class PrivateData; PrivateData *d_data; }; /*! \brief QwtAlphaColorMap variies the alpha value of a color */ class QWT_EXPORT QwtAlphaColorMap: public QwtColorMap { public: QwtAlphaColorMap( const QColor & = QColor( Qt::gray ) ); virtual ~QwtAlphaColorMap(); void setColor( const QColor & ); QColor color() const; virtual QRgb rgb( const QwtInterval &, double value ) const; private: QwtAlphaColorMap( const QwtAlphaColorMap & ); QwtAlphaColorMap &operator=( const QwtAlphaColorMap & ); virtual unsigned char colorIndex( const QwtInterval &, double value ) const; class PrivateData; PrivateData *d_data; }; /*! Map a value into a color \param interval Valid interval for values \param value Value \return Color corresponding to value \warning This method is slow for Indexed color maps. If it is necessary to map many values, its better to get the color table once and find the color using colorIndex(). */ inline QColor QwtColorMap::color( const QwtInterval &interval, double value ) const { if ( d_format == RGB ) { return QColor( rgb( interval, value ) ); } else { const unsigned int index = colorIndex( interval, value ); return colorTable( interval )[index]; // slow } } /*! \return Intended format of the color map \sa Format */ inline QwtColorMap::Format QwtColorMap::format() const { return d_format; } #endif starpu-1.1.5/starpu-top/qwt/qwt_clipper.cpp0000644000373600000000000003045712571536560015757 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_clipper.h" #include "qwt_math.h" #include #if QT_VERSION < 0x040601 #define qAtan(x) ::atan(x) #endif static inline QRectF boundingRect( const QPolygonF &polygon ) { return polygon.boundingRect(); } enum Edge { Left, Top, Right, Bottom, NEdges }; class QwtPolygonClipper: public QRect { public: QwtPolygonClipper( const QRect &r ); QPolygon clipPolygon( const QPolygon & ) const; private: void clipEdge( Edge, const QPolygon &, QPolygon & ) const; bool insideEdge( const QPoint &, Edge edge ) const; QPoint intersectEdge( const QPoint &p1, const QPoint &p2, Edge edge ) const; void addPoint( QPolygon &, uint pos, const QPoint &point ) const; }; class QwtPolygonClipperF: public QRectF { public: QwtPolygonClipperF( const QRectF &r ); QPolygonF clipPolygon( const QPolygonF & ) const; private: void clipEdge( Edge, const QPolygonF &, QPolygonF & ) const; bool insideEdge( const QPointF &, Edge edge ) const; QPointF intersectEdge( const QPointF &p1, const QPointF &p2, Edge edge ) const; void addPoint( QPolygonF &, uint pos, const QPointF &point ) const; }; class QwtCircleClipper: public QRectF { public: QwtCircleClipper( const QRectF &r ); QVector clipCircle( const QPointF &, double radius ) const; private: QList cuttingPoints( Edge, const QPointF &pos, double radius ) const; double toAngle( const QPointF &, const QPointF & ) const; }; QwtPolygonClipper::QwtPolygonClipper( const QRect &r ): QRect( r ) { } inline void QwtPolygonClipper::addPoint( QPolygon &pa, uint pos, const QPoint &point ) const { if ( uint( pa.size() ) <= pos ) pa.resize( pos + 5 ); pa.setPoint( pos, point ); } //! Sutherland-Hodgman polygon clipping QPolygon QwtPolygonClipper::clipPolygon( const QPolygon &pa ) const { if ( contains( pa.boundingRect() ) ) return pa; QPolygon cpa( pa.size() ); clipEdge( ( Edge )0, pa, cpa ); for ( uint edge = 1; edge < NEdges; edge++ ) { const QPolygon rpa = cpa; clipEdge( ( Edge )edge, rpa, cpa ); } return cpa; } bool QwtPolygonClipper::insideEdge( const QPoint &p, Edge edge ) const { switch ( edge ) { case Left: return p.x() > left(); case Top: return p.y() > top(); case Right: return p.x() < right(); case Bottom: return p.y() < bottom(); default: break; } return false; } QPoint QwtPolygonClipper::intersectEdge( const QPoint &p1, const QPoint &p2, Edge edge ) const { int x = 0, y = 0; double m = 0; const double dy = p2.y() - p1.y(); const double dx = p2.x() - p1.x(); switch ( edge ) { case Left: x = left(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Top: y = top(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; case Right: x = right(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Bottom: y = bottom(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; default: break; } return QPoint( x, y ); } void QwtPolygonClipper::clipEdge( Edge edge, const QPolygon &pa, QPolygon &cpa ) const { if ( pa.count() == 0 ) { cpa.resize( 0 ); return; } unsigned int count = 0; QPoint p1 = pa.point( 0 ); if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p1 ); const uint nPoints = pa.size(); for ( uint i = 1; i < nPoints; i++ ) { const QPoint p2 = pa.point( i ); if ( insideEdge( p2, edge ) ) { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p2 ); else { addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); addPoint( cpa, count++, p2 ); } } else { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); } p1 = p2; } cpa.resize( count ); } QwtPolygonClipperF::QwtPolygonClipperF( const QRectF &r ): QRectF( r ) { } inline void QwtPolygonClipperF::addPoint( QPolygonF &pa, uint pos, const QPointF &point ) const { if ( uint( pa.size() ) <= pos ) pa.resize( pos + 5 ); pa[( int )pos] = point; } //! Sutherland-Hodgman polygon clipping QPolygonF QwtPolygonClipperF::clipPolygon( const QPolygonF &pa ) const { if ( contains( ::boundingRect( pa ) ) ) return pa; QPolygonF cpa( pa.size() ); clipEdge( ( Edge )0, pa, cpa ); for ( uint edge = 1; edge < NEdges; edge++ ) { const QPolygonF rpa = cpa; clipEdge( ( Edge )edge, rpa, cpa ); } return cpa; } bool QwtPolygonClipperF::insideEdge( const QPointF &p, Edge edge ) const { switch ( edge ) { case Left: return p.x() > left(); case Top: return p.y() > top(); case Right: return p.x() < right(); case Bottom: return p.y() < bottom(); default: break; } return false; } QPointF QwtPolygonClipperF::intersectEdge( const QPointF &p1, const QPointF &p2, Edge edge ) const { double x = 0.0, y = 0.0; double m = 0; const double dy = p2.y() - p1.y(); const double dx = p2.x() - p1.x(); switch ( edge ) { case Left: x = left(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Top: y = top(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; case Right: x = right(); m = double( qAbs( p1.x() - x ) ) / qAbs( dx ); y = p1.y() + int( dy * m ); break; case Bottom: y = bottom(); m = double( qAbs( p1.y() - y ) ) / qAbs( dy ); x = p1.x() + int( dx * m ); break; default: break; } return QPointF( x, y ); } void QwtPolygonClipperF::clipEdge( Edge edge, const QPolygonF &pa, QPolygonF &cpa ) const { if ( pa.count() == 0 ) { cpa.resize( 0 ); return; } unsigned int count = 0; QPointF p1 = pa[0]; if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p1 ); const uint nPoints = pa.size(); for ( uint i = 1; i < nPoints; i++ ) { const QPointF p2 = pa[( int )i]; if ( insideEdge( p2, edge ) ) { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, p2 ); else { addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); addPoint( cpa, count++, p2 ); } } else { if ( insideEdge( p1, edge ) ) addPoint( cpa, count++, intersectEdge( p1, p2, edge ) ); } p1 = p2; } cpa.resize( count ); } QwtCircleClipper::QwtCircleClipper( const QRectF &r ): QRectF( r ) { } QVector QwtCircleClipper::clipCircle( const QPointF &pos, double radius ) const { QList points; for ( int edge = 0; edge < NEdges; edge++ ) points += cuttingPoints( ( Edge )edge, pos, radius ); QVector intv; if ( points.size() <= 0 ) { QRectF cRect( 0, 0, 2 * radius, 2* radius ); cRect.moveCenter( pos ); if ( contains( cRect ) ) intv += QwtInterval( 0.0, 2 * M_PI ); } else { QList angles; for ( int i = 0; i < points.size(); i++ ) angles += toAngle( pos, points[i] ); qSort( angles ); const int in = contains( qwtPolar2Pos( pos, radius, angles[0] + ( angles[1] - angles[0] ) / 2 ) ); if ( in ) { for ( int i = 0; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); } else { for ( int i = 1; i < angles.size() - 1; i += 2 ) intv += QwtInterval( angles[i], angles[i+1] ); intv += QwtInterval( angles.last(), angles.first() ); } } return intv; } double QwtCircleClipper::toAngle( const QPointF &from, const QPointF &to ) const { if ( from.x() == to.x() ) return from.y() <= to.y() ? M_PI / 2.0 : 3 * M_PI / 2.0; const double m = qAbs( ( to.y() - from.y() ) / ( to.x() - from.x() ) ); double angle = qAtan( m ); if ( to.x() > from.x() ) { if ( to.y() > from.y() ) angle = 2 * M_PI - angle; } else { if ( to.y() > from.y() ) angle = M_PI + angle; else angle = M_PI - angle; } return angle; } QList QwtCircleClipper::cuttingPoints( Edge edge, const QPointF &pos, double radius ) const { QList points; if ( edge == Left || edge == Right ) { const double x = ( edge == Left ) ? left() : right(); if ( qAbs( pos.x() - x ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.x() - x ) ); const double y1 = pos.y() + off; if ( y1 >= top() && y1 <= bottom() ) points += QPointF( x, y1 ); const double y2 = pos.y() - off; if ( y2 >= top() && y2 <= bottom() ) points += QPointF( x, y2 ); } } else { const double y = ( edge == Top ) ? top() : bottom(); if ( qAbs( pos.y() - y ) < radius ) { const double off = qSqrt( qwtSqr( radius ) - qwtSqr( pos.y() - y ) ); const double x1 = pos.x() + off; if ( x1 >= left() && x1 <= right() ) points += QPointF( x1, y ); const double x2 = pos.x() - off; if ( x2 >= left() && x2 <= right() ) points += QPointF( x2, y ); } } return points; } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \return Clipped polygon */ QPolygon QwtClipper::clipPolygon( const QRect &clipRect, const QPolygon &polygon ) { QwtPolygonClipper clipper( clipRect ); return clipper.clipPolygon( polygon ); } /*! Sutherland-Hodgman polygon clipping \param clipRect Clip rectangle \param polygon Polygon \return Clipped polygon */ QPolygonF QwtClipper::clipPolygonF( const QRectF &clipRect, const QPolygonF &polygon ) { QwtPolygonClipperF clipper( clipRect ); return clipper.clipPolygon( polygon ); } /*! Circle clipping clipCircle() devides a circle into intervals of angles representing arcs of the circle. When the circle is completely inside the clip rectangle an interval [0.0, 2 * M_PI] is returned. \param clipRect Clip rectangle \param center Center of the circle \param radius Radius of the circle \return Arcs of the circle */ QVector QwtClipper::clipCircle( const QRectF &clipRect, const QPointF ¢er, double radius ) { QwtCircleClipper clipper( clipRect ); return clipper.clipCircle( center, radius ); } starpu-1.1.5/starpu-top/qwt/qwt_plot_curve.cpp0000644000373600000000000007124612571536560016504 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_curve.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_painter.h" #include "qwt_legend.h" #include "qwt_legend_item.h" #include "qwt_scale_map.h" #include "qwt_plot.h" #include "qwt_plot_canvas.h" #include "qwt_curve_fitter.h" #include "qwt_symbol.h" #include #include #include #include static int verifyRange( int size, int &i1, int &i2 ) { if ( size < 1 ) return 0; i1 = qwtLim( i1, 0, size - 1 ); i2 = qwtLim( i2, 0, size - 1 ); if ( i1 > i2 ) qSwap( i1, i2 ); return ( i2 - i1 + 1 ); } class QwtPlotCurve::PrivateData { public: PrivateData(): style( QwtPlotCurve::Lines ), baseline( 0.0 ), symbol( NULL ), attributes( 0 ), paintAttributes( QwtPlotCurve::ClipPolygons ), legendAttributes( 0 ) { pen = QPen( Qt::black ); curveFitter = new QwtSplineCurveFitter; } ~PrivateData() { delete symbol; delete curveFitter; } QwtPlotCurve::CurveStyle style; double baseline; const QwtSymbol *symbol; QwtCurveFitter *curveFitter; QPen pen; QBrush brush; int attributes; int paintAttributes; int legendAttributes; }; /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QwtText &title ): QwtPlotSeriesItem( title ) { init(); } /*! Constructor \param title Title of the curve */ QwtPlotCurve::QwtPlotCurve( const QString &title ): QwtPlotSeriesItem( QwtText( title ) ) { init(); } //! Destructor QwtPlotCurve::~QwtPlotCurve() { delete d_data; } //! Initialize internal members void QwtPlotCurve::init() { setItemAttribute( QwtPlotItem::Legend ); setItemAttribute( QwtPlotItem::AutoScale ); d_data = new PrivateData; d_series = new QwtPointSeriesData(); setZ( 20.0 ); } //! \return QwtPlotItem::Rtti_PlotCurve int QwtPlotCurve::rtti() const { return QwtPlotItem::Rtti_PlotCurve; } /*! Specify an attribute how to draw the curve \param attribute Paint attribute \param on On/Off /sa PaintAttribute, testPaintAttribute() */ void QwtPlotCurve::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! \brief Return the current paint attributes \sa PaintAttribute, setPaintAttribute() */ bool QwtPlotCurve::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ); } /*! Specify an attribute how to draw the legend identifier \param attribute Attribute \param on On/Off /sa LegendAttribute, testLegendAttribute() */ void QwtPlotCurve::setLegendAttribute( LegendAttribute attribute, bool on ) { if ( on ) d_data->legendAttributes |= attribute; else d_data->legendAttributes &= ~attribute; } /*! \brief Return the current paint attributes \sa LegendAttribute, setLegendAttribute() */ bool QwtPlotCurve::testLegendAttribute( LegendAttribute attribute ) const { return ( d_data->legendAttributes & attribute ); } /*! Set the curve's drawing style \param style Curve style \sa CurveStyle, style() */ void QwtPlotCurve::setStyle( CurveStyle style ) { if ( style != d_data->style ) { d_data->style = style; itemChanged(); } } /*! Return the current style \sa CurveStyle, setStyle() */ QwtPlotCurve::CurveStyle QwtPlotCurve::style() const { return d_data->style; } /*! Assign a symbol \param symbol Symbol \sa symbol() */ void QwtPlotCurve::setSymbol( const QwtSymbol *symbol ) { if ( symbol != d_data->symbol ) { delete d_data->symbol; d_data->symbol = symbol; itemChanged(); } } /*! \return Current symbol or NULL, when no symbol has been assigned \sa setSymbol() */ const QwtSymbol *QwtPlotCurve::symbol() const { return d_data->symbol; } /*! Assign a pen \param pen New pen \sa pen(), brush() */ void QwtPlotCurve::setPen( const QPen &pen ) { if ( pen != d_data->pen ) { d_data->pen = pen; itemChanged(); } } /*! \return Pen used to draw the lines \sa setPen(), brush() */ const QPen& QwtPlotCurve::pen() const { return d_data->pen; } /*! \brief Assign a brush. In case of brush.style() != QBrush::NoBrush and style() != QwtPlotCurve::Sticks the area between the curve and the baseline will be filled. In case !brush.color().isValid() the area will be filled by pen.color(). The fill algorithm simply connects the first and the last curve point to the baseline. So the curve data has to be sorted (ascending or descending). \param brush New brush \sa brush(), setBaseline(), baseline() */ void QwtPlotCurve::setBrush( const QBrush &brush ) { if ( brush != d_data->brush ) { d_data->brush = brush; itemChanged(); } } /*! \return Brush used to fill the area between lines and the baseline \sa setBrush(), setBaseline(), baseline() */ const QBrush& QwtPlotCurve::brush() const { return d_data->brush; } /*! Draw an interval of the curve \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. \sa drawCurve(), drawSymbols(), */ void QwtPlotCurve::drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { if ( !painter || dataSize() <= 0 ) return; if ( to < 0 ) to = dataSize() - 1; if ( verifyRange( dataSize(), from, to ) > 0 ) { painter->save(); painter->setPen( d_data->pen ); /* Qt 4.0.0 is slow when drawing lines, but it's even slower when the painter has a brush. So we don't set the brush before we really need it. */ drawCurve( painter, d_data->style, xMap, yMap, canvasRect, from, to ); painter->restore(); if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { painter->save(); drawSymbols( painter, *d_data->symbol, xMap, yMap, canvasRect, from, to ); painter->restore(); } } } /*! \brief Draw the line part (without symbols) of a curve interval. \param painter Painter \param style curve style, see QwtPlotCurve::CurveStyle \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawDots(), drawLines(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawCurve( QPainter *painter, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { switch ( style ) { case Lines: if ( testCurveAttribute( Fitted ) ) { // we always need the complete // curve for fitting from = 0; to = dataSize() - 1; } drawLines( painter, xMap, yMap, canvasRect, from, to ); break; case Sticks: drawSticks( painter, xMap, yMap, canvasRect, from, to ); break; case Steps: drawSteps( painter, xMap, yMap, canvasRect, from, to ); break; case Dots: drawDots( painter, xMap, yMap, canvasRect, from, to ); break; case NoCurve: default: break; } } /*! \brief Draw lines If the CurveAttribute Fitted is enabled a QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa setCurveAttribute(), setCurveFitter(), draw(), drawLines(), drawDots(), drawSteps(), drawSticks() */ void QwtPlotCurve::drawLines( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { int size = to - from + 1; if ( size <= 0 ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polyline( size ); QPointF *points = polyline.data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double x = xMap.transform( sample.x() ); double y = yMap.transform( sample.y() ); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } points[i - from].rx() = x; points[i - from].ry() = y; } if ( ( d_data->attributes & Fitted ) && d_data->curveFitter ) polyline = d_data->curveFitter->fitCurve( polyline ); if ( d_data->paintAttributes & ClipPolygons ) { qreal pw = qMax( qreal( 1.0 ), painter->pen().widthF()); polyline = QwtClipper::clipPolygonF( canvasRect.adjusted(-pw, -pw, pw, pw), polyline ); } QwtPainter::drawPolyline( painter, polyline ); if ( d_data->brush.style() != Qt::NoBrush ) fillCurve( painter, xMap, yMap, polyline ); } /*! Draw sticks \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawDots(), drawLines(), drawSteps() */ void QwtPlotCurve::drawSticks( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &, int from, int to ) const { painter->save(); painter->setRenderHint( QPainter::Antialiasing, false ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double x0 = xMap.transform( d_data->baseline ); double y0 = yMap.transform( d_data->baseline ); if ( doAlign ) { x0 = qRound( x0 ); y0 = qRound( y0 ); } const Qt::Orientation o = orientation(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( o == Qt::Horizontal ) QwtPainter::drawLine( painter, x0, yi, xi, yi ); else QwtPainter::drawLine( painter, xi, y0, xi, yi ); } painter->restore(); } /*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doFill = d_data->brush.style() != Qt::NoBrush; const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polyline; if ( doFill ) polyline.resize( to - from + 1 ); QPointF *points = polyline.data(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } QwtPainter::drawPoint( painter, QPointF( xi, yi ) ); if ( doFill ) { points[i - from].rx() = xi; points[i - from].ry() = yi; } } if ( doFill ) { if ( d_data->paintAttributes & ClipPolygons ) polyline = QwtClipper::clipPolygonF( canvasRect, polyline ); fillCurve( painter, xMap, yMap, polyline ); } } /*! Draw step function The direction of the steps depends on Inverted attribute. \param painter Painter \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from index of the first point to be painted \param to index of the last point to be painted \sa CurveAttribute, setCurveAttribute(), draw(), drawCurve(), drawDots(), drawLines(), drawSticks() */ void QwtPlotCurve::drawSteps( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); QPolygonF polygon( 2 * ( to - from ) + 1 ); QPointF *points = polygon.data(); bool inverted = orientation() == Qt::Vertical; if ( d_data->attributes & Inverted ) inverted = !inverted; int i, ip; for ( i = from, ip = 0; i <= to; i++, ip += 2 ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( ip > 0 ) { const QPointF &p0 = points[ip - 2]; QPointF &p = points[ip - 1]; if ( inverted ) { p.rx() = p0.x(); p.ry() = yi; } else { p.rx() = xi; p.ry() = p0.y(); } } points[ip].rx() = xi; points[ip].ry() = yi; } if ( d_data->paintAttributes & ClipPolygons ) polygon = QwtClipper::clipPolygonF( canvasRect, polygon ); QwtPainter::drawPolyline( painter, polygon ); if ( d_data->brush.style() != Qt::NoBrush ) fillCurve( painter, xMap, yMap, polygon ); } /*! Specify an attribute for drawing the curve \param attribute Curve attribute \param on On/Off /sa CurveAttribute, testCurveAttribute(), setCurveFitter() */ void QwtPlotCurve::setCurveAttribute( CurveAttribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) == on ) return; if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; itemChanged(); } /*! \return true, if attribute is enabled \sa CurveAttribute, setCurveAttribute() */ bool QwtPlotCurve::testCurveAttribute( CurveAttribute attribute ) const { return d_data->attributes & attribute; } /*! Assign a curve fitter The curve fitter "smooths" the curve points, when the Fitted CurveAttribute is set. setCurveFitter(NULL) also disables curve fitting. The curve fitter operates on the translated points ( = widget coordinates) to be functional for logarithmic scales. Obviously this is less performant for fitting algorithms, that reduce the number of points. For situations, where curve fitting is used to improve the performance of painting huge series of points it might be better to execute the fitter on the curve points once and to cache the result in the QwtSeriesData object. \param curveFitter() Curve fitter \sa Fitted */ void QwtPlotCurve::setCurveFitter( QwtCurveFitter *curveFitter ) { delete d_data->curveFitter; d_data->curveFitter = curveFitter; itemChanged(); } /*! Get the curve fitter. If curve fitting is disabled NULL is returned. \return Curve fitter \sa setCurveFitter(), Fitted */ QwtCurveFitter *QwtPlotCurve::curveFitter() const { return d_data->curveFitter; } /*! Fill the area between the curve and the baseline with the curve brush \param painter Painter \param xMap x map \param yMap y map \param polygon Polygon \sa setBrush(), setBaseline(), setCurveType() */ void QwtPlotCurve::fillCurve( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QPolygonF &polygon ) const { if ( d_data->brush.style() == Qt::NoBrush ) return; closePolyline( painter, xMap, yMap, polygon ); if ( polygon.count() <= 2 ) // a line can't be filled return; QBrush b = d_data->brush; if ( !b.color().isValid() ) b.setColor( d_data->pen.color() ); painter->save(); painter->setPen( QPen( Qt::NoPen ) ); painter->setBrush( b ); QwtPainter::drawPolygon( painter, polygon ); painter->restore(); } /*! \brief Complete a polygon to be a closed polygon including the area between the original polygon and the baseline. \param painter Painter \param xMap X map \param yMap Y map \param polygon Polygon to be completed */ void QwtPlotCurve::closePolyline( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QPolygonF &polygon ) const { if ( polygon.size() < 2 ) return; const bool doAlign = QwtPainter::roundingAlignment( painter ); double baseline = d_data->baseline; if ( orientation() == Qt::Vertical ) { if ( yMap.transformation()->type() == QwtScaleTransformation::Log10 ) { if ( baseline < QwtScaleMap::LogMin ) baseline = QwtScaleMap::LogMin; } double refY = yMap.transform( baseline ); if ( doAlign ) refY = qRound( refY ); polygon += QPointF( polygon.last().x(), refY ); polygon += QPointF( polygon.first().x(), refY ); } else { if ( xMap.transformation()->type() == QwtScaleTransformation::Log10 ) { if ( baseline < QwtScaleMap::LogMin ) baseline = QwtScaleMap::LogMin; } double refX = xMap.transform( baseline ); if ( doAlign ) refX = qRound( refX ); polygon += QPointF( refX, polygon.last().y() ); polygon += QPointF( refX, polygon.first().y() ); } } /*! Draw symbols \param painter Painter \param symbol Curve symbol \param xMap x map \param yMap y map \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted \sa setSymbol(), drawSeries(), drawCurve() */ void QwtPlotCurve::drawSymbols( QPainter *painter, const QwtSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); bool usePixmap = testPaintAttribute( CacheSymbols ); if ( usePixmap && !doAlign ) { // Don't use the pixmap, when the paint device // could generate scalable vectors usePixmap = false; } if ( usePixmap ) { QPixmap pm( symbol.boundingSize() ); pm.fill( Qt::transparent ); const double pw2 = 0.5 * pm.width(); const double ph2 = 0.5 * pm.height(); QPainter p( &pm ); p.setRenderHints( painter->renderHints() ); symbol.drawSymbol( &p, QPointF( pw2, ph2 ) ); p.end(); for ( int i = from; i <= to; i++ ) { const QPointF sample = d_series->sample( i ); double xi = xMap.transform( sample.x() ); double yi = yMap.transform( sample.y() ); if ( doAlign ) { xi = qRound( xi ); yi = qRound( yi ); } if ( canvasRect.contains( xi, yi ) ) { const int left = qCeil( xi ) - pw2; const int top = qCeil( yi ) - ph2; painter->drawPixmap( left, top, pm ); } } } else { const int chunkSize = 500; for ( int i = from; i <= to; i += chunkSize ) { const int n = qMin( chunkSize, to - i + 1 ); QPolygonF points; for ( int j = 0; j < n; j++ ) { const QPointF sample = d_series->sample( i + j ); const double xi = xMap.transform( sample.x() ); const double yi = yMap.transform( sample.y() ); if ( canvasRect.contains( xi, yi ) ) points += QPointF( xi, yi ); } if ( points.size() > 0 ) symbol.drawSymbols( painter, points ); } } } /*! \brief Set the value of the baseline The baseline is needed for filling the curve with a brush or the Sticks drawing style. The interpretation of the baseline depends on the CurveType. With QwtPlotCurve::Yfx, the baseline is interpreted as a horizontal line at y = baseline(), with QwtPlotCurve::Yfy, it is interpreted as a vertical line at x = baseline(). The default value is 0.0. \param value Value of the baseline \sa baseline(), setBrush(), setStyle(), setCurveType() */ void QwtPlotCurve::setBaseline( double value ) { if ( d_data->baseline != value ) { d_data->baseline = value; itemChanged(); } } /*! \return the value of the baseline \sa setBaseline() */ double QwtPlotCurve::baseline() const { return d_data->baseline; } /*! Find the closest curve point for a specific position \param pos Position, where to look for the closest curve point \param dist If dist != NULL, closestPoint() returns the distance between the position and the clostest curve point \return Index of the closest curve point, or -1 if none can be found ( f.e when the curve has no points ) \note closestPoint() implements a dumb algorithm, that iterates over all points */ int QwtPlotCurve::closestPoint( const QPoint &pos, double *dist ) const { if ( plot() == NULL || dataSize() <= 0 ) return -1; const QwtScaleMap xMap = plot()->canvasMap( xAxis() ); const QwtScaleMap yMap = plot()->canvasMap( yAxis() ); int index = -1; double dmin = 1.0e10; for ( uint i = 0; i < dataSize(); i++ ) { const QPointF sample = d_series->sample( i ); const double cx = xMap.transform( sample.x() ) - pos.x(); const double cy = yMap.transform( sample.y() ) - pos.y(); const double f = qwtSqr( cx ) + qwtSqr( cy ); if ( f < dmin ) { index = i; dmin = f; } } if ( dist ) *dist = qSqrt( dmin ); return index; } /*! \brief Update the widget that represents the item on the legend \param legend Legend \sa drawLegendIdentifier(), legendItem(), itemChanged(), QwtLegend() */ void QwtPlotCurve::updateLegend( QwtLegend *legend ) const { if ( legend && testItemAttribute( QwtPlotItem::Legend ) && ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol ) && d_data->symbol && d_data->symbol->style() != QwtSymbol::NoSymbol ) { QWidget *lgdItem = legend->find( this ); if ( lgdItem == NULL ) { lgdItem = legendItem(); if ( lgdItem ) legend->insert( this, lgdItem ); } if ( lgdItem && lgdItem->inherits( "QwtLegendItem" ) ) { QwtLegendItem *l = ( QwtLegendItem * )lgdItem; l->setIdentifierSize( d_data->symbol->boundingSize() ); } } QwtPlotItem::updateLegend( legend ); } /*! \brief Draw the identifier representing the curve on the legend \param painter Üainter \param rect Bounding rectangle for the identifier \sa setLegendAttribute */ void QwtPlotCurve::drawLegendIdentifier( QPainter *painter, const QRectF &rect ) const { if ( rect.isEmpty() ) return; const int dim = qMin( rect.width(), rect.height() ); QSize size( dim, dim ); QRectF r( 0, 0, size.width(), size.height() ); r.moveCenter( rect.center() ); if ( d_data->legendAttributes == 0 ) { QBrush brush = d_data->brush; if ( brush.style() == Qt::NoBrush ) { if ( style() != QwtPlotCurve::NoCurve ) brush = QBrush( pen().color() ); else if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { brush = QBrush( d_data->symbol->pen().color() ); } } if ( brush.style() != Qt::NoBrush ) painter->fillRect( r, brush ); } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowBrush ) { if ( d_data->brush.style() != Qt::NoBrush ) painter->fillRect( r, d_data->brush ); } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowLine ) { if ( pen() != Qt::NoPen ) { painter->setPen( pen() ); QwtPainter::drawLine( painter, rect.left(), rect.center().y(), rect.right() - 1.0, rect.center().y() ); } } if ( d_data->legendAttributes & QwtPlotCurve::LegendShowSymbol ) { if ( d_data->symbol && ( d_data->symbol->style() != QwtSymbol::NoSymbol ) ) { QSize symbolSize = d_data->symbol->boundingSize(); symbolSize -= QSize( 2, 2 ); // scale the symbol size down if it doesn't fit into rect. double xRatio = 1.0; if ( rect.width() < symbolSize.width() ) xRatio = rect.width() / symbolSize.width(); double yRatio = 1.0; if ( rect.height() < symbolSize.height() ) yRatio = rect.height() / symbolSize.height(); const double ratio = qMin( xRatio, yRatio ); painter->save(); painter->scale( ratio, ratio ); d_data->symbol->drawSymbol( painter, rect.center() / ratio ); painter->restore(); } } } /*! Initialize data with an array of points (explicitly shared). \param samples Vector of points */ void QwtPlotCurve::setSamples( const QVector &samples ) { delete d_series; d_series = new QwtPointSeriesData( samples ); itemChanged(); } #ifndef QWT_NO_COMPAT /*! \brief Initialize the data by pointing to memory blocks which are not managed by QwtPlotCurve. setRawSamples is provided for efficiency. It is important to keep the pointers during the lifetime of the underlying QwtCPointerData class. \param xData pointer to x data \param yData pointer to y data \param size size of x and y \sa QwtCPointerData::setSamples() */ void QwtPlotCurve::setRawSamples( const double *xData, const double *yData, int size ) { delete d_series; d_series = new QwtCPointerData( xData, yData, size ); itemChanged(); } /*! Set data by copying x- and y-values from specified memory blocks. Contrary to setRawSamples(), this function makes a 'deep copy' of the data. \param xData pointer to x values \param yData pointer to y values \param size size of xData and yData \sa QwtCPointerData */ void QwtPlotCurve::setSamples( const double *xData, const double *yData, int size ) { delete d_series; d_series = new QwtPointArrayData( xData, yData, size ); itemChanged(); } /*! \brief Initialize data with x- and y-arrays (explicitly shared) \param xData x data \param yData y data \sa QwtArrayData */ void QwtPlotCurve::setSamples( const QVector &xData, const QVector &yData ) { delete d_series; d_series = new QwtPointArrayData( xData, yData ); itemChanged(); } #endif // !QWT_NO_COMPAT starpu-1.1.5/starpu-top/qwt/qwt_clipper.h0000644000373600000000000000162512571536560015417 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CLIPPER_H #define QWT_CLIPPER_H #include "qwt_global.h" #include "qwt_interval.h" #include #include class QRect; class QRectF; /*! \brief Some clipping algos */ class QWT_EXPORT QwtClipper { public: static QPolygon clipPolygon( const QRect &, const QPolygon & ); static QPolygonF clipPolygonF( const QRectF &, const QPolygonF & ); static QVector clipCircle( const QRectF &, const QPointF &, double radius ); }; #endif starpu-1.1.5/starpu-top/qwt/qwt_dial_needle.cpp0000644000373600000000000004204112571536560016536 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial_needle.h" #include "qwt_global.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include //! Constructor QwtDialNeedle::QwtDialNeedle(): d_palette( QApplication::palette() ) { } //! Destructor QwtDialNeedle::~QwtDialNeedle() { } /*! Sets the palette for the needle. \param palette New Palette */ void QwtDialNeedle::setPalette( const QPalette &palette ) { d_palette = palette; } /*! \return the palette of the needle. */ const QPalette &QwtDialNeedle::palette() const { return d_palette; } //! Draw the knob void QwtDialNeedle::drawKnob( QPainter *painter, const QPoint &pos, int width, const QBrush &brush, bool sunken ) { painter->save(); QRect rect( 0, 0, width, width ); rect.moveCenter( pos ); painter->setPen( Qt::NoPen ); painter->setBrush( brush ); painter->drawEllipse( rect ); painter->setBrush( Qt::NoBrush ); const int colorOffset = 20; int startAngle = 45; if ( sunken ) startAngle += 180; QPen pen; pen.setWidth( 1 ); pen.setColor( brush.color().dark( 100 - colorOffset ) ); painter->setPen( pen ); painter->drawArc( rect, startAngle * 16, 180 * 16 ); pen.setColor( brush.color().dark( 100 + colorOffset ) ); painter->setPen( pen ); painter->drawArc( rect, ( startAngle + 180 ) * 16, 180 * 16 ); painter->restore(); } /*! Constructor \param style Style \param hasKnob With/Without knob \param mid Middle color \param base Base color */ QwtDialSimpleNeedle::QwtDialSimpleNeedle( Style style, bool hasKnob, const QColor &mid, const QColor &base ): d_style( style ), d_hasKnob( hasKnob ), d_width( -1 ) { QPalette palette; for ( int i = 0; i < QPalette::NColorGroups; i++ ) { palette.setColor( ( QPalette::ColorGroup )i, QPalette::Mid, mid ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Base, base ); } setPalette( palette ); } /*! Set the width of the needle \param width Width \sa width() */ void QwtDialSimpleNeedle::setWidth( int width ) { d_width = width; } /*! \return the width of the needle \sa setWidth() */ int QwtDialSimpleNeedle::width() const { return d_width; } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtDialSimpleNeedle::draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_style == Arrow ) { drawArrowNeedle( painter, palette(), colorGroup, center, length, d_width, direction, d_hasKnob ); } else { drawRayNeedle( painter, palette(), colorGroup, center, length, d_width, direction, d_hasKnob ); } } /*! Draw a needle looking like a ray \param painter Painter \param palette Palette \param colorGroup Color group \param center center of the needle \param length Length of the needle \param width Width of the needle \param direction Current Direction \param hasKnob With/Without knob */ void QwtDialSimpleNeedle::drawRayNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, int width, double direction, bool hasKnob ) { if ( width <= 0 ) width = 5; direction *= M_PI / 180.0; painter->save(); const QPoint p1( center.x() + 1, center.y() + 2 ); const QPoint p2 = qwtPolar2Pos( p1, length, direction ); if ( width == 1 ) { const QColor midColor = palette.color( colorGroup, QPalette::Mid ); painter->setPen( QPen( midColor, 1 ) ); painter->drawLine( p1, p2 ); } else { QPolygon pa( 4 ); pa.setPoint( 0, qwtPolar2Pos( p1, width / 2, direction + M_PI_2 ) ); pa.setPoint( 1, qwtPolar2Pos( p2, width / 2, direction + M_PI_2 ) ); pa.setPoint( 2, qwtPolar2Pos( p2, width / 2, direction - M_PI_2 ) ); pa.setPoint( 3, qwtPolar2Pos( p1, width / 2, direction - M_PI_2 ) ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.brush( colorGroup, QPalette::Mid ) ); painter->drawPolygon( pa ); } if ( hasKnob ) { int knobWidth = qMax( qRound( width * 0.7 ), 5 ); if ( knobWidth % 2 == 0 ) knobWidth++; drawKnob( painter, center, knobWidth, palette.brush( colorGroup, QPalette::Base ), false ); } painter->restore(); } /*! Draw a needle looking like an arrow \param painter Painter \param palette Palette \param colorGroup Color group \param center center of the needle \param length Length of the needle \param width Width of the needle \param direction Current Direction \param hasKnob With/Without knob */ void QwtDialSimpleNeedle::drawArrowNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, int width, double direction, bool hasKnob ) { direction *= M_PI / 180.0; painter->save(); if ( width <= 0 ) { width = ( int )qMax( length * 0.06, 9.0 ); if ( width % 2 == 0 ) width++; } const int peak = 3; const QPoint p1( center.x() + 1, center.y() + 1 ); const QPoint p2 = qwtPolar2Pos( p1, length - peak, direction ); const QPoint p3 = qwtPolar2Pos( p1, length, direction ); QPolygon pa( 5 ); pa.setPoint( 0, qwtPolar2Pos( p1, width / 2, direction - M_PI_2 ) ); pa.setPoint( 1, qwtPolar2Pos( p2, 1, direction - M_PI_2 ) ); pa.setPoint( 2, p3 ); pa.setPoint( 3, qwtPolar2Pos( p2, 1, direction + M_PI_2 ) ); pa.setPoint( 4, qwtPolar2Pos( p1, width / 2, direction + M_PI_2 ) ); painter->setPen( Qt::NoPen ); painter->setBrush( palette.brush( colorGroup, QPalette::Mid ) ); painter->drawPolygon( pa ); QPolygon shadowPa( 3 ); const int colorOffset = 10; int i; for ( i = 0; i < 3; i++ ) shadowPa.setPoint( i, pa[i] ); const QColor midColor = palette.color( colorGroup, QPalette::Mid ); painter->setPen( midColor.dark( 100 + colorOffset ) ); painter->drawPolyline( shadowPa ); for ( i = 0; i < 3; i++ ) shadowPa.setPoint( i, pa[i + 2] ); painter->setPen( midColor.dark( 100 - colorOffset ) ); painter->drawPolyline( shadowPa ); if ( hasKnob ) { drawKnob( painter, center, qRound( width * 1.3 ), palette.brush( colorGroup, QPalette::Base ), false ); } painter->restore(); } //! Constructor QwtCompassMagnetNeedle::QwtCompassMagnetNeedle( Style style, const QColor &light, const QColor &dark ): d_style( style ) { QPalette palette; for ( int i = 0; i < QPalette::NColorGroups; i++ ) { palette.setColor( ( QPalette::ColorGroup )i, QPalette::Light, light ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Dark, dark ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Base, Qt::darkGray ); } setPalette( palette ); } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtCompassMagnetNeedle::draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_style == ThinStyle ) { drawThinNeedle( painter, palette(), colorGroup, center, length, direction ); } else { drawTriangleNeedle( painter, palette(), colorGroup, center, length, direction ); } } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup Color group \param center Center, where the needle starts \param length Length of the needle \param direction Direction */ void QwtCompassMagnetNeedle::drawTriangleNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush darkBrush = palette.brush( colorGroup, QPalette::Dark ); const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); QBrush brush; const int width = qRound( length / 3.0 ); const int colorOffset = 10; painter->save(); painter->setPen( Qt::NoPen ); const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); QPolygon pa( 3 ); pa.setPoint( 0, arrowCenter ); pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction ) ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction + 90.0 ) ); brush = darkBrush; brush.setColor( brush.color().dark( 100 + colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction - 90.0 ) ); brush = darkBrush; brush.setColor( brush.color().dark( 100 - colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); // -- pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction + 180.0 ) ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction + 90.0 ) ); brush = lightBrush; brush.setColor( brush.color().dark( 100 + colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, width / 2, direction - 90.0 ) ); brush = lightBrush; brush.setColor( brush.color().dark( 100 - colorOffset ) ); painter->setBrush( brush ); painter->drawPolygon( pa ); painter->restore(); } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup Color group \param center Center, where the needle starts \param length Length of the needle \param direction Direction */ void QwtCompassMagnetNeedle::drawThinNeedle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush darkBrush = palette.brush( colorGroup, QPalette::Dark ); const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); const QBrush baseBrush = palette.brush( colorGroup, QPalette::Base ); const int colorOffset = 10; const int width = qMax( qRound( length / 6.0 ), 3 ); painter->save(); const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); drawPointer( painter, darkBrush, colorOffset, arrowCenter, length, width, direction ); drawPointer( painter, lightBrush, -colorOffset, arrowCenter, length, width, direction + 180.0 ); drawKnob( painter, arrowCenter, width, baseBrush, true ); painter->restore(); } /*! Draw a compass needle \param painter Painter \param brush Brush \param colorOffset Color offset \param center Center, where the needle starts \param length Length of the needle \param width Width of the needle \param direction Direction */ void QwtCompassMagnetNeedle::drawPointer( QPainter *painter, const QBrush &brush, int colorOffset, const QPoint ¢er, int length, int width, double direction ) { painter->save(); const int peak = qMax( qRound( length / 10.0 ), 5 ); const int knobWidth = width + 8; QRect knobRect( 0, 0, knobWidth, knobWidth ); knobRect.moveCenter( center ); QPolygon pa( 5 ); pa.setPoint( 0, qwtDegree2Pos( center, width / 2, direction + 90.0 ) ); pa.setPoint( 1, center ); pa.setPoint( 2, qwtDegree2Pos( pa.point( 1 ), length - peak, direction ) ); pa.setPoint( 3, qwtDegree2Pos( center, length, direction ) ); pa.setPoint( 4, qwtDegree2Pos( pa.point( 0 ), length - peak, direction ) ); painter->setPen( Qt::NoPen ); QBrush darkBrush = brush; darkBrush.setColor( darkBrush.color().dark( 100 + colorOffset ) ); painter->setBrush( darkBrush ); painter->drawPolygon( pa ); painter->drawPie( knobRect, qRound( direction * 16 ), 90 * 16 ); pa.setPoint( 0, qwtDegree2Pos( center, width / 2, direction - 90.0 ) ); pa.setPoint( 4, qwtDegree2Pos( pa.point( 0 ), length - peak, direction ) ); QBrush lightBrush = brush; lightBrush.setColor( lightBrush.color().dark( 100 - colorOffset ) ); painter->setBrush( lightBrush ); painter->drawPolygon( pa ); painter->drawPie( knobRect, qRound( direction * 16 ), -90 * 16 ); painter->restore(); } /*! Constructor \param style Arrow style \param light Light color \param dark Dark color */ QwtCompassWindArrow::QwtCompassWindArrow( Style style, const QColor &light, const QColor &dark ): d_style( style ) { QPalette palette; for ( int i = 0; i < QPalette::NColorGroups; i++ ) { palette.setColor( ( QPalette::ColorGroup )i, QPalette::Light, light ); palette.setColor( ( QPalette::ColorGroup )i, QPalette::Dark, dark ); } setPalette( palette ); } /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ void QwtCompassWindArrow::draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup ) const { if ( d_style == Style1 ) { drawStyle1Needle( painter, palette(), colorGroup, center, length, direction ); } else { drawStyle2Needle( painter, palette(), colorGroup, center, length, direction ); } } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup colorGroup \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise */ void QwtCompassWindArrow::drawStyle1Needle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); const double AR1[] = {0, 0.4, 0.3, 1, 0.8, 1, 0.3, 0.4}; const double AW1[] = {0, -45, -20, -15, 0, 15, 20, 45}; const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); QPolygon pa( 8 ); pa.setPoint( 0, arrowCenter ); for ( int i = 1; i < 8; i++ ) { const QPoint p = qwtDegree2Pos( center, AR1[i] * length, direction + AW1[i] ); pa.setPoint( i, p ); } painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( lightBrush ); painter->drawPolygon( pa ); painter->restore(); } /*! Draw a compass needle \param painter Painter \param palette Palette \param colorGroup colorGroup \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise */ void QwtCompassWindArrow::drawStyle2Needle( QPainter *painter, const QPalette &palette, QPalette::ColorGroup colorGroup, const QPoint ¢er, int length, double direction ) { const QBrush lightBrush = palette.brush( colorGroup, QPalette::Light ); const QBrush darkBrush = palette.brush( colorGroup, QPalette::Dark ); painter->save(); painter->setPen( Qt::NoPen ); const double angle = 12.0; const double ratio = 0.7; const QPoint arrowCenter( center.x() + 1, center.y() + 1 ); QPolygon pa( 3 ); pa.setPoint( 0, center ); pa.setPoint( 2, qwtDegree2Pos( arrowCenter, ratio * length, direction ) ); pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction + angle ) ); painter->setBrush( darkBrush ); painter->drawPolygon( pa ); pa.setPoint( 1, qwtDegree2Pos( arrowCenter, length, direction - angle ) ); painter->setBrush( lightBrush ); painter->drawPolygon( pa ); painter->restore(); } starpu-1.1.5/starpu-top/qwt/qwt_wheel.h0000644000373600000000000000456612571536557015102 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_WHEEL_H #define QWT_WHEEL_H #include "qwt_global.h" #include "qwt_abstract_slider.h" /*! \brief The Wheel Widget The wheel widget can be used to change values over a very large range in very small steps. Using the setMass member, it can be configured as a flywheel. \sa The radio example. */ class QWT_EXPORT QwtWheel : public QwtAbstractSlider { Q_OBJECT Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( double viewAngle READ viewAngle WRITE setViewAngle ) Q_PROPERTY( int tickCnt READ tickCnt WRITE setTickCnt ) Q_PROPERTY( int internalBorder READ internalBorder WRITE setInternalBorder ) Q_PROPERTY( double mass READ mass WRITE setMass ) public: explicit QwtWheel( QWidget *parent = NULL ); virtual ~QwtWheel(); virtual void setOrientation( Qt::Orientation ); double totalAngle() const; double viewAngle() const; int tickCnt() const; int internalBorder() const; double mass() const; void setTotalAngle ( double angle ); void setTickCnt( int cnt ); void setViewAngle( double angle ); void setInternalBorder( int width ); void setMass( double val ); void setWheelWidth( int w ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; protected: virtual void resizeEvent( QResizeEvent *e ); virtual void paintEvent( QPaintEvent *e ); void layoutWheel( bool update = true ); void draw( QPainter *, const QRect & ); void drawWheel( QPainter *, const QRect & ); void drawWheelBackground( QPainter *, const QRect & ); void setColorArray(); virtual void valueChange(); virtual void paletteChange( const QPalette & ); virtual double getValue( const QPoint & ); virtual void getScrollMode( const QPoint &, int &scrollMode, int &direction ); private: void initWheel(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_legend_item.cpp0000644000373600000000000002202112571536560016561 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend_item.h" #include "qwt_math.h" #include "qwt_painter.h" #include "qwt_symbol.h" #include #include #include #include #include #include static const int ButtonFrame = 2; static const int Margin = 2; static QSize buttonShift( const QwtLegendItem *w ) { QStyleOption option; option.init( w ); const int ph = w->style()->pixelMetric( QStyle::PM_ButtonShiftHorizontal, &option, w ); const int pv = w->style()->pixelMetric( QStyle::PM_ButtonShiftVertical, &option, w ); return QSize( ph, pv ); } class QwtLegendItem::PrivateData { public: PrivateData(): itemMode( QwtLegend::ReadOnlyItem ), isDown( false ), identifierSize( 8, 8 ), spacing( Margin ) { } QwtLegend::LegendItemMode itemMode; bool isDown; QSize identifierSize; QPixmap identifier; int spacing; }; /*! \param parent Parent widget */ QwtLegendItem::QwtLegendItem( QWidget *parent ): QwtTextLabel( parent ) { d_data = new PrivateData; setMargin( Margin ); setIndent( Margin + d_data->identifierSize.width() + 2 * d_data->spacing ); } //! Destructor QwtLegendItem::~QwtLegendItem() { delete d_data; d_data = NULL; } /*! Set the text to the legend item \param text Text label \sa QwtTextLabel::text() */ void QwtLegendItem::setText( const QwtText &text ) { const int flags = Qt::AlignLeft | Qt::AlignVCenter | Qt::TextExpandTabs | Qt::TextWordWrap; QwtText txt = text; txt.setRenderFlags( flags ); QwtTextLabel::setText( txt ); } /*! Set the item mode The default is QwtLegend::ReadOnlyItem \param mode Item mode \sa itemMode() */ void QwtLegendItem::setItemMode( QwtLegend::LegendItemMode mode ) { if ( mode != d_data->itemMode ) { d_data->itemMode = mode; d_data->isDown = false; setFocusPolicy( mode != QwtLegend::ReadOnlyItem ? Qt::TabFocus : Qt::NoFocus ); setMargin( ButtonFrame + Margin ); updateGeometry(); } } /*! Return the item mode \sa setItemMode() */ QwtLegend::LegendItemMode QwtLegendItem::itemMode() const { return d_data->itemMode; } /*! Assign the identifier The identifier needs to be created according to the identifierWidth() \param identifier Pixmap representing a plot item \sa identifier(), identifierWidth() */ void QwtLegendItem::setIdentifier( const QPixmap &identifier ) { d_data->identifier = identifier; update(); } /*! \return pixmap representing a plot item \sa setIdentifier() */ QPixmap QwtLegendItem::identifier() const { return d_data->identifier; } /*! Set the size for the identifier Default is 8x8 pixels \param size New size \sa identifierSize() */ void QwtLegendItem::setIdentifierSize( const QSize &size ) { QSize sz = size.expandedTo( QSize( 0, 0 ) ); if ( sz != d_data->identifierSize ) { d_data->identifierSize = sz; setIndent( margin() + d_data->identifierSize.width() + 2 * d_data->spacing ); updateGeometry(); } } /*! Return the width of the identifier \sa setIdentifierSize() */ QSize QwtLegendItem::identifierSize() const { return d_data->identifierSize; } /*! Change the spacing \param spacing Spacing \sa spacing(), identifierWidth(), QwtTextLabel::margin() */ void QwtLegendItem::setSpacing( int spacing ) { spacing = qMax( spacing, 0 ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; setIndent( margin() + d_data->identifierSize.width() + 2 * d_data->spacing ); } } /*! Return the spacing \sa setSpacing(), identifierWidth(), QwtTextLabel::margin() */ int QwtLegendItem::spacing() const { return d_data->spacing; } /*! Check/Uncheck a the item \param on check/uncheck \sa setItemMode() */ void QwtLegendItem::setChecked( bool on ) { if ( d_data->itemMode == QwtLegend::CheckableItem ) { const bool isBlocked = signalsBlocked(); blockSignals( true ); setDown( on ); blockSignals( isBlocked ); } } //! Return true, if the item is checked bool QwtLegendItem::isChecked() const { return d_data->itemMode == QwtLegend::CheckableItem && isDown(); } //! Set the item being down void QwtLegendItem::setDown( bool down ) { if ( down == d_data->isDown ) return; d_data->isDown = down; update(); if ( d_data->itemMode == QwtLegend::ClickableItem ) { if ( d_data->isDown ) Q_EMIT pressed(); else { Q_EMIT released(); Q_EMIT clicked(); } } if ( d_data->itemMode == QwtLegend::CheckableItem ) Q_EMIT checked( d_data->isDown ); } //! Return true, if the item is down bool QwtLegendItem::isDown() const { return d_data->isDown; } //! Return a size hint QSize QwtLegendItem::sizeHint() const { QSize sz = QwtTextLabel::sizeHint(); sz.setHeight( qMax( sz.height(), d_data->identifier.height() + 4 ) ); if ( d_data->itemMode != QwtLegend::ReadOnlyItem ) sz += buttonShift( this ); return sz; } //! Paint event void QwtLegendItem::paintEvent( QPaintEvent *e ) { const QRect cr = contentsRect(); QPainter painter( this ); painter.setClipRegion( e->region() ); if ( d_data->isDown ) { qDrawWinButton( &painter, 0, 0, width(), height(), palette(), true ); } painter.save(); if ( d_data->isDown ) { const QSize shiftSize = buttonShift( this ); painter.translate( shiftSize.width(), shiftSize.height() ); } painter.setClipRect( cr ); drawContents( &painter ); if ( !d_data->identifier.isNull() ) { QRect identRect = cr; identRect.setX( identRect.x() + margin() ); if ( d_data->itemMode != QwtLegend::ReadOnlyItem ) identRect.setX( identRect.x() + ButtonFrame ); identRect.setSize( d_data->identifier.size() ); identRect.moveCenter( QPoint( identRect.center().x(), cr.center().y() ) ); painter.drawPixmap( identRect, d_data->identifier ); } painter.restore(); } //! Handle mouse press events void QwtLegendItem::mousePressEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { setDown( true ); return; } case QwtLegend::CheckableItem: { setDown( !isDown() ); return; } default:; } } QwtTextLabel::mousePressEvent( e ); } //! Handle mouse release events void QwtLegendItem::mouseReleaseEvent( QMouseEvent *e ) { if ( e->button() == Qt::LeftButton ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { setDown( false ); return; } case QwtLegend::CheckableItem: { return; // do nothing, but accept } default:; } } QwtTextLabel::mouseReleaseEvent( e ); } //! Handle key press events void QwtLegendItem::keyPressEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { if ( !e->isAutoRepeat() ) setDown( true ); return; } case QwtLegend::CheckableItem: { if ( !e->isAutoRepeat() ) setDown( !isDown() ); return; } default:; } } QwtTextLabel::keyPressEvent( e ); } //! Handle key release events void QwtLegendItem::keyReleaseEvent( QKeyEvent *e ) { if ( e->key() == Qt::Key_Space ) { switch ( d_data->itemMode ) { case QwtLegend::ClickableItem: { if ( !e->isAutoRepeat() ) setDown( false ); return; } case QwtLegend::CheckableItem: { return; // do nothing, but accept } default:; } } QwtTextLabel::keyReleaseEvent( e ); }starpu-1.1.5/starpu-top/qwt/qwt_legend_item.h0000644000373600000000000000376412571536557016251 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_ITEM_H #define QWT_LEGEND_ITEM_H #include "qwt_global.h" #include "qwt_legend.h" #include "qwt_text.h" #include "qwt_text_label.h" #include /*! \brief A widget representing something on a QwtLegend(). */ class QWT_EXPORT QwtLegendItem: public QwtTextLabel { Q_OBJECT public: explicit QwtLegendItem( QWidget *parent = 0 ); virtual ~QwtLegendItem(); void setItemMode( QwtLegend::LegendItemMode ); QwtLegend::LegendItemMode itemMode() const; void setSpacing( int spacing ); int spacing() const; virtual void setText( const QwtText & ); void setIdentifier( const QPixmap & ); QPixmap identifier() const; void setIdentifierSize( const QSize & ); QSize identifierSize() const; virtual QSize sizeHint() const; bool isChecked() const; public Q_SLOTS: void setChecked( bool on ); Q_SIGNALS: //! Signal, when the legend item has been clicked void clicked(); //! Signal, when the legend item has been pressed void pressed(); //! Signal, when the legend item has been relased void released(); //! Signal, when the legend item has been toggled void checked( bool ); protected: void setDown( bool ); bool isDown() const; virtual void paintEvent( QPaintEvent * ); virtual void mousePressEvent( QMouseEvent * ); virtual void mouseReleaseEvent( QMouseEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void keyReleaseEvent( QKeyEvent * ); private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_color_map.cpp0000644000373600000000000002456612571536557016306 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_color_map.h" #include "qwt_math.h" #include "qwt_interval.h" #include typedef QVector QwtColorTable; class QwtLinearColorMap::ColorStops { public: ColorStops() { _stops.reserve( 256 ); } void insert( double pos, const QColor &color ); QRgb rgb( QwtLinearColorMap::Mode, double pos ) const; QVector stops() const; private: class ColorStop { public: ColorStop(): pos( 0.0 ), rgb( 0 ) { }; ColorStop( double p, const QColor &c ): pos( p ), rgb( c.rgb() ) { r = qRed( rgb ); g = qGreen( rgb ); b = qBlue( rgb ); } double pos; QRgb rgb; int r, g, b; }; inline int findUpper( double pos ) const; QVector _stops; }; void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color ) { // Lookups need to be very fast, insertions are not so important. // Anyway, a balanced tree is what we need here. TODO ... if ( pos < 0.0 || pos > 1.0 ) return; int index; if ( _stops.size() == 0 ) { index = 0; _stops.resize( 1 ); } else { index = findUpper( pos ); if ( index == ( int )_stops.size() || qAbs( _stops[index].pos - pos ) >= 0.001 ) { _stops.resize( _stops.size() + 1 ); for ( int i = _stops.size() - 1; i > index; i-- ) _stops[i] = _stops[i-1]; } } _stops[index] = ColorStop( pos, color ); } inline QVector QwtLinearColorMap::ColorStops::stops() const { QVector positions( _stops.size() ); for ( int i = 0; i < ( int )_stops.size(); i++ ) positions[i] = _stops[i].pos; return positions; } inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const { int index = 0; int n = _stops.size(); const ColorStop *stops = _stops.data(); while ( n > 0 ) { const int half = n >> 1; const int middle = index + half; if ( stops[middle].pos <= pos ) { index = middle + 1; n -= half + 1; } else n = half; } return index; } inline QRgb QwtLinearColorMap::ColorStops::rgb( QwtLinearColorMap::Mode mode, double pos ) const { if ( pos <= 0.0 ) return _stops[0].rgb; if ( pos >= 1.0 ) return _stops[( int )( _stops.size() - 1 )].rgb; const int index = findUpper( pos ); if ( mode == FixedColors ) { return _stops[index-1].rgb; } else { const ColorStop &s1 = _stops[index-1]; const ColorStop &s2 = _stops[index]; const double ratio = ( pos - s1.pos ) / ( s2.pos - s1.pos ); const int r = s1.r + qRound( ratio * ( s2.r - s1.r ) ); const int g = s1.g + qRound( ratio * ( s2.g - s1.g ) ); const int b = s1.b + qRound( ratio * ( s2.b - s1.b ) ); return qRgb( r, g, b ); } } //! Constructor QwtColorMap::QwtColorMap( Format format ): d_format( format ) { } //! Destructor QwtColorMap::~QwtColorMap() { } /*! Build and return a color map of 256 colors The color table is needed for rendering indexed images in combination with using colorIndex(). \param interval Range for the values \return A color table, that can be used for a QImage */ QwtColorTable QwtColorMap::colorTable( const QwtInterval &interval ) const { QwtColorTable table( 256 ); if ( interval.isValid() ) { const double step = interval.width() / ( table.size() - 1 ); for ( int i = 0; i < ( int ) table.size(); i++ ) table[i] = rgb( interval, interval.minValue() + step * i ); } return table; } class QwtLinearColorMap::PrivateData { public: ColorStops colorStops; QwtLinearColorMap::Mode mode; }; /*! Build a color map with two stops at 0.0 and 1.0. The color at 0.0 is Qt::blue, at 1.0 it is Qt::yellow. \param format Preferred format of the color map */ QwtLinearColorMap::QwtLinearColorMap( QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( Qt::blue, Qt::yellow ); } /*! Build a color map with two stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \param format Preferred format of the coor map */ QwtLinearColorMap::QwtLinearColorMap( const QColor &color1, const QColor &color2, QwtColorMap::Format format ): QwtColorMap( format ) { d_data = new PrivateData; d_data->mode = ScaledColors; setColorInterval( color1, color2 ); } //! Destructor QwtLinearColorMap::~QwtLinearColorMap() { delete d_data; } /*! \brief Set the mode of the color map FixedColors means the color is calculated from the next lower color stop. ScaledColors means the color is calculated by interpolating the colors of the adjacent stops. \sa mode() */ void QwtLinearColorMap::setMode( Mode mode ) { d_data->mode = mode; } /*! \return Mode of the color map \sa setMode() */ QwtLinearColorMap::Mode QwtLinearColorMap::mode() const { return d_data->mode; } /*! Set the color range Add stops at 0.0 and 1.0. \param color1 Color used for the minimum value of the value interval \param color2 Color used for the maximum value of the value interval \sa color1(), color2() */ void QwtLinearColorMap::setColorInterval( const QColor &color1, const QColor &color2 ) { d_data->colorStops = ColorStops(); d_data->colorStops.insert( 0.0, color1 ); d_data->colorStops.insert( 1.0, color2 ); } /*! Add a color stop The value has to be in the range [0.0, 1.0]. F.e. a stop at position 17.0 for a range [10.0,20.0] must be passed as: (17.0 - 10.0) / (20.0 - 10.0) \param value Value between [0.0, 1.0] \param color Color stop */ void QwtLinearColorMap::addColorStop( double value, const QColor& color ) { if ( value >= 0.0 && value <= 1.0 ) d_data->colorStops.insert( value, color ); } /*! Return all positions of color stops in increasing order */ QVector QwtLinearColorMap::colorStops() const { return d_data->colorStops.stops(); } /*! \return the first color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color1() const { return QColor( d_data->colorStops.rgb( d_data->mode, 0.0 ) ); } /*! \return the second color of the color range \sa setColorInterval() */ QColor QwtLinearColorMap::color2() const { return QColor( d_data->colorStops.rgb( d_data->mode, 1.0 ) ); } /*! Map a value of a given interval into a rgb value \param interval Range for all values \param value Value to map into a rgb value */ QRgb QwtLinearColorMap::rgb( const QwtInterval &interval, double value ) const { if ( qIsNaN(value) ) return qRgba(0, 0, 0, 0); const double width = interval.width(); double ratio = 0.0; if ( width > 0.0 ) ratio = ( value - interval.minValue() ) / width; return d_data->colorStops.rgb( d_data->mode, ratio ); } /*! Map a value of a given interval into a color index, between 0 and 255 \param interval Range for all values \param value Value to map into a color index */ unsigned char QwtLinearColorMap::colorIndex( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( qIsNaN(value) || width <= 0.0 || value <= interval.minValue() ) return 0; if ( value >= interval.maxValue() ) return ( unsigned char )255; const double ratio = ( value - interval.minValue() ) / width; unsigned char index; if ( d_data->mode == FixedColors ) index = ( unsigned char )( ratio * 255 ); // always floor else index = ( unsigned char )qRound( ratio * 255 ); return index; } class QwtAlphaColorMap::PrivateData { public: QColor color; QRgb rgb; }; /*! Constructor \param color Color of the map */ QwtAlphaColorMap::QwtAlphaColorMap( const QColor &color ): QwtColorMap( QwtColorMap::RGB ) { d_data = new PrivateData; d_data->color = color; d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 ); } //! Destructor QwtAlphaColorMap::~QwtAlphaColorMap() { delete d_data; } /*! Set the color \param color Color \sa color() */ void QwtAlphaColorMap::setColor( const QColor &color ) { d_data->color = color; d_data->rgb = color.rgb(); } /*! \return the color \sa setColor() */ QColor QwtAlphaColorMap::color() const { return d_data->color; } /*! \brief Map a value of a given interval into a alpha value alpha := (value - interval.minValue()) / interval.width(); \param interval Range for all values \param value Value to map into a rgb value \return rgb value, with an alpha value */ QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const { const double width = interval.width(); if ( !qIsNaN(value) && width >= 0.0 ) { const double ratio = ( value - interval.minValue() ) / width; int alpha = qRound( 255 * ratio ); if ( alpha < 0 ) alpha = 0; if ( alpha > 255 ) alpha = 255; return d_data->rgb | ( alpha << 24 ); } return d_data->rgb; } /*! Dummy function, needed to be implemented as it is pure virtual in QwtColorMap. Color indices make no sense in combination with an alpha channel. \return Always 0 */ unsigned char QwtAlphaColorMap::colorIndex( const QwtInterval &, double ) const { return 0; } starpu-1.1.5/starpu-top/qwt/qwt_math.h0000644000373600000000000001166312571536557014723 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_MATH_H #define QWT_MATH_H #include "qwt_global.h" #if defined(_MSC_VER) /* Microsoft says: Define _USE_MATH_DEFINES before including math.h to expose these macro definitions for common math constants. These are placed under an #ifdef since these commonly-defined names are not part of the C/C++ standards. */ #define _USE_MATH_DEFINES 1 #endif #include #include #include "qwt_global.h" #ifndef LOG10_2 #define LOG10_2 0.30102999566398119802 /* log10(2) */ #endif #ifndef LOG10_3 #define LOG10_3 0.47712125471966243540 /* log10(3) */ #endif #ifndef LOG10_5 #define LOG10_5 0.69897000433601885749 /* log10(5) */ #endif #ifndef M_2PI #define M_2PI 6.28318530717958623200 /* 2 pi */ #endif #ifndef LOG_MIN //! Mininum value for logarithmic scales #define LOG_MIN 1.0e-100 #endif #ifndef LOG_MAX //! Maximum value for logarithmic scales #define LOG_MAX 1.0e100 #endif #ifndef M_E #define M_E 2.7182818284590452354 /* e */ #endif #ifndef M_LOG2E #define M_LOG2E 1.4426950408889634074 /* log_2 e */ #endif #ifndef M_LOG10E #define M_LOG10E 0.43429448190325182765 /* log_10 e */ #endif #ifndef M_LN2 #define M_LN2 0.69314718055994530942 /* log_e 2 */ #endif #ifndef M_LN10 #define M_LN10 2.30258509299404568402 /* log_e 10 */ #endif #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 /* pi/2 */ #endif #ifndef M_PI_4 #define M_PI_4 0.78539816339744830962 /* pi/4 */ #endif #ifndef M_1_PI #define M_1_PI 0.31830988618379067154 /* 1/pi */ #endif #ifndef M_2_PI #define M_2_PI 0.63661977236758134308 /* 2/pi */ #endif #ifndef M_2_SQRTPI #define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ #endif #ifndef M_SQRT1_2 #define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #endif QWT_EXPORT double qwtGetMin( const double *array, int size ); QWT_EXPORT double qwtGetMax( const double *array, int size ); /*! \brief Compare 2 values, relative to an interval Values are "equal", when : \f$\cdot value2 - value1 <= abs(intervalSize * 10e^{-6})\f$ \param value1 First value to compare \param value2 Second value to compare \param intervalSize interval size \return 0: if equal, -1: if value2 > value1, 1: if value1 > value2 */ inline int qwtFuzzyCompare( double value1, double value2, double intervalSize ) { const double eps = qAbs( 1.0e-6 * intervalSize ); if ( value2 - value1 > eps ) return -1; if ( value1 - value2 > eps ) return 1; return 0; } inline bool qwtFuzzyGreaterOrEqual( double d1, double d2 ) { return ( d1 >= d2 ) || qFuzzyCompare( d1, d2 ); } inline bool qwtFuzzyLessOrEqual( double d1, double d2 ) { return ( d1 <= d2 ) || qFuzzyCompare( d1, d2 ); } //! Return the sign inline int qwtSign( double x ) { if ( x > 0.0 ) return 1; else if ( x < 0.0 ) return ( -1 ); else return 0; } //! Return the square of a number inline double qwtSqr( const double x ) { return x * x; } /*! \brief Limit a value to fit into a specified interval \param x Input value \param x1 First interval boundary \param x2 Second interval boundary */ template T qwtLim( const T& x, const T& x1, const T& x2 ) { T rv; T xmin, xmax; xmin = qMin( x1, x2 ); xmax = qMax( x1, x2 ); if ( x < xmin ) rv = xmin; else if ( x > xmax ) rv = xmax; else rv = x; return rv; } inline QPoint qwtPolar2Pos( const QPoint &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPoint( qRound( x ), qRound( y ) ); } inline QPoint qwtDegree2Pos( const QPoint &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } inline QPointF qwtPolar2Pos( const QPointF &pole, double radius, double angle ) { const double x = pole.x() + radius * qCos( angle ); const double y = pole.y() - radius * qSin( angle ); return QPoint( qRound( x ), qRound( y ) ); } inline QPointF qwtDegree2Pos( const QPointF &pole, double radius, double angle ) { return qwtPolar2Pos( pole, radius, angle / 180.0 * M_PI ); } #endif starpu-1.1.5/starpu-top/qwt/qwt_painter.h0000644000373600000000000001116412571536557015430 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PAINTER_H #define QWT_PAINTER_H #include "qwt_global.h" #include #include #include #include class QPainter; class QBrush; class QColor; class QWidget; class QPolygonF; class QRectF; class QImage; class QPixmap; class QwtScaleMap; class QwtColorMap; class QwtInterval; class QPalette; class QTextDocument; /*! \brief A collection of QPainter workarounds */ class QWT_EXPORT QwtPainter { public: static void setPolylineSplitting( bool ); static bool polylineSplitting(); static void setRoundingAlignment( bool ); static bool roundingAlignment(); static bool roundingAlignment(QPainter *); static void drawText( QPainter *, double x, double y, const QString & ); static void drawText( QPainter *, const QPointF &, const QString & ); static void drawText( QPainter *, double x, double y, double w, double h, int flags, const QString & ); static void drawText( QPainter *, const QRectF &, int flags, const QString & ); #ifndef QT_NO_RICHTEXT static void drawSimpleRichText( QPainter *, const QRectF &, int flags, const QTextDocument & ); #endif static void drawRect( QPainter *, double x, double y, double w, double h ); static void drawRect( QPainter *, const QRectF &rect ); static void fillRect( QPainter *, const QRectF &, const QBrush & ); static void drawEllipse( QPainter *, const QRectF & ); static void drawPie( QPainter *, const QRectF & r, int a, int alen ); static void drawLine( QPainter *, double x1, double y1, double x2, double y2 ); static void drawLine( QPainter *, const QPointF &p1, const QPointF &p2 ); static void drawLine( QPainter *, const QLineF & ); static void drawPolygon( QPainter *, const QPolygonF &pa ); static void drawPolyline( QPainter *, const QPolygonF &pa ); static void drawPolyline( QPainter *, const QPointF *, int pointCount ); static void drawPoint( QPainter *, double x, double y ); static void drawPoint( QPainter *, const QPointF & ); static void drawImage( QPainter *, const QRectF &, const QImage & ); static void drawPixmap( QPainter *, const QRectF &, const QPixmap & ); static void drawRoundFrame( QPainter *, const QRect &, int width, const QPalette &, bool sunken ); static void drawFocusRect( QPainter *, QWidget * ); static void drawFocusRect( QPainter *, QWidget *, const QRect & ); static void drawColorBar( QPainter *painter, const QwtColorMap &, const QwtInterval &, const QwtScaleMap &, Qt::Orientation, const QRectF & ); static bool isAligning( QPainter *painter ); private: static void drawColoredArc( QPainter *, const QRect &, int peak, int arc, int intervall, const QColor &c1, const QColor &c2 ); static bool d_polylineSplitting; static bool d_roundingAlignment; }; //! Wrapper for QPainter::drawPoint() inline void QwtPainter::drawPoint( QPainter *painter, double x, double y ) { QwtPainter::drawPoint( painter, QPointF( x, y ) ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, double x1, double y1, double x2, double y2 ) { QwtPainter::drawLine( painter, QPointF( x1, y1 ), QPointF( x2, y2 ) ); } //! Wrapper for QPainter::drawLine() inline void QwtPainter::drawLine( QPainter *painter, const QLineF &line ) { QwtPainter::drawLine( painter, line.p1(), line.p2() ); } /*! Returns whether line splitting for the raster paint engine is enabled. \sa setPolylineSplitting() */ inline bool QwtPainter::polylineSplitting() { return d_polylineSplitting; } /*! Returns whether coordinates should be rounded, before they are painted to a paint engine that floors to integer values. For other paint engines this ( Pdf, SVG ), this flag has no effect. \sa setRoundingAlignment(), isAligning() */ inline bool QwtPainter::roundingAlignment() { return d_roundingAlignment; } /*! \return roundingAlignment() && isAligning(painter); \param painter Painter */ inline bool QwtPainter::roundingAlignment(QPainter *painter) { return d_roundingAlignment && isAligning(painter); } #endif starpu-1.1.5/starpu-top/qwt/qwt_abstract_scale_draw.h0000644000373600000000000000671312571536557017761 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_DRAW_H #define QWT_ABSTRACT_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_text.h" class QPalette; class QPainter; class QFont; class QwtScaleTransformation; class QwtScaleMap; /*! \brief A abstract base class for drawing scales QwtAbstractScaleDraw can be used to draw linear or logarithmic scales. After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtAbstractScaleDraw { public: /*! Components of a scale - Backbone - Ticks - Labels \sa enableComponent(), hasComponent */ enum ScaleComponent { Backbone = 1, Ticks = 2, Labels = 4 }; QwtAbstractScaleDraw(); virtual ~QwtAbstractScaleDraw(); void setScaleDiv( const QwtScaleDiv &s ); const QwtScaleDiv& scaleDiv() const; void setTransformation( QwtScaleTransformation * ); const QwtScaleMap &map() const; void enableComponent( ScaleComponent, bool enable = true ); bool hasComponent( ScaleComponent ) const; void setTickLength( QwtScaleDiv::TickType, double length ); double tickLength( QwtScaleDiv::TickType ) const; double majTickLength() const; void setSpacing( double margin ); double spacing() const; void setPenWidth( int width ); int penWidth() const; virtual void draw( QPainter *, const QPalette & ) const; virtual QwtText label( double ) const; /*! Calculate the extent The extent is the distcance from the baseline to the outermost pixel of the scale draw in opposite to its orientation. It is at least minimumExtent() pixels. \sa setMinimumExtent(), minimumExtent() */ virtual double extent( const QFont & ) const = 0; void setMinimumExtent( double ); double minimumExtent() const; QwtScaleMap &scaleMap(); protected: /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ virtual void drawTick( QPainter *painter, double value, double len ) const = 0; /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ virtual void drawBackbone( QPainter *painter ) const = 0; /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick, drawBackbone */ virtual void drawLabel( QPainter *painter, double value ) const = 0; void invalidateCache(); const QwtText &tickLabel( const QFont &, double value ) const; private: QwtAbstractScaleDraw( const QwtAbstractScaleDraw & ); QwtAbstractScaleDraw &operator=( const QwtAbstractScaleDraw & ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_scale_draw.cpp0000644000373600000000000005461012571536557016430 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include class QwtScaleDraw::PrivateData { public: PrivateData(): len( 0 ), alignment( QwtScaleDraw::BottomScale ), labelAlignment( 0 ), labelRotation( 0.0 ) { } QPointF pos; double len; Alignment alignment; Qt::Alignment labelAlignment; double labelRotation; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The position is at (0, 0) with a length of 100. The orientation is QwtAbstractScaleDraw::Bottom. */ QwtScaleDraw::QwtScaleDraw() { d_data = new QwtScaleDraw::PrivateData; setLength( 100 ); } //! Destructor QwtScaleDraw::~QwtScaleDraw() { delete d_data; } /*! Return alignment of the scale \sa setAlignment() */ QwtScaleDraw::Alignment QwtScaleDraw::alignment() const { return d_data->alignment; } /*! Set the alignment of the scale The default alignment is QwtScaleDraw::BottomScale \sa alignment() */ void QwtScaleDraw::setAlignment( Alignment align ) { d_data->alignment = align; } /*! Return the orientation TopScale, BottomScale are horizontal (Qt::Horizontal) scales, LeftScale, RightScale are vertical (Qt::Vertical) scales. \sa alignment() */ Qt::Orientation QwtScaleDraw::orientation() const { switch ( d_data->alignment ) { case TopScale: case BottomScale: return Qt::Horizontal; case LeftScale: case RightScale: default: return Qt::Vertical; } } /*! \brief Determine the minimum border distance This member function returns the minimum space needed to draw the mark labels at the scale's endpoints. \param font Font \param start Start border distance \param end End border distance */ void QwtScaleDraw::getBorderDistHint( const QFont &font, int &start, int &end ) const { start = 0; end = 0; if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.count() == 0 ) return; // Find the ticks, that are mapped to the borders. // minTick is the tick, that is mapped to the top/left-most position // in widget coordinates. double minTick = ticks[0]; double minPos = map().transform( minTick ); double maxTick = minTick; double maxPos = minPos; for ( uint i = 1; i < ( uint )ticks.count(); i++ ) { const double tickPos = map().transform( ticks[i] ); if ( tickPos < minPos ) { minTick = ticks[i]; minPos = tickPos; } if ( tickPos > map().transform( maxTick ) ) { maxTick = ticks[i]; maxPos = tickPos; } } double e = 0.0; double s = 0.0; if ( orientation() == Qt::Vertical ) { s = -labelRect( font, minTick ).top(); s -= qAbs( minPos - qRound( map().p2() ) ); e = labelRect( font, maxTick ).bottom(); e -= qAbs( maxPos - map().p1() ); } else { s = -labelRect( font, minTick ).left(); s -= qAbs( minPos - map().p1() ); e = labelRect( font, maxTick ).right(); e -= qAbs( maxPos - map().p2() ); } if ( s < 0.0 ) s = 0.0; if ( e < 0.0 ) e = 0.0; start = qCeil( s ); end = qCeil( e ); } /*! Determine the minimum distance between two labels, that is necessary that the texts don't overlap. \param font Font \return The maximum width of a label \sa getBorderDistHint() */ int QwtScaleDraw::minLabelDist( const QFont &font ) const { if ( !hasComponent( QwtAbstractScaleDraw::Labels ) ) return 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); if ( ticks.count() == 0 ) return 0; const QFontMetrics fm( font ); const bool vertical = ( orientation() == Qt::Vertical ); QRectF bRect1; QRectF bRect2 = labelRect( font, ticks[0] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0, bRect2.height(), bRect2.width() ); } int maxDist = 0; for ( uint i = 1; i < ( uint )ticks.count(); i++ ) { bRect1 = bRect2; bRect2 = labelRect( font, ticks[i] ); if ( vertical ) { bRect2.setRect( -bRect2.bottom(), 0, bRect2.height(), bRect2.width() ); } int dist = fm.leading(); // space between the labels if ( bRect1.right() > 0 ) dist += bRect1.right(); if ( bRect2.left() < 0 ) dist += -bRect2.left(); if ( dist > maxDist ) maxDist = dist; } double angle = labelRotation() / 180.0 * M_PI; if ( vertical ) angle += M_PI / 2; if ( qSin( angle ) == 0.0 ) return maxDist; const int fmHeight = fm.ascent() - 2; // The distance we need until there is // the height of the label font. This height is needed // for the neighbour labal. int labelDist = ( int )( fmHeight / qSin( angle ) * qCos( angle ) ); if ( labelDist < 0 ) labelDist = -labelDist; // The cast above floored labelDist. We want to ceil. labelDist++; // For text orientations close to the scale orientation if ( labelDist > maxDist ) labelDist = maxDist; // For text orientations close to the opposite of the // scale orientation if ( labelDist < fmHeight ) labelDist = fmHeight; return labelDist; } /*! Calculate the width/height that is needed for a vertical/horizontal scale. The extent is calculated from the pen width of the backbone, the major tick length, the spacing and the maximum width/height of the labels. \param font Font used for painting the labels \sa minLength() */ double QwtScaleDraw::extent( const QFont &font ) const { double d = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( orientation() == Qt::Vertical ) d = maxLabelWidth( font ); else d = maxLabelHeight( font ); if ( d > 0 ) d += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += majTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero d += pw; } d = qMax( d, minimumExtent() ); return d; } /*! Calculate the minimum length that is needed to draw the scale \param font Font used for painting the labels \sa extent() */ int QwtScaleDraw::minLength( const QFont &font ) const { int startDist, endDist; getBorderDistHint( font, startDist, endDist ); const QwtScaleDiv &sd = scaleDiv(); const uint minorCount = sd.ticks( QwtScaleDiv::MinorTick ).count() + sd.ticks( QwtScaleDiv::MediumTick ).count(); const uint majorCount = sd.ticks( QwtScaleDiv::MajorTick ).count(); int lengthForLabels = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( majorCount >= 2 ) lengthForLabels = minLabelDist( font ) * ( majorCount - 1 ); } int lengthForTicks = 0; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero lengthForTicks = qCeil( ( majorCount + minorCount ) * ( pw + 1.0 ) ); } return startDist + endDist + qMax( lengthForLabels, lengthForTicks ); } /*! Find the position, where to paint a label The position has a distance of majTickLength() + spacing() + 1 from the backbone. The direction depends on the alignment() \param value Value */ QPointF QwtScaleDraw::labelPosition( double value ) const { const double tval = map().transform( value ); double dist = spacing(); if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) dist += qMax( 1, penWidth() ); if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) dist += majTickLength(); double px = 0; double py = 0; switch ( alignment() ) { case RightScale: { px = d_data->pos.x() + dist; py = tval; break; } case LeftScale: { px = d_data->pos.x() - dist; py = tval; break; } case BottomScale: { px = tval; py = d_data->pos.y() + dist; break; } case TopScale: { px = tval; py = d_data->pos.y() - dist; break; } } return QPointF( px, py ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const bool roundingAlignment = QwtPainter::roundingAlignment( painter ); QwtScaleMap scaleMap = map(); QPointF pos = d_data->pos; double tval = scaleMap.transform( value ); if ( roundingAlignment ) tval = qRound( tval ); const int pw = penWidth(); int a = 0; if ( pw > 1 && roundingAlignment ) a = 1; switch ( alignment() ) { case LeftScale: { double x1 = pos.x() + a; double x2 = pos.x() + a - pw - len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case RightScale: { double x1 = pos.x(); double x2 = pos.x() + pw + len; if ( roundingAlignment ) { x1 = qRound( x1 ); x2 = qRound( x2 ); } QwtPainter::drawLine( painter, x1, tval, x2, tval ); break; } case BottomScale: { double y1 = pos.y(); double y2 = pos.y() + pw + len; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } case TopScale: { double y1 = pos.y() + a; double y2 = pos.y() - pw - len + a; if ( roundingAlignment ) { y1 = qRound( y1 ); y2 = qRound( y2 ); } QwtPainter::drawLine( painter, tval, y1, tval, y2 ); break; } } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtScaleDraw::drawBackbone( QPainter *painter ) const { const bool doAlign = QwtPainter::roundingAlignment( painter ); const QPointF &pos = d_data->pos; const double len = d_data->len; const int pw = qMax( penWidth(), 1 ); // pos indicates a border not the center of the backbone line // so we need to shift its position depending on the pen width // and the alignment of the scale double off; if ( doAlign ) { if ( alignment() == LeftScale || alignment() == TopScale ) off = ( pw - 1 ) / 2; else off = pw / 2; } else { off = 0.5 * penWidth(); } switch ( alignment() ) { case LeftScale: { double x = pos.x() - off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case RightScale: { double x = pos.x() + off; if ( doAlign ) x = qRound( x ); QwtPainter::drawLine( painter, x, pos.y(), x, pos.y() + len ); break; } case TopScale: { double y = pos.y() - off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } case BottomScale: { double y = pos.y() + off; if ( doAlign ) y = qRound( y ); QwtPainter::drawLine( painter, pos.x(), y, pos.x() + len, y ); break; } } } /*! \brief Move the position of the scale The meaning of the parameter pos depends on the alignment:
QwtScaleDraw::LeftScale
The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the left of the backbone.
QwtScaleDraw::RightScale
The origin is the topmost point of the backbone. The backbone is a vertical line. Scale marks and labels are drawn at the right of the backbone.
QwtScaleDraw::TopScale
The origin is the leftmost point of the backbone. The backbone is a horizontal line. Scale marks and labels are drawn above the backbone.
QwtScaleDraw::BottomScale
The origin is the leftmost point of the backbone. The backbone is a horizontal line Scale marks and labels are drawn below the backbone.
\param pos Origin of the scale \sa pos(), setLength() */ void QwtScaleDraw::move( const QPointF &pos ) { d_data->pos = pos; updateMap(); } /*! \return Origin of the scale \sa move(), length() */ QPointF QwtScaleDraw::pos() const { return d_data->pos; } /*! Set the length of the backbone. The length doesn't include the space needed for overlapping labels. \sa move(), minLabelDist() */ void QwtScaleDraw::setLength( double length ) { if ( length >= 0 && length < 10 ) length = 10; if ( length < 0 && length > -10 ) length = -10; d_data->len = length; updateMap(); } /*! \return the length of the backbone \sa setLength(), pos() */ double QwtScaleDraw::length() const { return d_data->len; } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone(), boundingLabelRect() */ void QwtScaleDraw::drawLabel( QPainter *painter, double value ) const { QwtText lbl = tickLabel( painter->font(), value ); if ( lbl.isEmpty() ) return; QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( painter->font() ); const QTransform transform = labelTransformation( pos, labelSize ); painter->save(); painter->setWorldTransform( transform, true ); lbl.draw ( painter, QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); painter->restore(); } /*! Find the bounding rect for the label. The coordinates of the rect are absolute coordinates ( calculated from pos() ). in direction of the tick. \param font Font used for painting \param value Value \sa labelRect() */ QRect QwtScaleDraw::boundingLabelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRect(); const QPointF pos = labelPosition( value ); QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); return transform.mapRect( QRect( QPoint( 0, 0 ), labelSize.toSize() ) ); } /*! Calculate the transformation that is needed to paint a label depending on its alignment and rotation. \param pos Position where to paint the label \param size Size of the label \sa setLabelAlignment(), setLabelRotation() */ QTransform QwtScaleDraw::labelTransformation( const QPointF &pos, const QSizeF &size ) const { QTransform transform; transform.translate( pos.x(), pos.y() ); transform.rotate( labelRotation() ); int flags = labelAlignment(); if ( flags == 0 ) { switch ( alignment() ) { case RightScale: { if ( flags == 0 ) flags = Qt::AlignRight | Qt::AlignVCenter; break; } case LeftScale: { if ( flags == 0 ) flags = Qt::AlignLeft | Qt::AlignVCenter; break; } case BottomScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignBottom; break; } case TopScale: { if ( flags == 0 ) flags = Qt::AlignHCenter | Qt::AlignTop; break; } } } double x, y; if ( flags & Qt::AlignLeft ) x = -size.width(); else if ( flags & Qt::AlignRight ) x = 0.0; else // Qt::AlignHCenter x = -( 0.5 * size.width() ); if ( flags & Qt::AlignTop ) y = -size.height(); else if ( flags & Qt::AlignBottom ) y = 0; else // Qt::AlignVCenter y = -( 0.5 * size.height() ); transform.translate( x, y ); return transform; } /*! Find the bounding rect for the label. The coordinates of the rect are relative to spacing + ticklength from the backbone in direction of the tick. \param font Font used for painting \param value Value */ QRectF QwtScaleDraw::labelRect( const QFont &font, double value ) const { QwtText lbl = tickLabel( font, value ); if ( lbl.isEmpty() ) return QRectF( 0.0, 0.0, 0.0, 0.0 ); const QPointF pos = labelPosition( value ); const QSizeF labelSize = lbl.textSize( font ); const QTransform transform = labelTransformation( pos, labelSize ); QRectF br = transform.mapRect( QRectF( QPointF( 0, 0 ), labelSize ) ); br.translate( -pos.x(), -pos.y() ); return br; } /*! Calculate the size that is needed to draw a label \param font Label font \param value Value */ QSizeF QwtScaleDraw::labelSize( const QFont &font, double value ) const { return labelRect( font, value ).size(); } /*! Rotate all labels. When changing the rotation, it might be necessary to adjust the label flags too. Finding a useful combination is often the result of try and error. \param rotation Angle in degrees. When changing the label rotation, the label flags often needs to be adjusted too. \sa setLabelAlignment(), labelRotation(), labelAlignment(). */ void QwtScaleDraw::setLabelRotation( double rotation ) { d_data->labelRotation = rotation; } /*! \return the label rotation \sa setLabelRotation(), labelAlignment() */ double QwtScaleDraw::labelRotation() const { return d_data->labelRotation; } /*! \brief Change the label flags Labels are aligned to the point ticklength + spacing away from the backbone. The alignment is relative to the orientation of the label text. In case of an flags of 0 the label will be aligned depending on the orientation of the scale: QwtScaleDraw::TopScale: Qt::AlignHCenter | Qt::AlignTop\n QwtScaleDraw::BottomScale: Qt::AlignHCenter | Qt::AlignBottom\n QwtScaleDraw::LeftScale: Qt::AlignLeft | Qt::AlignVCenter\n QwtScaleDraw::RightScale: Qt::AlignRight | Qt::AlignVCenter\n Changing the alignment is often necessary for rotated labels. \param alignment Or'd Qt::AlignmentFlags \sa setLabelRotation(), labelRotation(), labelAlignment() \warning The various alignments might be confusing. The alignment of the label is not the alignment of the scale and is not the alignment of the flags (QwtText::flags()) returned from QwtAbstractScaleDraw::label(). */ void QwtScaleDraw::setLabelAlignment( Qt::Alignment alignment ) { d_data->labelAlignment = alignment; } /*! \return the label flags \sa setLabelAlignment(), labelRotation() */ Qt::Alignment QwtScaleDraw::labelAlignment() const { return d_data->labelAlignment; } /*! \param font Font \return the maximum width of a label */ int QwtScaleDraw::maxLabelWidth( const QFont &font ) const { int maxWidth = 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( uint i = 0; i < ( uint )ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const int w = labelSize( font, ticks[i] ).width(); if ( w > maxWidth ) maxWidth = w; } } return maxWidth; } /*! \param font Font \return the maximum height of a label */ int QwtScaleDraw::maxLabelHeight( const QFont &font ) const { int maxHeight = 0; const QList &ticks = scaleDiv().ticks( QwtScaleDiv::MajorTick ); for ( uint i = 0; i < ( uint )ticks.count(); i++ ) { const double v = ticks[i]; if ( scaleDiv().contains( v ) ) { const int h = labelSize( font, ticks[i] ).height(); if ( h > maxHeight ) maxHeight = h; } } return maxHeight; } void QwtScaleDraw::updateMap() { const QPointF pos = d_data->pos; double len = d_data->len; QwtScaleMap &sm = scaleMap(); if ( orientation() == Qt::Vertical ) sm.setPaintInterval( pos.y() + len, pos.y() ); else sm.setPaintInterval( pos.x(), pos.x() + len ); } starpu-1.1.5/starpu-top/qwt/qwt_wheel.cpp0000644000373600000000000003734712571536560015432 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_wheel.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #define NUM_COLORS 30 class QwtWheel::PrivateData { public: PrivateData() { viewAngle = 175.0; totalAngle = 360.0; tickCnt = 10; intBorder = 2; borderWidth = 2; wheelWidth = 20; }; QRect sliderRect; double viewAngle; double totalAngle; int tickCnt; int intBorder; int borderWidth; int wheelWidth; QColor colors[NUM_COLORS]; }; //! Constructor QwtWheel::QwtWheel( QWidget *parent ): QwtAbstractSlider( Qt::Horizontal, parent ) { initWheel(); } void QwtWheel::initWheel() { d_data = new PrivateData; setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); setUpdateTime( 50 ); } //! Destructor QwtWheel::~QwtWheel() { delete d_data; } //! Set up the color array for the background pixmap. void QwtWheel::setColorArray() { if ( !d_data->colors ) return; const QColor light = palette().color( QPalette::Light ); const QColor dark = palette().color( QPalette::Dark ); if ( !d_data->colors[0].isValid() || d_data->colors[0] != light || d_data->colors[NUM_COLORS - 1] != dark ) { d_data->colors[0] = light; d_data->colors[NUM_COLORS - 1] = dark; int dh, ds, dv, lh, ls, lv; d_data->colors[0].getRgb( &lh, &ls, &lv ); d_data->colors[NUM_COLORS - 1].getRgb( &dh, &ds, &dv ); for ( int i = 1; i < NUM_COLORS - 1; ++i ) { const double factor = double( i ) / double( NUM_COLORS ); d_data->colors[i].setRgb( lh + int( double( dh - lh ) * factor ), ls + int( double( ds - ls ) * factor ), lv + int( double( dv - lv ) * factor ) ); } } } /*! \brief Adjust the number of grooves in the wheel's surface. The number of grooves is limited to 6 <= cnt <= 50. Values outside this range will be clipped. The default value is 10. \param cnt Number of grooves per 360 degrees \sa tickCnt() */ void QwtWheel::setTickCnt( int cnt ) { d_data->tickCnt = qwtLim( cnt, 6, 50 ); update(); } /*! \return Number of grooves in the wheel's surface. \sa setTickCnt() */ int QwtWheel::tickCnt() const { return d_data->tickCnt; } /*! \return mass */ double QwtWheel::mass() const { return QwtAbstractSlider::mass(); } /*! \brief Set the internal border width of the wheel. The internal border must not be smaller than 1 and is limited in dependence on the wheel's size. Values outside the allowed range will be clipped. The internal border defaults to 2. \param w border width \sa internalBorder() */ void QwtWheel::setInternalBorder( int w ) { const int d = qMin( width(), height() ) / 3; w = qMin( w, d ); d_data->intBorder = qMax( w, 1 ); layoutWheel(); } /*! \return Internal border width of the wheel. \sa setInternalBorder() */ int QwtWheel::internalBorder() const { return d_data->intBorder; } /*! Draw the Wheel's background gradient \param painter Painter \param r Bounding rectangle */ void QwtWheel::drawWheelBackground( QPainter *painter, const QRect &r ) { painter->save(); // // initialize pens // const QColor light = palette().color( QPalette::Light ); const QColor dark = palette().color( QPalette::Dark ); QPen lightPen; lightPen.setColor( light ); lightPen.setWidth( d_data->intBorder ); QPen darkPen; darkPen.setColor( dark ); darkPen.setWidth( d_data->intBorder ); setColorArray(); // // initialize auxiliary variables // const int nFields = NUM_COLORS * 13 / 10; const int hiPos = nFields - NUM_COLORS + 1; if ( orientation() == Qt::Horizontal ) { const int rx = r.x(); int ry = r.y() + d_data->intBorder; const int rh = r.height() - 2 * d_data->intBorder; const int rw = r.width(); // // draw shaded background // int x1 = rx; for ( int i = 1; i < nFields; i++ ) { const int x2 = rx + ( rw * i ) / nFields; painter->fillRect( x1, ry, x2 - x1 + 1 , rh, d_data->colors[qAbs( i-hiPos )] ); x1 = x2 + 1; } painter->fillRect( x1, ry, rw - ( x1 - rx ), rh, d_data->colors[NUM_COLORS - 1] ); // // draw internal border // painter->setPen( lightPen ); ry = r.y() + d_data->intBorder / 2; painter->drawLine( r.x(), ry, r.x() + r.width() , ry ); painter->setPen( darkPen ); ry = r.y() + r.height() - ( d_data->intBorder - d_data->intBorder / 2 ); painter->drawLine( r.x(), ry , r.x() + r.width(), ry ); } else // Qt::Vertical { int rx = r.x() + d_data->intBorder; const int ry = r.y(); const int rh = r.height(); const int rw = r.width() - 2 * d_data->intBorder; // // draw shaded background // int y1 = ry; for ( int i = 1; i < nFields; i++ ) { const int y2 = ry + ( rh * i ) / nFields; painter->fillRect( rx, y1, rw, y2 - y1 + 1, d_data->colors[qAbs( i-hiPos )] ); y1 = y2 + 1; } painter->fillRect( rx, y1, rw, rh - ( y1 - ry ), d_data->colors[NUM_COLORS - 1] ); // // draw internal borders // painter->setPen( lightPen ); rx = r.x() + d_data->intBorder / 2; painter->drawLine( rx, r.y(), rx, r.y() + r.height() ); painter->setPen( darkPen ); rx = r.x() + r.width() - ( d_data->intBorder - d_data->intBorder / 2 ); painter->drawLine( rx, r.y(), rx , r.y() + r.height() ); } painter->restore(); } /*! \brief Set the total angle which the wheel can be turned. One full turn of the wheel corresponds to an angle of 360 degrees. A total angle of n*360 degrees means that the wheel has to be turned n times around its axis to get from the minimum value to the maximum value. The default setting of the total angle is 360 degrees. \param angle total angle in degrees \sa totalAngle() */ void QwtWheel::setTotalAngle( double angle ) { if ( angle < 0.0 ) angle = 0.0; d_data->totalAngle = angle; update(); } /*! \return Total angle which the wheel can be turned. \sa setTotalAngle() */ double QwtWheel::totalAngle() const { return d_data->totalAngle; } /*! \brief Set the wheel's orientation. \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical. Defaults to Qt::Horizontal. \sa QwtAbstractSlider::orientation() */ void QwtWheel::setOrientation( Qt::Orientation o ) { if ( orientation() == o ) return; if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } QwtAbstractSlider::setOrientation( o ); layoutWheel(); } /*! \brief Specify the visible portion of the wheel. You may use this function for fine-tuning the appearance of the wheel. The default value is 175 degrees. The value is limited from 10 to 175 degrees. \param angle Visible angle in degrees \sa viewAngle(), setTotalAngle() */ void QwtWheel::setViewAngle( double angle ) { d_data->viewAngle = qwtLim( angle, 10.0, 175.0 ); update(); } /*! \return Visible portion of the wheel \sa setViewAngle(), totalAngle() */ double QwtWheel::viewAngle() const { return d_data->viewAngle; } /*! \brief Redraw the wheel \param painter painter \param r contents rectangle */ void QwtWheel::drawWheel( QPainter *painter, const QRect &r ) { // // draw background gradient // drawWheelBackground( painter, r ); if ( maxValue() == minValue() || d_data->totalAngle == 0.0 ) return; const QColor light = palette().color( QPalette::Light ); const QColor dark = palette().color( QPalette::Dark ); const double sign = ( minValue() < maxValue() ) ? 1.0 : -1.0; double cnvFactor = qAbs( d_data->totalAngle / ( maxValue() - minValue() ) ); const double halfIntv = 0.5 * d_data->viewAngle / cnvFactor; const double loValue = value() - halfIntv; const double hiValue = value() + halfIntv; const double tickWidth = 360.0 / double( d_data->tickCnt ) / cnvFactor; const double sinArc = qSin( d_data->viewAngle * M_PI / 360.0 ); cnvFactor *= M_PI / 180.0; // // draw grooves // if ( orientation() == Qt::Horizontal ) { const double halfSize = double( r.width() ) * 0.5; int l1 = r.y() + d_data->intBorder; int l2 = r.y() + r.height() - d_data->intBorder - 1; // draw one point over the border if border > 1 if ( d_data->intBorder > 1 ) { l1 --; l2 ++; } const int maxpos = r.x() + r.width() - 2; const int minpos = r.x() + 2; // // draw tick marks // for ( double tickValue = qCeil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { // // calculate position // const int tickPos = r.x() + r.width() - int( halfSize * ( sinArc + sign * qSin( ( tickValue - value() ) * cnvFactor ) ) / sinArc ); // // draw vertical line // if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( dark ); painter->drawLine( tickPos - 1 , l1, tickPos - 1, l2 ); painter->setPen( light ); painter->drawLine( tickPos, l1, tickPos, l2 ); } } } else if ( orientation() == Qt::Vertical ) { const double halfSize = double( r.height() ) * 0.5; int l1 = r.x() + d_data->intBorder; int l2 = r.x() + r.width() - d_data->intBorder - 1; if ( d_data->intBorder > 1 ) { l1--; l2++; } const int maxpos = r.y() + r.height() - 2; const int minpos = r.y() + 2; // // draw tick marks // for ( double tickValue = qCeil( loValue / tickWidth ) * tickWidth; tickValue < hiValue; tickValue += tickWidth ) { // // calculate position // const int tickPos = r.y() + int( halfSize * ( sinArc + sign * qSin( ( tickValue - value() ) * cnvFactor ) ) / sinArc ); // // draw horizontal line // if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) ) { painter->setPen( dark ); painter->drawLine( l1, tickPos - 1 , l2, tickPos - 1 ); painter->setPen( light ); painter->drawLine( l1, tickPos, l2, tickPos ); } } } } //! Determine the value corresponding to a specified point double QwtWheel::getValue( const QPoint &p ) { // The reference position is arbitrary, but the // sign of the offset is important int w, dx; if ( orientation() == Qt::Vertical ) { w = d_data->sliderRect.height(); dx = d_data->sliderRect.y() - p.y(); } else { w = d_data->sliderRect.width(); dx = p.x() - d_data->sliderRect.x(); } // w pixels is an arc of viewAngle degrees, // so we convert change in pixels to change in angle const double ang = dx * d_data->viewAngle / w; // value range maps to totalAngle degrees, // so convert the change in angle to a change in value const double val = ang * ( maxValue() - minValue() ) / d_data->totalAngle; // Note, range clamping and rasterizing to step is automatically // handled by QwtAbstractSlider, so we simply return the change in value return val; } //! Qt Resize Event void QwtWheel::resizeEvent( QResizeEvent * ) { layoutWheel( false ); } //! Recalculate the slider's geometry and layout based on // the current rect and fonts. // \param update_geometry notify the layout system and call update // to redraw the scale void QwtWheel::layoutWheel( bool update_geometry ) { const QRect r = this->rect(); d_data->sliderRect.setRect( r.x() + d_data->borderWidth, r.y() + d_data->borderWidth, r.width() - 2*d_data->borderWidth, r.height() - 2*d_data->borderWidth ); if ( update_geometry ) { updateGeometry(); update(); } } //! Qt Paint Event void QwtWheel::paintEvent( QPaintEvent *e ) { // Use double-buffering const QRect &ur = e->rect(); if ( ur.isValid() ) { QPainter painter( this ); draw( &painter, ur ); } } /*! Redraw panel and wheel \param painter Painter */ void QwtWheel::draw( QPainter *painter, const QRect& ) { qDrawShadePanel( painter, rect().x(), rect().y(), rect().width(), rect().height(), palette(), true, d_data->borderWidth ); drawWheel( painter, d_data->sliderRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( painter, this ); } //! Notify value change void QwtWheel::valueChange() { QwtAbstractSlider::valueChange(); update(); } /*! \brief Determine the scrolling mode and direction corresponding to a specified point \param p point \param scrollMode scrolling mode \param direction direction */ void QwtWheel::getScrollMode( const QPoint &p, int &scrollMode, int &direction ) { if ( d_data->sliderRect.contains( p ) ) scrollMode = ScrMouse; else scrollMode = ScrNone; direction = 0; } /*! \brief Set the mass of the wheel Assigning a mass turns the wheel into a flywheel. \param val the wheel's mass */ void QwtWheel::setMass( double val ) { QwtAbstractSlider::setMass( val ); } /*! \brief Set the width of the wheel Corresponds to the wheel height for horizontal orientation, and the wheel width for vertical orientation. \param w the wheel's width */ void QwtWheel::setWheelWidth( int w ) { d_data->wheelWidth = w; layoutWheel(); } /*! \return a size hint */ QSize QwtWheel::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value is based on the wheel width. */ QSize QwtWheel::minimumSizeHint() const { QSize sz( 3*d_data->wheelWidth + 2*d_data->borderWidth, d_data->wheelWidth + 2*d_data->borderWidth ); if ( orientation() != Qt::Horizontal ) sz.transpose(); return sz; } /*! \brief Call update() when the palette changes */ void QwtWheel::paletteChange( const QPalette& ) { update(); } starpu-1.1.5/starpu-top/qwt/qwt_plot_layout.cpp0000644000373600000000000011622312571536557016676 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_layout.h" #include "qwt_text.h" #include "qwt_text_label.h" #include "qwt_plot_canvas.h" #include "qwt_scale_widget.h" #include "qwt_legend.h" #include #include class QwtPlotLayout::LayoutData { public: void init( const QwtPlot *, const QRectF &rect ); struct t_legendData { int frameWidth; int vScrollBarWidth; int hScrollBarHeight; QSize hint; } legend; struct t_titleData { QwtText text; int frameWidth; } title; struct t_scaleData { bool isEnabled; const QwtScaleWidget *scaleWidget; QFont scaleFont; int start; int end; int baseLineOffset; int tickOffset; int dimWithoutTitle; } scale[QwtPlot::axisCnt]; struct t_canvasData { int frameWidth; } canvas; }; /* Extract all layout relevant data from the plot components */ void QwtPlotLayout::LayoutData::init( const QwtPlot *plot, const QRectF &rect ) { // legend if ( plot->plotLayout()->legendPosition() != QwtPlot::ExternalLegend && plot->legend() ) { legend.frameWidth = plot->legend()->frameWidth(); legend.vScrollBarWidth = plot->legend()->verticalScrollBar()->sizeHint().width(); legend.hScrollBarHeight = plot->legend()->horizontalScrollBar()->sizeHint().height(); const QSize hint = plot->legend()->sizeHint(); int w = qMin( hint.width(), ( int )rect.width() ); int h = plot->legend()->heightForWidth( w ); if ( h == 0 ) h = hint.height(); if ( h > rect.height() ) w += legend.vScrollBarWidth; legend.hint = QSize( w, h ); } // title title.frameWidth = 0; title.text = QwtText(); if ( plot->titleLabel() ) { const QwtTextLabel *label = plot->titleLabel(); title.text = label->text(); if ( !( title.text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) ) title.text.setFont( label->font() ); title.frameWidth = plot->titleLabel()->frameWidth(); } // scales for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scaleWidget = plot->axisWidget( axis ); scale[axis].isEnabled = true; scale[axis].scaleWidget = scaleWidget; scale[axis].scaleFont = scaleWidget->font(); scale[axis].start = scaleWidget->startBorderDist(); scale[axis].end = scaleWidget->endBorderDist(); scale[axis].baseLineOffset = scaleWidget->margin(); scale[axis].tickOffset = scaleWidget->margin(); if ( scaleWidget->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) { scale[axis].tickOffset += ( int )scaleWidget->scaleDraw()->majTickLength(); } scale[axis].dimWithoutTitle = scaleWidget->dimForLength( QWIDGETSIZE_MAX, scale[axis].scaleFont ); if ( !scaleWidget->title().isEmpty() ) { scale[axis].dimWithoutTitle -= scaleWidget->titleHeightForWidth( QWIDGETSIZE_MAX ); } } else { scale[axis].isEnabled = false; scale[axis].start = 0; scale[axis].end = 0; scale[axis].baseLineOffset = 0; scale[axis].tickOffset = 0; scale[axis].dimWithoutTitle = 0; } } // canvas canvas.frameWidth = plot->canvas()->frameWidth(); } class QwtPlotLayout::PrivateData { public: PrivateData(): margin( 0 ), spacing( 5 ), alignCanvasToScales( false ) { } QRectF titleRect; QRectF legendRect; QRectF scaleRect[QwtPlot::axisCnt]; QRectF canvasRect; QwtPlotLayout::LayoutData layoutData; QwtPlot::LegendPosition legendPos; double legendRatio; unsigned int margin; unsigned int spacing; unsigned int canvasMargin[QwtPlot::axisCnt]; bool alignCanvasToScales; }; /*! \brief Constructor */ QwtPlotLayout::QwtPlotLayout() { d_data = new PrivateData; setLegendPosition( QwtPlot::BottomLegend ); setCanvasMargin( 4 ); invalidate(); } //! Destructor QwtPlotLayout::~QwtPlotLayout() { delete d_data; } /*! Change the margin of the plot. The margin is the space around all components. \param margin new margin \sa margin(), setSpacing(), QwtPlot::setMargin() */ void QwtPlotLayout::setMargin( int margin ) { if ( margin < 0 ) margin = 0; d_data->margin = margin; } /*! \return margin \sa setMargin(), spacing(), QwtPlot::margin() */ int QwtPlotLayout::margin() const { return d_data->margin; } /*! Change a margin of the canvas. The margin is the space above/below the scale ticks. A negative margin will be set to -1, excluding the borders of the scales. \param margin New margin \param axis One of QwtPlot::Axis. Specifies where the position of the margin. -1 means margin at all borders. \sa canvasMargin() \warning The margin will have no effect when alignCanvasToScales is true */ void QwtPlotLayout::setCanvasMargin( int margin, int axis ) { if ( margin < -1 ) margin = -1; if ( axis == -1 ) { for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->canvasMargin[axis] = margin; } else if ( axis >= 0 && axis < QwtPlot::axisCnt ) d_data->canvasMargin[axis] = margin; } /*! \return Margin around the scale tick borders \sa setCanvasMargin() */ int QwtPlotLayout::canvasMargin( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) return 0; return d_data->canvasMargin[axis]; } /*! Change the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size, - align with the axis scale ends to control its size. \param alignCanvasToScales New align-canvas-to-axis-scales setting \sa setCanvasMargin() \note In this context the term 'scale' means the backbone of a scale. \warning In case of alignCanvasToScales == true canvasMargin will have no effect */ void QwtPlotLayout::setAlignCanvasToScales( bool alignCanvasToScales ) { d_data->alignCanvasToScales = alignCanvasToScales; } /*! Return the align-canvas-to-axis-scales setting. The canvas may: - extend beyond the axis scale ends to maximize its size - align with the axis scale ends to control its size. \return align-canvas-to-axis-scales setting \sa setAlignCanvasToScales, setCanvasMargin() \note In this context the term 'scale' means the backbone of a scale. */ bool QwtPlotLayout::alignCanvasToScales() const { return d_data->alignCanvasToScales; } /*! Change the spacing of the plot. The spacing is the distance between the plot components. \param spacing new spacing \sa setMargin(), spacing() */ void QwtPlotLayout::setSpacing( int spacing ) { d_data->spacing = qMax( 0, spacing ); } /*! \return spacing \sa margin(), setSpacing() */ int QwtPlotLayout::spacing() const { return d_data->spacing; } /*! \brief Specify the position of the legend \param pos The legend's position. \param ratio Ratio between legend and the bounding rect of title, canvas and axes. The legend will be shrinked if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos, double ratio ) { if ( ratio > 1.0 ) ratio = 1.0; switch ( pos ) { case QwtPlot::TopLegend: case QwtPlot::BottomLegend: if ( ratio <= 0.0 ) ratio = 0.33; d_data->legendRatio = ratio; d_data->legendPos = pos; break; case QwtPlot::LeftLegend: case QwtPlot::RightLegend: if ( ratio <= 0.0 ) ratio = 0.5; d_data->legendRatio = ratio; d_data->legendPos = pos; break; case QwtPlot::ExternalLegend: d_data->legendRatio = ratio; // meaningless d_data->legendPos = pos; default: break; } } /*! \brief Specify the position of the legend \param pos The legend's position. Valid values are \c QwtPlot::LeftLegend, \c QwtPlot::RightLegend, \c QwtPlot::TopLegend, \c QwtPlot::BottomLegend. \sa QwtPlot::setLegendPosition() */ void QwtPlotLayout::setLegendPosition( QwtPlot::LegendPosition pos ) { setLegendPosition( pos, 0.0 ); } /*! \return Position of the legend \sa setLegendPosition(), QwtPlot::setLegendPosition(), QwtPlot::legendPosition() */ QwtPlot::LegendPosition QwtPlotLayout::legendPosition() const { return d_data->legendPos; } /*! Specify the relative size of the legend in the plot \param ratio Ratio between legend and the bounding rect of title, canvas and axes. The legend will be shrinked if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. */ void QwtPlotLayout::setLegendRatio( double ratio ) { setLegendPosition( legendPosition(), ratio ); } /*! \return The relative size of the legend in the plot. \sa setLegendPosition() */ double QwtPlotLayout::legendRatio() const { return d_data->legendRatio; } /*! \return Geometry for the title \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::titleRect() const { return d_data->titleRect; } /*! \return Geometry for the legend \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::legendRect() const { return d_data->legendRect; } /*! \param axis Axis index \return Geometry for the scale \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::scaleRect( int axis ) const { if ( axis < 0 || axis >= QwtPlot::axisCnt ) { static QRectF dummyRect; return dummyRect; } return d_data->scaleRect[axis]; } /*! \return Geometry for the canvas \sa activate(), invalidate() */ const QRectF &QwtPlotLayout::canvasRect() const { return d_data->canvasRect; } /*! Invalidate the geometry of all components. \sa activate() */ void QwtPlotLayout::invalidate() { d_data->titleRect = d_data->legendRect = d_data->canvasRect = QRect(); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) d_data->scaleRect[axis] = QRect(); } /*! \brief Return a minimum size hint \sa QwtPlot::minimumSizeHint() */ QSize QwtPlotLayout::minimumSizeHint( const QwtPlot *plot ) const { class ScaleData { public: ScaleData() { w = h = minLeft = minRight = tickOffset = 0; } int w; int h; int minLeft; int minRight; int tickOffset; } scaleData[QwtPlot::axisCnt]; int canvasBorder[QwtPlot::axisCnt]; int axis; for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( plot->axisEnabled( axis ) ) { const QwtScaleWidget *scl = plot->axisWidget( axis ); ScaleData &sd = scaleData[axis]; const QSize hint = scl->minimumSizeHint(); sd.w = hint.width(); sd.h = hint.height(); scl->getBorderDistHint( sd.minLeft, sd.minRight ); sd.tickOffset = scl->margin(); if ( scl->scaleDraw()->hasComponent( QwtAbstractScaleDraw::Ticks ) ) sd.tickOffset += scl->scaleDraw()->majTickLength(); } canvasBorder[axis] = plot->canvas()->frameWidth() + d_data->canvasMargin[axis] + 1; } for ( axis = 0; axis < QwtPlot::axisCnt; axis++ ) { ScaleData &sd = scaleData[axis]; if ( sd.w && ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::yLeft] ) && scaleData[QwtPlot::yLeft].w ) { int shiftLeft = sd.minLeft - canvasBorder[QwtPlot::yLeft]; if ( shiftLeft > scaleData[QwtPlot::yLeft].w ) shiftLeft = scaleData[QwtPlot::yLeft].w; sd.w -= shiftLeft; } if ( ( sd.minRight > canvasBorder[QwtPlot::yRight] ) && scaleData[QwtPlot::yRight].w ) { int shiftRight = sd.minRight - canvasBorder[QwtPlot::yRight]; if ( shiftRight > scaleData[QwtPlot::yRight].w ) shiftRight = scaleData[QwtPlot::yRight].w; sd.w -= shiftRight; } } if ( sd.h && ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) ) { if ( ( sd.minLeft > canvasBorder[QwtPlot::xBottom] ) && scaleData[QwtPlot::xBottom].h ) { int shiftBottom = sd.minLeft - canvasBorder[QwtPlot::xBottom]; if ( shiftBottom > scaleData[QwtPlot::xBottom].tickOffset ) shiftBottom = scaleData[QwtPlot::xBottom].tickOffset; sd.h -= shiftBottom; } if ( ( sd.minLeft > canvasBorder[QwtPlot::xTop] ) && scaleData[QwtPlot::xTop].h ) { int shiftTop = sd.minRight - canvasBorder[QwtPlot::xTop]; if ( shiftTop > scaleData[QwtPlot::xTop].tickOffset ) shiftTop = scaleData[QwtPlot::xTop].tickOffset; sd.h -= shiftTop; } } } const QwtPlotCanvas *canvas = plot->canvas(); const QSize minCanvasSize = canvas->minimumSize(); int w = scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; int cw = qMax( scaleData[QwtPlot::xBottom].w, scaleData[QwtPlot::xTop].w ) + 2 * ( canvas->frameWidth() + 1 ); w += qMax( cw, minCanvasSize.width() ); int h = scaleData[QwtPlot::xBottom].h + scaleData[QwtPlot::xTop].h; int ch = qMax( scaleData[QwtPlot::yLeft].h, scaleData[QwtPlot::yRight].h ) + 2 * ( canvas->frameWidth() + 1 ); h += qMax( ch, minCanvasSize.height() ); const QwtTextLabel *title = plot->titleLabel(); if ( title && !title->text().isEmpty() ) { // If only QwtPlot::yLeft or QwtPlot::yRight is showing, // we center on the plot canvas. const bool centerOnCanvas = !( plot->axisEnabled( QwtPlot::yLeft ) && plot->axisEnabled( QwtPlot::yRight ) ); int titleW = w; if ( centerOnCanvas ) { titleW -= scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } int titleH = title->heightForWidth( titleW ); if ( titleH > titleW ) // Compensate for a long title { w = titleW = titleH; if ( centerOnCanvas ) { w += scaleData[QwtPlot::yLeft].w + scaleData[QwtPlot::yRight].w; } titleH = title->heightForWidth( titleW ); } h += titleH + d_data->spacing; } // Compute the legend contribution const QwtLegend *legend = plot->legend(); if ( d_data->legendPos != QwtPlot::ExternalLegend && legend && !legend->isEmpty() ) { if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { int legendW = legend->sizeHint().width(); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) w += d_data->spacing; if ( legendH > h ) legendW += legend->verticalScrollBar()->sizeHint().height(); if ( d_data->legendRatio < 1.0 ) legendW = qMin( legendW, int( w / ( 1.0 - d_data->legendRatio ) ) ); w += legendW + d_data->spacing; } else // QwtPlot::Top, QwtPlot::Bottom { int legendW = qMin( legend->sizeHint().width(), w ); int legendH = legend->heightForWidth( legendW ); if ( legend->frameWidth() > 0 ) h += d_data->spacing; if ( d_data->legendRatio < 1.0 ) legendH = qMin( legendH, int( h / ( 1.0 - d_data->legendRatio ) ) ); h += legendH + d_data->spacing; } } w += 2 * d_data->margin; h += 2 * d_data->margin; return QSize( w, h ); } /*! Find the geometry for the legend \param options Options how to layout the legend \param rect Rectangle where to place the legend \return Geometry for the legend \sa Options */ QRectF QwtPlotLayout::layoutLegend( int options, const QRectF &rect ) const { const QSize hint( d_data->layoutData.legend.hint ); int dim; if ( d_data->legendPos == QwtPlot::LeftLegend || d_data->legendPos == QwtPlot::RightLegend ) { // We don't allow vertical legends to take more than // half of the available space. dim = qMin( hint.width(), int( rect.width() * d_data->legendRatio ) ); if ( !( options & IgnoreScrollbars ) ) { if ( hint.height() > rect.height() ) { // The legend will need additional // space for the vertical scrollbar. dim += d_data->layoutData.legend.vScrollBarWidth; } } } else { dim = qMin( hint.height(), int( rect.height() * d_data->legendRatio ) ); dim = qMax( dim, d_data->layoutData.legend.hScrollBarHeight ); } QRectF legendRect = rect; switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: legendRect.setWidth( dim ); break; case QwtPlot::RightLegend: legendRect.setX( rect.right() - dim ); legendRect.setWidth( dim ); break; case QwtPlot::TopLegend: legendRect.setHeight( dim ); break; case QwtPlot::BottomLegend: legendRect.setY( rect.bottom() - dim ); legendRect.setHeight( dim ); break; case QwtPlot::ExternalLegend: break; } return legendRect; } /*! Align the legend to the canvas \param canvasRect Geometry of the canvas \param legendRect Maximum geometry for the legend \return Geometry for the aligned legend */ QRectF QwtPlotLayout::alignLegend( const QRectF &canvasRect, const QRectF &legendRect ) const { QRectF alignedRect = legendRect; if ( d_data->legendPos == QwtPlot::BottomLegend || d_data->legendPos == QwtPlot::TopLegend ) { if ( d_data->layoutData.legend.hint.width() < canvasRect.width() ) { alignedRect.setX( canvasRect.x() ); alignedRect.setWidth( canvasRect.width() ); } } else { if ( d_data->layoutData.legend.hint.height() < canvasRect.height() ) { alignedRect.setY( canvasRect.y() ); alignedRect.setHeight( canvasRect.height() ); } } return alignedRect; } /*! Expand all line breaks in text labels, and calculate the height of their widgets in orientation of the text. \param options Options how to layout the legend \param rect Bounding rect for title, axes and canvas. \param dimTitle Expanded height of the title widget \param dimAxis Expanded heights of the axis in axis orientation. \sa Options */ void QwtPlotLayout::expandLineBreaks( int options, const QRectF &rect, int &dimTitle, int dimAxis[QwtPlot::axisCnt] ) const { dimTitle = 0; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) dimAxis[axis] = 0; int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !d_data->alignCanvasToScales ) backboneOffset[axis] += d_data->canvasMargin[axis]; if ( !( options & IgnoreFrames ) ) backboneOffset[axis] += d_data->layoutData.canvas.frameWidth; } bool done = false; while ( !done ) { done = true; // the size for the 4 axis depend on each other. Expanding // the height of a horizontal axis will shrink the height // for the vertical axis, shrinking the height of a vertical // axis will result in a line break what will expand the // width and results in shrinking the width of a horizontal // axis what might result in a line break of a horizontal // axis ... . So we loop as long until no size changes. if ( !d_data->layoutData.title.text.isEmpty() ) { int w = rect.width(); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // center to the canvas w -= dimAxis[QwtPlot::yLeft] + dimAxis[QwtPlot::yRight]; } int d = qCeil( d_data->layoutData.title.text.heightForWidth( w ) ); if ( !( options & IgnoreFrames ) ) d += 2 * d_data->layoutData.title.frameWidth; if ( d > dimTitle ) { dimTitle = d; done = false; } } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { const struct LayoutData::t_scaleData &scaleData = d_data->layoutData.scale[axis]; if ( scaleData.isEnabled ) { int length; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { length = rect.width() - dimAxis[QwtPlot::yLeft] - dimAxis[QwtPlot::yRight]; length -= scaleData.start + scaleData.end; if ( dimAxis[QwtPlot::yRight] > 0 ) length -= 1; length += qMin( dimAxis[QwtPlot::yLeft], scaleData.start - backboneOffset[QwtPlot::yLeft] ); length += qMin( dimAxis[QwtPlot::yRight], scaleData.end - backboneOffset[QwtPlot::yRight] ); } else // QwtPlot::yLeft, QwtPlot::yRight { length = rect.height() - dimAxis[QwtPlot::xTop] - dimAxis[QwtPlot::xBottom]; length -= scaleData.start + scaleData.end; length -= 1; if ( dimAxis[QwtPlot::xBottom] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xTop] <= 0 ) length -= 1; if ( dimAxis[QwtPlot::xBottom] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xBottom].tickOffset, scaleData.start - backboneOffset[QwtPlot::xBottom] ); } if ( dimAxis[QwtPlot::xTop] > 0 ) { length += qMin( d_data->layoutData.scale[QwtPlot::xTop].tickOffset, scaleData.end - backboneOffset[QwtPlot::xTop] ); } if ( dimTitle > 0 ) length -= dimTitle + d_data->spacing; } int d = scaleData.dimWithoutTitle; if ( !scaleData.scaleWidget->title().isEmpty() ) { d += scaleData.scaleWidget->titleHeightForWidth( length ); } if ( d > dimAxis[axis] ) { dimAxis[axis] = d; done = false; } } } } } /*! Align the ticks of the axis to the canvas borders using the empty corners. \sa Options */ void QwtPlotLayout::alignScales( int options, QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const { int backboneOffset[QwtPlot::axisCnt]; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { backboneOffset[axis] = 0; if ( !d_data->alignCanvasToScales ) backboneOffset[axis] += d_data->canvasMargin[axis]; if ( !( options & IgnoreFrames ) ) backboneOffset[axis] += d_data->layoutData.canvas.frameWidth; } for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !scaleRect[axis].isValid() ) continue; const int startDist = d_data->layoutData.scale[axis].start; const int endDist = d_data->layoutData.scale[axis].end; QRectF &axisRect = scaleRect[axis]; if ( axis == QwtPlot::xTop || axis == QwtPlot::xBottom ) { const QRectF &leftScaleRect = scaleRect[QwtPlot::yLeft]; const int leftOffset = backboneOffset[QwtPlot::yLeft] - startDist; if ( leftScaleRect.isValid() ) { const int dx = leftOffset + leftScaleRect.width(); if ( d_data->alignCanvasToScales && dx < 0 ) { /* The axis needs more space than the width of the left scale. */ canvasRect.setLeft( qMax( canvasRect.left(), axisRect.left() - dx ) ); } else { const double minLeft = leftScaleRect.left(); const double left = axisRect.left() + leftOffset; axisRect.setLeft( qMax( left, minLeft ) ); } } else { if ( d_data->alignCanvasToScales && leftOffset < 0 ) { canvasRect.setLeft( qMax( canvasRect.left(), axisRect.left() - leftOffset ) ); } else { if ( leftOffset > 0 ) axisRect.setLeft( axisRect.left() + leftOffset ); } } const QRectF &rightScaleRect = scaleRect[QwtPlot::yRight]; const int rightOffset = backboneOffset[QwtPlot::yRight] - endDist + 1; if ( rightScaleRect.isValid() ) { const int dx = rightOffset + rightScaleRect.width(); if ( d_data->alignCanvasToScales && dx < 0 ) { /* The axis needs more space than the width of the right scale. */ canvasRect.setRight( qMin( canvasRect.right(), axisRect.right() + dx ) ); } const double maxRight = rightScaleRect.right(); const double right = axisRect.right() - rightOffset; axisRect.setRight( qMin( right, maxRight ) ); } else { if ( d_data->alignCanvasToScales && rightOffset < 0 ) { canvasRect.setRight( qMin( canvasRect.right(), axisRect.right() + rightOffset ) ); } else { if ( rightOffset > 0 ) axisRect.setRight( axisRect.right() - rightOffset ); } } } else // QwtPlot::yLeft, QwtPlot::yRight { const QRectF &bottomScaleRect = scaleRect[QwtPlot::xBottom]; const int bottomOffset = backboneOffset[QwtPlot::xBottom] - endDist + 1; if ( bottomScaleRect.isValid() ) { const int dy = bottomOffset + bottomScaleRect.height(); if ( d_data->alignCanvasToScales && dy < 0 ) { /* The axis needs more space than the height of the bottom scale. */ canvasRect.setBottom( qMin( canvasRect.bottom(), axisRect.bottom() + dy ) ); } else { const double maxBottom = bottomScaleRect.top() + d_data->layoutData.scale[QwtPlot::xBottom].tickOffset; const double bottom = axisRect.bottom() - bottomOffset; axisRect.setBottom( qMin( bottom, maxBottom ) ); } } else { if ( d_data->alignCanvasToScales && bottomOffset < 0 ) { canvasRect.setBottom( qMin( canvasRect.bottom(), axisRect.bottom() + bottomOffset ) ); } else { if ( bottomOffset > 0 ) axisRect.setBottom( axisRect.bottom() - bottomOffset ); } } const QRectF &topScaleRect = scaleRect[QwtPlot::xTop]; const int topOffset = backboneOffset[QwtPlot::xTop] - startDist; if ( topScaleRect.isValid() ) { const int dy = topOffset + topScaleRect.height(); if ( d_data->alignCanvasToScales && dy < 0 ) { /* The axis needs more space than the height of the top scale. */ canvasRect.setTop( qMax( canvasRect.top(), axisRect.top() - dy ) ); } else { const double minTop = topScaleRect.bottom() - d_data->layoutData.scale[QwtPlot::xTop].tickOffset; const double top = axisRect.top() + topOffset; axisRect.setTop( qMax( top, minTop ) ); } } else { if ( d_data->alignCanvasToScales && topOffset < 0 ) { canvasRect.setTop( qMax( canvasRect.top(), axisRect.top() - topOffset ) ); } else { if ( topOffset > 0 ) axisRect.setTop( axisRect.top() + topOffset ); } } } } if ( d_data->alignCanvasToScales ) { /* The canvas has been aligned to the scale with largest border distances. Now we have to realign the other scale. */ int fw = 0; if ( !( options & IgnoreFrames ) ) fw = d_data->layoutData.canvas.frameWidth; for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { if ( !scaleRect[axis].isValid() ) continue; if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { scaleRect[axis].setLeft( canvasRect.left() + fw - d_data->layoutData.scale[axis].start ); scaleRect[axis].setRight( canvasRect.right() - fw - 1 + d_data->layoutData.scale[axis].end ); } else { scaleRect[axis].setTop( canvasRect.top() + fw - d_data->layoutData.scale[axis].start ); scaleRect[axis].setBottom( canvasRect.bottom() - fw - 1 + d_data->layoutData.scale[axis].end ); } } if ( scaleRect[QwtPlot::xTop].isValid() ) scaleRect[QwtPlot::xTop].setBottom( canvasRect.top() ); if ( scaleRect[QwtPlot::xBottom].isValid() ) scaleRect[QwtPlot::xBottom].setTop( canvasRect.bottom() ); if ( scaleRect[QwtPlot::yLeft].isValid() ) scaleRect[QwtPlot::yLeft].setRight( canvasRect.left() ); if ( scaleRect[QwtPlot::yRight].isValid() ) scaleRect[QwtPlot::yRight].setLeft( canvasRect.right() ); } } /*! \brief Recalculate the geometry of all components. \param plot Plot to be layout \param plotRect Rect where to place the components \param options Options \sa invalidate(), Options, titleRect(), legendRect(), scaleRect(), canvasRect() */ void QwtPlotLayout::activate( const QwtPlot *plot, const QRectF &plotRect, int options ) { invalidate(); QRectF rect( plotRect ); // undistributed rest of the plot rect if ( !( options & IgnoreMargin ) ) { // subtract the margin rect.setRect( rect.x() + d_data->margin, rect.y() + d_data->margin, rect.width() - 2 * d_data->margin, rect.height() - 2 * d_data->margin ); } // We extract all layout relevant data from the widgets, // filter them through pfilter and save them to d_data->layoutData. d_data->layoutData.init( plot, rect ); if ( !( options & IgnoreLegend ) && d_data->legendPos != QwtPlot::ExternalLegend && plot->legend() && !plot->legend()->isEmpty() ) { d_data->legendRect = layoutLegend( options, rect ); // subtract d_data->legendRect from rect const QRegion region( rect.toRect() ); rect = region.subtract( d_data->legendRect.toRect() ).boundingRect(); switch ( d_data->legendPos ) { case QwtPlot::LeftLegend: rect.setLeft( rect.left() + d_data->spacing ); break; case QwtPlot::RightLegend: rect.setRight( rect.right() - d_data->spacing ); break; case QwtPlot::TopLegend: rect.setTop( rect.top() + d_data->spacing ); break; case QwtPlot::BottomLegend: rect.setBottom( rect.bottom() - d_data->spacing ); break; case QwtPlot::ExternalLegend: break; // suppress compiler warning } } /* +---+-----------+---+ | Title | +---+-----------+---+ | | Axis | | +---+-----------+---+ | A | | A | | x | Canvas | x | | i | | i | | s | | s | +---+-----------+---+ | | Axis | | +---+-----------+---+ */ // axes and title include text labels. The height of each // label depends on its line breaks, that depend on the width // for the label. A line break in a horizontal text will reduce // the available width for vertical texts and vice versa. // expandLineBreaks finds the height/width for title and axes // including all line breaks. int dimTitle, dimAxes[QwtPlot::axisCnt]; expandLineBreaks( options, rect, dimTitle, dimAxes ); if ( dimTitle > 0 ) { d_data->titleRect = QRect( rect.x(), rect.y(), rect.width(), dimTitle ); if ( d_data->layoutData.scale[QwtPlot::yLeft].isEnabled != d_data->layoutData.scale[QwtPlot::yRight].isEnabled ) { // if only one of the y axes is missing we align // the title centered to the canvas d_data->titleRect.setX( rect.x() + dimAxes[QwtPlot::yLeft] ); d_data->titleRect.setWidth( rect.width() - dimAxes[QwtPlot::yLeft] - dimAxes[QwtPlot::yRight] ); } // subtract title rect.setTop( rect.top() + dimTitle + d_data->spacing ); } d_data->canvasRect.setRect( rect.x() + dimAxes[QwtPlot::yLeft], rect.y() + dimAxes[QwtPlot::xTop], rect.width() - dimAxes[QwtPlot::yRight] - dimAxes[QwtPlot::yLeft], rect.height() - dimAxes[QwtPlot::xBottom] - dimAxes[QwtPlot::xTop] ); for ( int axis = 0; axis < QwtPlot::axisCnt; axis++ ) { // set the rects for the axes if ( dimAxes[axis] ) { int dim = dimAxes[axis]; QRectF &scaleRect = d_data->scaleRect[axis]; scaleRect = d_data->canvasRect; switch ( axis ) { case QwtPlot::yLeft: scaleRect.setX( d_data->canvasRect.left() - dim ); scaleRect.setWidth( dim ); break; case QwtPlot::yRight: scaleRect.setX( d_data->canvasRect.right() ); scaleRect.setWidth( dim ); break; case QwtPlot::xBottom: scaleRect.setY( d_data->canvasRect.bottom() ); scaleRect.setHeight( dim ); break; case QwtPlot::xTop: scaleRect.setY( d_data->canvasRect.top() - dim ); scaleRect.setHeight( dim ); break; } scaleRect = scaleRect.normalized(); } } // +---+-----------+---+ // | <- Axis -> | // +-^-+-----------+-^-+ // | | | | | | // | | | | // | A | | A | // | x | Canvas | x | // | i | | i | // | s | | s | // | | | | // | | | | | | // +-V-+-----------+-V-+ // | <- Axis -> | // +---+-----------+---+ // The ticks of the axes - not the labels above - should // be aligned to the canvas. So we try to use the empty // corners to extend the axes, so that the label texts // left/right of the min/max ticks are moved into them. alignScales( options, d_data->canvasRect, d_data->scaleRect ); if ( !d_data->legendRect.isEmpty() ) { // We prefer to align the legend to the canvas - not to // the complete plot - if possible. d_data->legendRect = alignLegend( d_data->canvasRect, d_data->legendRect ); } } starpu-1.1.5/starpu-top/qwt/qwt_dial_needle.h0000644000373600000000000001206012571536557016207 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_NEEDLE_H #define QWT_DIAL_NEEDLE_H 1 #include "qwt_global.h" #include class QPainter; class QPoint; /*! \brief Base class for needles that can be used in a QwtDial. QwtDialNeedle is a pointer that indicates a value by pointing to a specific direction. Qwt is missing a set of good looking needles. Contributions are very welcome. \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialNeedle { public: QwtDialNeedle(); virtual ~QwtDialNeedle(); /*! Draw the needle \param painter Painter \param center Center of the dial, start position for the needle \param length Length of the needle \param direction Direction of the needle, in degrees counter clockwise \param colorGroup Color group, used for painting */ virtual void draw( QPainter *painter, const QPoint ¢er, int length, double direction, QPalette::ColorGroup colorGroup = QPalette::Active ) const = 0; virtual void setPalette( const QPalette & ); const QPalette &palette() const; protected: static void drawKnob( QPainter *, const QPoint &pos, int width, const QBrush &, bool sunken ); private: QPalette d_palette; }; /*! \brief A needle for dial widgets The following colors are used: - QPalette::Mid\n Pointer - QPalette::Base\n Knob \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialSimpleNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { Arrow, Ray }; QwtDialSimpleNeedle( Style, bool hasKnob = true, const QColor &mid = Qt::gray, const QColor &base = Qt::darkGray ); virtual void draw( QPainter *, const QPoint &, int length, double direction, QPalette::ColorGroup = QPalette::Active ) const; static void drawArrowNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, int width, double direction, bool hasKnob ); static void drawRayNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, int width, double direction, bool hasKnob ); void setWidth( int width ); int width() const; private: Style d_style; bool d_hasKnob; int d_width; }; /*! \brief A magnet needle for compass widgets A magnet needle points to two opposite directions indicating north and south. The following colors are used: - QPalette::Light\n Used for pointing south - QPalette::Dark\n Used for pointing north - QPalette::Base\n Knob (ThinStyle only) \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassMagnetNeedle: public QwtDialNeedle { public: //! Style of the needle enum Style { TriangleStyle, ThinStyle }; QwtCompassMagnetNeedle( Style = TriangleStyle, const QColor &light = Qt::white, const QColor &dark = Qt::red ); virtual void draw( QPainter *, const QPoint &, int length, double direction, QPalette::ColorGroup = QPalette::Active ) const; static void drawTriangleNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); static void drawThinNeedle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); protected: static void drawPointer( QPainter *painter, const QBrush &brush, int colorOffset, const QPoint ¢er, int length, int width, double direction ); private: Style d_style; }; /*! \brief An indicator for the wind direction QwtCompassWindArrow shows the direction where the wind comes from. - QPalette::Light\n Used for Style1, or the light half of Style2 - QPalette::Dark\n Used for the dark half of Style2 \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtCompassWindArrow: public QwtDialNeedle { public: //! Style of the arrow enum Style { Style1, Style2 }; QwtCompassWindArrow( Style, const QColor &light = Qt::white, const QColor &dark = Qt::gray ); virtual void draw( QPainter *, const QPoint &, int length, double direction, QPalette::ColorGroup = QPalette::Active ) const; static void drawStyle1Needle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); static void drawStyle2Needle( QPainter *, const QPalette &, QPalette::ColorGroup, const QPoint &, int length, double direction ); private: Style d_style; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_abstract_slider.h0000644000373600000000000001241612571536560017126 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SLIDER_H #define QWT_ABSTRACT_SLIDER_H #include "qwt_global.h" #include "qwt_double_range.h" #include /*! \brief An abstract base class for slider widgets QwtAbstractSlider is a base class for slider widgets. It handles mouse events and updates the slider's value accordingly. Derived classes only have to implement the getValue() and getScrollMode() members, and should react to a valueChange(), which normally requires repainting. */ class QWT_EXPORT QwtAbstractSlider : public QWidget, public QwtDoubleRange { Q_OBJECT Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly ) Q_PROPERTY( bool valid READ isValid WRITE setValid ) Q_PROPERTY( double mass READ mass WRITE setMass ) Q_PROPERTY( Qt::Orientation orientation READ orientation WRITE setOrientation ) public: /*! Scroll mode \sa getScrollMode() */ enum ScrollMode { ScrNone, ScrMouse, ScrTimer, ScrDirect, ScrPage }; explicit QwtAbstractSlider( Qt::Orientation, QWidget *parent = NULL ); virtual ~QwtAbstractSlider(); void setUpdateTime( int t ); void stopMoving(); void setTracking( bool enable ); virtual void setMass( double val ); virtual double mass() const; virtual void setOrientation( Qt::Orientation o ); Qt::Orientation orientation() const; bool isReadOnly() const; /* Wrappers for QwtDblRange::isValid/QwtDblRange::setValid made to be available as Q_PROPERTY in the designer. */ /*! \sa QwtDblRange::isValid() */ bool isValid() const { return QwtDoubleRange::isValid(); } /*! \param valid true/false \sa QwtDblRange::isValid() */ void setValid( bool valid ) { QwtDoubleRange::setValid( valid ); } public Q_SLOTS: virtual void setValue( double val ); virtual void fitValue( double val ); virtual void incValue( int steps ); virtual void setReadOnly( bool ); Q_SIGNALS: /*! \brief Notify a change of value. In the default setting (tracking enabled), this signal will be emitted every time the value changes ( see setTracking() ). \param value new value */ void valueChanged( double value ); /*! This signal is emitted when the user presses the movable part of the slider (start ScrMouse Mode). */ void sliderPressed(); /*! This signal is emitted when the user releases the movable part of the slider. */ void sliderReleased(); /*! This signal is emitted when the user moves the slider with the mouse. \param value new value */ void sliderMoved( double value ); protected: virtual void setPosition( const QPoint & ); virtual void valueChange(); virtual void timerEvent( QTimerEvent *e ); virtual void mousePressEvent( QMouseEvent *e ); virtual void mouseReleaseEvent( QMouseEvent *e ); virtual void mouseMoveEvent( QMouseEvent *e ); virtual void keyPressEvent( QKeyEvent *e ); virtual void wheelEvent( QWheelEvent *e ); /*! \brief Determine the value corresponding to a specified poind This is an abstract virtual function which is called when the user presses or releases a mouse button or moves the mouse. It has to be implemented by the derived class. \param p point */ virtual double getValue( const QPoint & p ) = 0; /*! \brief Determine what to do when the user presses a mouse button. This function is abstract and has to be implemented by derived classes. It is called on a mousePress event. The derived class can determine what should happen next in dependence of the position where the mouse was pressed by returning scrolling mode and direction. QwtAbstractSlider knows the following modes: - ScrNone\n Scrolling switched off. Don't change the value. - ScrMouse Change the value while the user keeps the button pressed and moves the mouse. - ScrTimer Automatic scrolling. Increment the value in the specified direction as long as the user keeps the button pressed. - ScrPage Automatic scrolling. Same as ScrTimer, but increment by page size. \param p point where the mouse was pressed \retval scrollMode The scrolling mode \retval direction direction: 1, 0, or -1. */ virtual void getScrollMode( const QPoint &p, int &scrollMode, int &direction ) = 0; void setMouseOffset( double ); double mouseOffset() const; int scrollMode() const; private: void buttonReleased(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_layout.h0000644000373600000000000000562212571536557016343 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_LAYOUT_H #define QWT_PLOT_LAYOUT_H #include "qwt_global.h" #include "qwt_plot.h" /*! \brief Layout engine for QwtPlot. It is used by the QwtPlot widget to organize its internal widgets or by QwtPlot::print() to render its content to a QPaintDevice like a QPrinter, QPixmap/QImage or QSvgRenderer. */ class QWT_EXPORT QwtPlotLayout { public: /*! Options to configure the plot layout engine - AlignScales\n Unused - IgnoreScrollbars\n Ignore the dimension of the scrollbars. There are no scrollbars, when the plot is rendered to a paint device (QwtPlot::print() ). - IgnoreFrames\n Ignore all frames. QwtPlot::print() doesn't paint them. - IgnoreMargin\n Ignore the margin(). - IgnoreLegend\n Ignore the legend. \sa activate() */ enum Options { AlignScales = 1, IgnoreScrollbars = 2, IgnoreFrames = 4, IgnoreMargin = 8, IgnoreLegend = 16 }; explicit QwtPlotLayout(); virtual ~QwtPlotLayout(); void setMargin( int ); int margin() const; void setCanvasMargin( int margin, int axis = -1 ); int canvasMargin( int axis ) const; void setAlignCanvasToScales( bool ); bool alignCanvasToScales() const; void setSpacing( int ); int spacing() const; void setLegendPosition( QwtPlot::LegendPosition pos, double ratio ); void setLegendPosition( QwtPlot::LegendPosition pos ); QwtPlot::LegendPosition legendPosition() const; void setLegendRatio( double ratio ); double legendRatio() const; virtual QSize minimumSizeHint( const QwtPlot * ) const; virtual void activate( const QwtPlot *, const QRectF &rect, int options = 0 ); virtual void invalidate(); const QRectF &titleRect() const; const QRectF &legendRect() const; const QRectF &scaleRect( int axis ) const; const QRectF &canvasRect() const; class LayoutData; protected: QRectF layoutLegend( int options, const QRectF & ) const; QRectF alignLegend( const QRectF &canvasRect, const QRectF &legendRect ) const; void expandLineBreaks( int options, const QRectF &rect, int &dimTitle, int dimAxes[QwtPlot::axisCnt] ) const; void alignScales( int options, QRectF &canvasRect, QRectF scaleRect[QwtPlot::axisCnt] ) const; private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_legend.cpp0000644000373600000000000003070112571536557015555 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_legend.h" #include "qwt_legend_itemmanager.h" #include "qwt_legend_item.h" #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include #include #include #include class QwtLegend::PrivateData { public: class LegendMap { public: void insert( const QwtLegendItemManager *, QWidget * ); void remove( const QwtLegendItemManager * ); void remove( QWidget * ); void clear(); uint count() const; inline const QWidget *find( const QwtLegendItemManager * ) const; inline QWidget *find( const QwtLegendItemManager * ); inline const QwtLegendItemManager *find( const QWidget * ) const; inline QwtLegendItemManager *find( const QWidget * ); const QMap &widgetMap() const; QMap &widgetMap(); private: QMap d_widgetMap; QMap d_itemMap; }; QwtLegend::LegendItemMode itemMode; LegendMap map; class LegendView; LegendView *view; }; class QwtLegend::PrivateData::LegendView: public QScrollArea { public: LegendView( QWidget *parent ): QScrollArea( parent ) { contentsWidget = new QWidget( this ); setWidget( contentsWidget ); setWidgetResizable( false ); setFocusPolicy( Qt::NoFocus ); } virtual bool viewportEvent( QEvent *e ) { bool ok = QScrollArea::viewportEvent( e ); if ( e->type() == QEvent::Resize ) { QEvent event( QEvent::LayoutRequest ); QApplication::sendEvent( contentsWidget, &event ); } return ok; } QSize viewportSize( int w, int h ) const { const int sbHeight = horizontalScrollBar()->sizeHint().height(); const int sbWidth = verticalScrollBar()->sizeHint().width(); const int cw = contentsRect().width(); const int ch = contentsRect().height(); int vw = cw; int vh = ch; if ( w > vw ) vh -= sbHeight; if ( h > vh ) { vw -= sbWidth; if ( w > vw && vh == ch ) vh -= sbHeight; } return QSize( vw, vh ); } QWidget *contentsWidget; }; void QwtLegend::PrivateData::LegendMap::insert( const QwtLegendItemManager *item, QWidget *widget ) { d_itemMap.insert( item, widget ); d_widgetMap.insert( widget, item ); } void QwtLegend::PrivateData::LegendMap::remove( const QwtLegendItemManager *item ) { QWidget *widget = d_itemMap[item]; d_itemMap.remove( item ); d_widgetMap.remove( widget ); } void QwtLegend::PrivateData::LegendMap::remove( QWidget *widget ) { const QwtLegendItemManager *item = d_widgetMap[widget]; d_itemMap.remove( item ); d_widgetMap.remove( widget ); } void QwtLegend::PrivateData::LegendMap::clear() { /* We can't delete the widgets in the following loop, because we would get ChildRemoved events, changing d_itemMap, while we are iterating. */ QList widgets; QMap::const_iterator it; for ( it = d_itemMap.begin(); it != d_itemMap.end(); ++it ) widgets.append( it.value() ); d_itemMap.clear(); d_widgetMap.clear(); for ( int i = 0; i < ( int )widgets.size(); i++ ) delete widgets[i]; } uint QwtLegend::PrivateData::LegendMap::count() const { return d_itemMap.count(); } inline const QWidget *QwtLegend::PrivateData::LegendMap::find( const QwtLegendItemManager *item ) const { if ( !d_itemMap.contains( item ) ) return NULL; return d_itemMap[item]; } inline QWidget *QwtLegend::PrivateData::LegendMap::find( const QwtLegendItemManager *item ) { if ( !d_itemMap.contains( item ) ) return NULL; return d_itemMap[item]; } inline const QwtLegendItemManager *QwtLegend::PrivateData::LegendMap::find( const QWidget *widget ) const { QWidget *w = const_cast( widget ); if ( !d_widgetMap.contains( w ) ) return NULL; return d_widgetMap[w]; } inline QwtLegendItemManager *QwtLegend::PrivateData::LegendMap::find( const QWidget *widget ) { QWidget *w = const_cast( widget ); if ( !d_widgetMap.contains( w ) ) return NULL; return const_cast( d_widgetMap[w] ); } inline const QMap & QwtLegend::PrivateData::LegendMap::widgetMap() const { return d_widgetMap; } inline QMap & QwtLegend::PrivateData::LegendMap::widgetMap() { return d_widgetMap; } /*! Constructor \param parent Parent widget */ QwtLegend::QwtLegend( QWidget *parent ): QFrame( parent ) { setFrameStyle( NoFrame ); d_data = new QwtLegend::PrivateData; d_data->itemMode = QwtLegend::ReadOnlyItem; d_data->view = new QwtLegend::PrivateData::LegendView( this ); d_data->view->setFrameStyle( NoFrame ); QwtDynGridLayout *layout = new QwtDynGridLayout( d_data->view->contentsWidget ); layout->setAlignment( Qt::AlignHCenter | Qt::AlignTop ); d_data->view->contentsWidget->installEventFilter( this ); } //! Destructor QwtLegend::~QwtLegend() { delete d_data; } //! \sa LegendItemMode void QwtLegend::setItemMode( LegendItemMode mode ) { d_data->itemMode = mode; } //! \sa LegendItemMode QwtLegend::LegendItemMode QwtLegend::itemMode() const { return d_data->itemMode; } /*! The contents widget is the only child of the viewport() and the parent widget of all legend items. */ QWidget *QwtLegend::contentsWidget() { return d_data->view->contentsWidget; } /*! \return Horizontal scrollbar \sa verticalScrollBar() */ QScrollBar *QwtLegend::horizontalScrollBar() const { return d_data->view->horizontalScrollBar(); } /*! \return Vertical scrollbar \sa horizontalScrollBar() */ QScrollBar *QwtLegend::verticalScrollBar() const { return d_data->view->verticalScrollBar(); } /*! The contents widget is the only child of the viewport() and the parent widget of all legend items. */ const QWidget *QwtLegend::contentsWidget() const { return d_data->view->contentsWidget; } /*! Insert a new item for a plot item \param plotItem Plot item \param legendItem New legend item \note The parent of item will be changed to QwtLegend::contentsWidget() */ void QwtLegend::insert( const QwtLegendItemManager *plotItem, QWidget *legendItem ) { if ( legendItem == NULL || plotItem == NULL ) return; QWidget *contentsWidget = d_data->view->contentsWidget; if ( legendItem->parent() != contentsWidget ) legendItem->setParent( contentsWidget ); legendItem->show(); d_data->map.insert( plotItem, legendItem ); layoutContents(); if ( contentsWidget->layout() ) { contentsWidget->layout()->addWidget( legendItem ); // set tab focus chain QWidget *w = NULL; for ( int i = 0; i < contentsWidget->layout()->count(); i++ ) { QLayoutItem *item = contentsWidget->layout()->itemAt( i ); if ( w && item->widget() ) QWidget::setTabOrder( w, item->widget() ); w = item->widget(); } } if ( parentWidget() && parentWidget()->layout() == NULL ) { /* updateGeometry() doesn't post LayoutRequest in certain situations, like when we are hidden. But we want the parent widget notified, so it can show/hide the legend depending on its items. */ QApplication::postEvent( parentWidget(), new QEvent( QEvent::LayoutRequest ) ); } } /*! Find the widget that represents a plot item \param plotItem Plot item \return Widget on the legend, or NULL */ QWidget *QwtLegend::find( const QwtLegendItemManager *plotItem ) const { return d_data->map.find( plotItem ); } /*! Find the widget that represents a plot item \param legendItem Legend item \return Widget on the legend, or NULL */ QwtLegendItemManager *QwtLegend::find( const QWidget *legendItem ) const { return d_data->map.find( legendItem ); } /*! Find the corresponding item for a plotItem and remove it from the item list. \param plotItem Plot item */ void QwtLegend::remove( const QwtLegendItemManager *plotItem ) { QWidget *legendItem = d_data->map.find( plotItem ); d_data->map.remove( legendItem ); delete legendItem; } //! Remove all items. void QwtLegend::clear() { bool doUpdate = updatesEnabled(); if ( doUpdate ) setUpdatesEnabled( false ); d_data->map.clear(); if ( doUpdate ) setUpdatesEnabled( true ); update(); } //! Return a size hint. QSize QwtLegend::sizeHint() const { QSize hint = d_data->view->contentsWidget->sizeHint(); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! \return The preferred height, for the width w. \param width Width */ int QwtLegend::heightForWidth( int width ) const { width -= 2 * frameWidth(); int h = d_data->view->contentsWidget->heightForWidth( width ); if ( h >= 0 ) h += 2 * frameWidth(); return h; } /*! Adjust contents widget and item layout to the size of the viewport(). */ void QwtLegend::layoutContents() { const QSize visibleSize = d_data->view->viewport()->size(); const QLayout *l = d_data->view->contentsWidget->layout(); if ( l && l->inherits( "QwtDynGridLayout" ) ) { const QwtDynGridLayout *tl = ( const QwtDynGridLayout * )l; const int minW = int( tl->maxItemWidth() ) + 2 * tl->margin(); int w = qMax( visibleSize.width(), minW ); int h = qMax( tl->heightForWidth( w ), visibleSize.height() ); const int vpWidth = d_data->view->viewportSize( w, h ).width(); if ( w > vpWidth ) { w = qMax( vpWidth, minW ); h = qMax( tl->heightForWidth( w ), visibleSize.height() ); } d_data->view->contentsWidget->resize( w, h ); } } /*! Filter layout related events of QwtLegend::contentsWidget(). \param o Object to be filtered \param e Event */ bool QwtLegend::eventFilter( QObject *o, QEvent *e ) { if ( o == d_data->view->contentsWidget ) { switch ( e->type() ) { case QEvent::ChildRemoved: { const QChildEvent *ce = ( const QChildEvent * )e; if ( ce->child()->isWidgetType() ) d_data->map.remove( ( QWidget * )ce->child() ); break; } case QEvent::LayoutRequest: { layoutContents(); break; } default: break; } } return QFrame::eventFilter( o, e ); } //! Return true, if there are no legend items. bool QwtLegend::isEmpty() const { return d_data->map.count() == 0; } //! Return the number of legend items. uint QwtLegend::itemCount() const { return d_data->map.count(); } //! Return a list of all legend items QList QwtLegend::legendItems() const { const QMap &map = d_data->map.widgetMap(); QList list; QMap::const_iterator it; for ( it = map.begin(); it != map.end(); ++it ) list += it.key(); return list; } /*! Resize event \param e Resize event */ void QwtLegend::resizeEvent( QResizeEvent *e ) { QFrame::resizeEvent( e ); d_data->view->setGeometry( contentsRect() ); } starpu-1.1.5/starpu-top/qwt/qwt_curve_fitter.cpp0000644000373600000000000002274112571536557017025 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_curve_fitter.h" #include "qwt_math.h" #include "qwt_spline.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif //! Constructor QwtCurveFitter::QwtCurveFitter() { } //! Destructor QwtCurveFitter::~QwtCurveFitter() { } class QwtSplineCurveFitter::PrivateData { public: PrivateData(): fitMode( QwtSplineCurveFitter::Auto ), splineSize( 250 ) { } QwtSpline spline; QwtSplineCurveFitter::FitMode fitMode; int splineSize; }; //! Constructor QwtSplineCurveFitter::QwtSplineCurveFitter() { d_data = new PrivateData; } //! Destructor QwtSplineCurveFitter::~QwtSplineCurveFitter() { delete d_data; } /*! Select the algorithm used for building the spline \param mode Mode representing a spline algorithm \sa fitMode() */ void QwtSplineCurveFitter::setFitMode( FitMode mode ) { d_data->fitMode = mode; } /*! \return Mode representing a spline algorithm \sa setFitMode() */ QwtSplineCurveFitter::FitMode QwtSplineCurveFitter::fitMode() const { return d_data->fitMode; } /*! Assign a spline \param spline Spline \sa spline() */ void QwtSplineCurveFitter::setSpline( const QwtSpline &spline ) { d_data->spline = spline; d_data->spline.reset(); } /*! \return Spline \sa setSpline() */ const QwtSpline &QwtSplineCurveFitter::spline() const { return d_data->spline; } /*! \return Spline \sa setSpline() */ QwtSpline &QwtSplineCurveFitter::spline() { return d_data->spline; } /*! Assign a spline size ( has to be at least 10 points ) \param splineSize Spline size \sa splineSize() */ void QwtSplineCurveFitter::setSplineSize( int splineSize ) { d_data->splineSize = qMax( splineSize, 10 ); } /*! \return Spline size \sa setSplineSize() */ int QwtSplineCurveFitter::splineSize() const { return d_data->splineSize; } /*! Find a curve which has the best fit to a series of data points \param points Series of data points \return Curve points */ QPolygonF QwtSplineCurveFitter::fitCurve( const QPolygonF &points ) const { const int size = ( int )points.size(); if ( size <= 2 ) return points; FitMode fitMode = d_data->fitMode; if ( fitMode == Auto ) { fitMode = Spline; const QPointF *p = points.data(); for ( int i = 1; i < size; i++ ) { if ( p[i].x() <= p[i-1].x() ) { fitMode = ParametricSpline; break; } }; } if ( fitMode == ParametricSpline ) return fitParametric( points ); else return fitSpline( points ); } QPolygonF QwtSplineCurveFitter::fitSpline( const QPolygonF &points ) const { d_data->spline.setPoints( points ); if ( !d_data->spline.isValid() ) return points; QPolygonF fittedPoints( d_data->splineSize ); const double x1 = points[0].x(); const double x2 = points[int( points.size() - 1 )].x(); const double dx = x2 - x1; const double delta = dx / ( d_data->splineSize - 1 ); for ( int i = 0; i < d_data->splineSize; i++ ) { QPointF &p = fittedPoints[i]; const double v = x1 + i * delta; const double sv = d_data->spline.value( v ); p.setX( qRound( v ) ); p.setY( qRound( sv ) ); } d_data->spline.reset(); return fittedPoints; } QPolygonF QwtSplineCurveFitter::fitParametric( const QPolygonF &points ) const { int i; const int size = points.size(); QPolygonF fittedPoints( d_data->splineSize ); QPolygonF splinePointsX( size ); QPolygonF splinePointsY( size ); const QPointF *p = points.data(); QPointF *spX = splinePointsX.data(); QPointF *spY = splinePointsY.data(); double param = 0.0; for ( i = 0; i < size; i++ ) { const double x = p[i].x(); const double y = p[i].y(); if ( i > 0 ) { const double delta = qSqrt( qwtSqr( x - spX[i-1].y() ) + qwtSqr( y - spY[i-1].y() ) ); param += qMax( delta, 1.0 ); } spX[i].setX( param ); spX[i].setY( x ); spY[i].setX( param ); spY[i].setY( y ); } d_data->spline.setPoints( splinePointsX ); if ( !d_data->spline.isValid() ) return points; const double deltaX = splinePointsX[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaX; fittedPoints[i].setX( qRound( d_data->spline.value( dtmp ) ) ); } d_data->spline.setPoints( splinePointsY ); if ( !d_data->spline.isValid() ) return points; const double deltaY = splinePointsY[size - 1].x() / ( d_data->splineSize - 1 ); for ( i = 0; i < d_data->splineSize; i++ ) { const double dtmp = i * deltaY; fittedPoints[i].setY( qRound( d_data->spline.value( dtmp ) ) ); } return fittedPoints; } class QwtWeedingCurveFitter::PrivateData { public: PrivateData(): tolerance( 1.0 ) { } double tolerance; }; class QwtWeedingCurveFitter::Line { public: Line( int i1 = 0, int i2 = 0 ): from( i1 ), to( i2 ) { } int from; int to; }; /*! Constructor \param tolerance Tolerance \sa setTolerance(), tolerance() */ QwtWeedingCurveFitter::QwtWeedingCurveFitter( double tolerance ) { d_data = new PrivateData; setTolerance( tolerance ); } //! Destructor QwtWeedingCurveFitter::~QwtWeedingCurveFitter() { delete d_data; } /*! Assign the tolerance The tolerance is the maximum distance, that is accaptable between the original curve and the smoothed curve. Increasing the tolerance will reduce the number of the resulting points. \param tolerance Tolerance \sa tolerance() */ void QwtWeedingCurveFitter::setTolerance( double tolerance ) { d_data->tolerance = qMax( tolerance, 0.0 ); } /*! \return Tolerance \sa setTolerance() */ double QwtWeedingCurveFitter::tolerance() const { return d_data->tolerance; } /*! \param points Series of data points \return Curve points */ QPolygonF QwtWeedingCurveFitter::fitCurve( const QPolygonF &points ) const { QStack stack; stack.reserve( 500 ); const QPointF *p = points.data(); const int nPoints = points.size(); QVector usePoint( nPoints, false ); double distToSegment; stack.push( Line( 0, nPoints - 1 ) ); while ( !stack.isEmpty() ) { const Line r = stack.pop(); // initialize line segment const double vecX = p[r.to].x() - p[r.from].x(); const double vecY = p[r.to].y() - p[r.from].y(); const double vecLength = qSqrt( vecX * vecX + vecY * vecY ); const double unitVecX = ( vecLength != 0.0 ) ? vecX / vecLength : 0.0; const double unitVecY = ( vecLength != 0.0 ) ? vecY / vecLength : 0.0; double maxDist = 0.0; int nVertexIndexMaxDistance = r.from + 1; for ( int i = r.from + 1; i < r.to; i++ ) { //compare to anchor const double fromVecX = p[i].x() - p[r.from].x(); const double fromVecY = p[i].y() - p[r.from].y(); const double fromVecLength = qSqrt( fromVecX * fromVecX + fromVecY * fromVecY ); if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 ) { distToSegment = fromVecLength; } if ( fromVecX * unitVecX + fromVecY * unitVecY < 0.0 ) { distToSegment = fromVecLength; } else { const double toVecX = p[i].x() - p[r.to].x(); const double toVecY = p[i].y() - p[r.to].y(); const double toVecLength = qSqrt( toVecX * toVecX + toVecY * toVecY ); const double s = toVecX * ( -unitVecX ) + toVecY * ( -unitVecY ); if ( s < 0.0 ) distToSegment = toVecLength; else { distToSegment = qSqrt( qFabs( toVecLength * toVecLength - s * s ) ); } } if ( maxDist < distToSegment ) { maxDist = distToSegment; nVertexIndexMaxDistance = i; } } if ( maxDist <= d_data->tolerance ) { usePoint[r.from] = true; usePoint[r.to] = true; } else { stack.push( Line( r.from, nVertexIndexMaxDistance ) ); stack.push( Line( nVertexIndexMaxDistance, r.to ) ); } } int cnt = 0; QPolygonF stripped( nPoints ); for ( int i = 0; i < nPoints; i++ ) { if ( usePoint[i] ) stripped[cnt++] = p[i]; } stripped.resize( cnt ); return stripped; } starpu-1.1.5/starpu-top/qwt/qwt_text_label.cpp0000644000373600000000000001541712571536560016443 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_label.h" #include "qwt_text.h" #include "qwt_painter.h" #include #include #include class QwtTextLabel::PrivateData { public: PrivateData(): indent( 4 ), margin( 0 ) { } int indent; int margin; QwtText text; }; /*! Constructs an empty label. \param parent Parent widget */ QwtTextLabel::QwtTextLabel( QWidget *parent ): QFrame( parent ) { init(); } /*! Constructs a label that displays the text, text \param parent Parent widget \param text Text */ QwtTextLabel::QwtTextLabel( const QwtText &text, QWidget *parent ): QFrame( parent ) { init(); d_data->text = text; } //! Destructor QwtTextLabel::~QwtTextLabel() { delete d_data; } void QwtTextLabel::init() { d_data = new PrivateData(); setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); } /*! Change the label's text, keeping all other QwtText attributes \param text New text \param textFormat Format of text \sa QwtText */ void QwtTextLabel::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text.setText( text, textFormat ); update(); updateGeometry(); } /*! Change the label's text \param text New text */ void QwtTextLabel::setText( const QwtText &text ) { d_data->text = text; update(); updateGeometry(); } //! Return the text const QwtText &QwtTextLabel::text() const { return d_data->text; } //! Clear the text and all QwtText attributes void QwtTextLabel::clear() { d_data->text = QwtText(); update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::indent() const { return d_data->indent; } /*! Set label's text indent in pixels \param indent Indentation in pixels */ void QwtTextLabel::setIndent( int indent ) { if ( indent < 0 ) indent = 0; d_data->indent = indent; update(); updateGeometry(); } //! Return label's text indent in pixels int QwtTextLabel::margin() const { return d_data->margin; } /*! Set label's margin in pixels \param margin Margin in pixels */ void QwtTextLabel::setMargin( int margin ) { d_data->margin = margin; update(); updateGeometry(); } //! Return label's margin in pixels QSize QwtTextLabel::sizeHint() const { return minimumSizeHint(); } //! Return a minimum size hint QSize QwtTextLabel::minimumSizeHint() const { QSizeF sz = d_data->text.textSize( font() ); int mw = 2 * ( frameWidth() + d_data->margin ); int mh = mw; int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int align = d_data->text.renderFlags(); if ( align & Qt::AlignLeft || align & Qt::AlignRight ) mw += d_data->indent; else if ( align & Qt::AlignTop || align & Qt::AlignBottom ) mh += d_data->indent; } sz += QSizeF( mw, mh ); return QSize( qCeil( sz.width() ), qCeil( sz.height() ) ); } /*! Returns the preferred height for this widget, given the width. \param width Width */ int QwtTextLabel::heightForWidth( int width ) const { const int renderFlags = d_data->text.renderFlags(); int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); width -= 2 * frameWidth(); if ( renderFlags & Qt::AlignLeft || renderFlags & Qt::AlignRight ) width -= indent; int height = d_data->text.heightForWidth( width, font() ); if ( renderFlags & Qt::AlignTop || renderFlags & Qt::AlignBottom ) height += indent; height += 2 * frameWidth(); return height; } /*! Qt paint event \param event Paint event */ void QwtTextLabel::paintEvent( QPaintEvent *event ) { QPainter painter( this ); if ( !contentsRect().contains( event->rect() ) ) { painter.save(); painter.setClipRegion( event->region() & frameRect() ); drawFrame( &painter ); painter.restore(); } painter.setClipRegion( event->region() & contentsRect() ); drawContents( &painter ); } //! Redraw the text and focus indicator void QwtTextLabel::drawContents( QPainter *painter ) { const QRect r = textRect(); if ( r.isEmpty() ) return; painter->setFont( font() ); painter->setPen( palette().color( QPalette::Active, QPalette::Text ) ); drawText( painter, r ); if ( hasFocus() ) { const int margin = 2; QRect focusRect = contentsRect(); focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin - 2, focusRect.height() - 2 * margin - 2 ); QwtPainter::drawFocusRect( painter, this, focusRect ); } } //! Redraw the text void QwtTextLabel::drawText( QPainter *painter, const QRect &textRect ) { d_data->text.draw( painter, textRect ); } /*! Calculate the rect for the text in widget coordinates \return Text rect */ QRect QwtTextLabel::textRect() const { QRect r = contentsRect(); if ( !r.isEmpty() && d_data->margin > 0 ) { r.setRect( r.x() + d_data->margin, r.y() + d_data->margin, r.width() - 2 * d_data->margin, r.height() - 2 * d_data->margin ); } if ( !r.isEmpty() ) { int indent = d_data->indent; if ( indent <= 0 ) indent = defaultIndent(); if ( indent > 0 ) { const int renderFlags = d_data->text.renderFlags(); if ( renderFlags & Qt::AlignLeft ) r.setX( r.x() + indent ); else if ( renderFlags & Qt::AlignRight ) r.setWidth( r.width() - indent ); else if ( renderFlags & Qt::AlignTop ) r.setY( r.y() + indent ); else if ( renderFlags & Qt::AlignBottom ) r.setHeight( r.height() - indent ); } } return r; } int QwtTextLabel::defaultIndent() const { if ( frameWidth() <= 0 ) return 0; QFont fnt; if ( d_data->text.testPaintAttribute( QwtText::PaintUsingTextFont ) ) fnt = d_data->text.font(); else fnt = font(); return QFontMetrics( fnt ).width( 'x' ) / 2; } starpu-1.1.5/starpu-top/qwt/qwt_text_engine.cpp0000644000373600000000000002160512571536557016633 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text_engine.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #include static QString taggedRichText( const QString &text, int flags ) { QString richText = text; // By default QSimpleRichText is Qt::AlignLeft if ( flags & Qt::AlignJustify ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } else if ( flags & Qt::AlignRight ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } else if ( flags & Qt::AlignHCenter ) { richText.prepend( QString::fromLatin1( "
" ) ); richText.append( QString::fromLatin1( "
" ) ); } return richText; } class QwtRichTextDocument: public QTextDocument { public: QwtRichTextDocument( const QString &text, int flags, const QFont &font ) { setUndoRedoEnabled( false ); setDefaultFont( font ); setHtml( text ); // make sure we have a document layout ( void )documentLayout(); QTextOption option = defaultTextOption(); if ( flags & Qt::TextWordWrap ) option.setWrapMode( QTextOption::WordWrap ); else option.setWrapMode( QTextOption::NoWrap ); option.setAlignment( ( Qt::Alignment ) flags ); setDefaultTextOption( option ); QTextFrame *root = rootFrame(); QTextFrameFormat fm = root->frameFormat(); fm.setBorder( 0 ); fm.setMargin( 0 ); fm.setPadding( 0 ); fm.setBottomMargin( 0 ); fm.setLeftMargin( 0 ); root->setFrameFormat( fm ); adjustSize(); } }; class QwtPlainTextEngine::PrivateData { public: int effectiveAscent( const QFont &font ) const { const QString fontKey = font.key(); QMap::const_iterator it = d_ascentCache.find( fontKey ); if ( it == d_ascentCache.end() ) { int ascent = findAscent( font ); it = d_ascentCache.insert( fontKey, ascent ); } return ( *it ); } private: int findAscent( const QFont &font ) const { static const QString dummy( "E" ); static const QColor white( Qt::white ); const QFontMetrics fm( font ); QPixmap pm( fm.width( dummy ), fm.height() ); pm.fill( white ); QPainter p( &pm ); p.setFont( font ); p.drawText( 0, 0, pm.width(), pm.height(), 0, dummy ); p.end(); const QImage img = pm.toImage(); int row = 0; for ( row = 0; row < img.height(); row++ ) { const QRgb *line = ( const QRgb * )img.scanLine( row ); const int w = pm.width(); for ( int col = 0; col < w; col++ ) { if ( line[col] != white.rgb() ) return fm.ascent() - row + 1; } } return fm.ascent(); } mutable QMap d_ascentCache; }; //! Constructor QwtTextEngine::QwtTextEngine() { } //! Destructor QwtTextEngine::~QwtTextEngine() { } //! Constructor QwtPlainTextEngine::QwtPlainTextEngine() { d_data = new PrivateData; } //! Destructor QwtPlainTextEngine::~QwtPlainTextEngine() { delete d_data; } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtPlainTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, width, QWIDGETSIZE_MAX ), flags, text ); return rect.height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtPlainTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { const QFontMetricsF fm( font ); const QRectF rect = fm.boundingRect( QRectF( 0, 0, QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ), flags, text ); return rect.size(); } /*! Return margins around the texts \param font Font of the text \param left Return 0 \param right Return 0 \param top Return value for the top margin \param bottom Return value for the bottom margin */ void QwtPlainTextEngine::textMargins( const QFont &font, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = 0; const QFontMetricsF fm( font ); top = fm.ascent() - d_data->effectiveAscent( font ); bottom = fm.descent(); } /*! \brief Draw the text in a clipping rectangle A wrapper for QPainter::drawText. \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered */ void QwtPlainTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtPainter::drawText( painter, rect, flags, text ); } /*! Test if a string can be rendered by this text engine. \return Always true. All texts can be rendered by QwtPlainTextEngine */ bool QwtPlainTextEngine::mightRender( const QString & ) const { return true; } #ifndef QT_NO_RICHTEXT //! Constructor QwtRichTextEngine::QwtRichTextEngine() { } /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ double QwtRichTextEngine::heightForWidth( const QFont& font, int flags, const QString& text, double width ) const { QwtRichTextDocument doc( text, flags, font ); doc.setPageSize( QSizeF( width, QWIDGETSIZE_MAX ) ); return doc.documentLayout()->documentSize().height(); } /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \return Caluclated size */ QSizeF QwtRichTextEngine::textSize( const QFont &font, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, font ); QTextOption option = doc.defaultTextOption(); if ( option.wrapMode() != QTextOption::NoWrap ) { option.setWrapMode( QTextOption::NoWrap ); doc.setDefaultTextOption( option ); doc.adjustSize(); } return doc.size(); } /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered */ void QwtRichTextEngine::draw( QPainter *painter, const QRectF &rect, int flags, const QString& text ) const { QwtRichTextDocument doc( text, flags, painter->font() ); QwtPainter::drawSimpleRichText( painter, rect, flags, doc ); } /*! Wrap text into
tags according flags \param text Text \param flags Bitwise OR of the flags like in for QPainter::drawText \return Tagged text */ QString QwtRichTextEngine::taggedText( const QString &text, int flags ) const { return taggedRichText( text, flags ); } /*! Test if a string can be rendered by this text engine \param text Text to be tested \return QStyleSheet::mightBeRichText(text); */ bool QwtRichTextEngine::mightRender( const QString &text ) const { return Qt::mightBeRichText( text ); } /*! Return margins around the texts \param left Return 0 \param right Return 0 \param top Return 0 \param bottom Return 0 */ void QwtRichTextEngine::textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const { left = right = top = bottom = 0; } #endif // !QT_NO_RICHTEXT starpu-1.1.5/starpu-top/qwt/qwt_curve_fitter.h0000644000373600000000000000653012571536557016470 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_CURVE_FITTER_H #define QWT_CURVE_FITTER_H #include "qwt_global.h" #include #include class QwtSpline; /*! \brief Abstract base class for a curve fitter */ class QWT_EXPORT QwtCurveFitter { public: virtual ~QwtCurveFitter(); /*! Find a curve which has the best fit to a series of data points \param polygon Series of data points \return Curve points */ virtual QPolygonF fitCurve( const QPolygonF &polygon ) const = 0; protected: QwtCurveFitter(); private: QwtCurveFitter( const QwtCurveFitter & ); QwtCurveFitter &operator=( const QwtCurveFitter & ); }; /*! \brief A curve fitter using cubic splines */ class QWT_EXPORT QwtSplineCurveFitter: public QwtCurveFitter { public: /*! - Spline\n Use a default spline algorithm - ParametricSpline\n Use a parametric spline algorithm - Auto\n Use the default spline algorithm for polygons with increasing x values ( p[i-1] < p[i] ), otherwise use a parametric spline algorithm. The default setting is Auto \sa setFitMode(), FitMode() */ enum FitMode { Auto, Spline, ParametricSpline }; QwtSplineCurveFitter(); virtual ~QwtSplineCurveFitter(); void setFitMode( FitMode ); FitMode fitMode() const; void setSpline( const QwtSpline& ); const QwtSpline &spline() const; QwtSpline &spline(); void setSplineSize( int size ); int splineSize() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: QPolygonF fitSpline( const QPolygonF & ) const; QPolygonF fitParametric( const QPolygonF & ) const; class PrivateData; PrivateData *d_data; }; /*! \brief A curve fitter implementing Douglas and Peucker algorithm The purpose of the Douglas and Peucker algorithm is that given a 'curve' composed of line segments to find a curve not too dissimilar but that has fewer points. The algorithm defines 'too dissimilar' based on the maximum distance (tolerance) between the original curve and the smoothed curve. The smoothed curve consists of a subset of the points that defined the original curve. In opposite to QwtSplineCurveFitter the Douglas and Peucker algorithm reduces the number of points. By adjusting the tolerance parameter according to the axis scales QwtSplineCurveFitter can be used to implement different level of details to speed up painting of curves of many points. */ class QWT_EXPORT QwtWeedingCurveFitter: public QwtCurveFitter { public: QwtWeedingCurveFitter( double tolerance = 1.0 ); virtual ~QwtWeedingCurveFitter(); void setTolerance( double ); double tolerance() const; virtual QPolygonF fitCurve( const QPolygonF & ) const; private: class Line; class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_abstract_scale_draw.cpp0000644000373600000000000002310212571536557020303 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale_draw.h" #include "qwt_math.h" #include "qwt_text.h" #include "qwt_painter.h" #include "qwt_scale_map.h" #include #include #include #include class QwtAbstractScaleDraw::PrivateData { public: PrivateData(): components( Backbone | Ticks | Labels ), spacing( 4.0 ), penWidth( 0 ), minExtent( 0.0 ) { tickLength[QwtScaleDiv::MinorTick] = 4.0; tickLength[QwtScaleDiv::MediumTick] = 6.0; tickLength[QwtScaleDiv::MajorTick] = 8.0; } int components; QwtScaleMap map; QwtScaleDiv scldiv; double spacing; double tickLength[QwtScaleDiv::NTickTypes]; int penWidth; double minExtent; QMap labelCache; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The spacing (distance between ticks and labels) is set to 4, the tick lengths are set to 4,6 and 8 pixels */ QwtAbstractScaleDraw::QwtAbstractScaleDraw() { d_data = new QwtAbstractScaleDraw::PrivateData; } //! Destructor QwtAbstractScaleDraw::~QwtAbstractScaleDraw() { delete d_data; } /*! En/Disable a component of the scale \param component Scale component \param enable On/Off \sa hasComponent() */ void QwtAbstractScaleDraw::enableComponent( ScaleComponent component, bool enable ) { if ( enable ) d_data->components |= component; else d_data->components &= ~component; } /*! Check if a component is enabled \sa enableComponent() */ bool QwtAbstractScaleDraw::hasComponent( ScaleComponent component ) const { return ( d_data->components & component ); } /*! Change the scale division \param sd New scale division */ void QwtAbstractScaleDraw::setScaleDiv( const QwtScaleDiv &sd ) { d_data->scldiv = sd; d_data->map.setScaleInterval( sd.lowerBound(), sd.upperBound() ); d_data->labelCache.clear(); } /*! Change the transformation of the scale \param transformation New scale transformation */ void QwtAbstractScaleDraw::setTransformation( QwtScaleTransformation *transformation ) { d_data->map.setTransformation( transformation ); } //! \return Map how to translate between scale and pixel values const QwtScaleMap &QwtAbstractScaleDraw::map() const { return d_data->map; } //! \return Map how to translate between scale and pixel values QwtScaleMap &QwtAbstractScaleDraw::scaleMap() { return d_data->map; } //! \return scale division const QwtScaleDiv& QwtAbstractScaleDraw::scaleDiv() const { return d_data->scldiv; } /*! \brief Specify the width of the scale pen \param width Pen width \sa penWidth() */ void QwtAbstractScaleDraw::setPenWidth( int width ) { if ( width < 0 ) width = 0; if ( width != d_data->penWidth ) d_data->penWidth = width; } /*! \return Scale pen width \sa setPenWidth() */ int QwtAbstractScaleDraw::penWidth() const { return d_data->penWidth; } /*! \brief Draw the scale \param painter The painter \param palette Palette, text color is used for the labels, foreground color for ticks and backbone */ void QwtAbstractScaleDraw::draw( QPainter *painter, const QPalette& palette ) const { painter->save(); QPen pen = painter->pen(); pen.setWidth( d_data->penWidth ); pen.setCosmetic( false ); painter->setPen( pen ); if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { painter->save(); painter->setPen( palette.color( QPalette::Text ) ); // ignore pen style const QList &majorTicks = d_data->scldiv.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { const double v = majorTicks[i]; if ( d_data->scldiv.contains( v ) ) drawLabel( painter, majorTicks[i] ); } painter->restore(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { painter->save(); QPen pen = painter->pen(); pen.setColor( palette.color( QPalette::WindowText ) ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); for ( int tickType = QwtScaleDiv::MinorTick; tickType < QwtScaleDiv::NTickTypes; tickType++ ) { const QList &ticks = d_data->scldiv.ticks( tickType ); for ( int i = 0; i < ( int )ticks.count(); i++ ) { const double v = ticks[i]; if ( d_data->scldiv.contains( v ) ) drawTick( painter, v, d_data->tickLength[tickType] ); } } painter->restore(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { painter->save(); QPen pen = painter->pen(); pen.setColor( palette.color( QPalette::WindowText ) ); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); drawBackbone( painter ); painter->restore(); } painter->restore(); } /*! \brief Set the spacing between tick and labels The spacing is the distance between ticks and labels. The default spacing is 4 pixels. \param spacing Spacing \sa spacing() */ void QwtAbstractScaleDraw::setSpacing( double spacing ) { if ( spacing < 0 ) spacing = 0; d_data->spacing = spacing; } /*! \brief Get the spacing The spacing is the distance between ticks and labels. The default spacing is 4 pixels. \sa setSpacing() */ double QwtAbstractScaleDraw::spacing() const { return d_data->spacing; } /*! \brief Set a minimum for the extent The extent is calculated from the coomponents of the scale draw. In situations, where the labels are changing and the layout depends on the extent (f.e scrolling a scale), setting an upper limit as minimum extent will avoid jumps of the layout. \param minExtent Minimum extent \sa extent(), minimumExtent() */ void QwtAbstractScaleDraw::setMinimumExtent( double minExtent ) { if ( minExtent < 0.0 ) minExtent = 0.0; d_data->minExtent = minExtent; } /*! Get the minimum extent \sa extent(), setMinimumExtent() */ double QwtAbstractScaleDraw::minimumExtent() const { return d_data->minExtent; } /*! Set the length of the ticks \param tickType Tick type \param length New length \warning the length is limited to [0..1000] */ void QwtAbstractScaleDraw::setTickLength( QwtScaleDiv::TickType tickType, double length ) { if ( tickType < QwtScaleDiv::MinorTick || tickType > QwtScaleDiv::MajorTick ) { return; } if ( length < 0.0 ) length = 0.0; const double maxTickLen = 1000.0; if ( length > maxTickLen ) length = maxTickLen; d_data->tickLength[tickType] = length; } /*! Return the length of the ticks \sa setTickLength(), majTickLength() */ double QwtAbstractScaleDraw::tickLength( QwtScaleDiv::TickType tickType ) const { if ( tickType < QwtScaleDiv::MinorTick || tickType > QwtScaleDiv::MajorTick ) { return 0; } return d_data->tickLength[tickType]; } /*! The same as QwtAbstractScaleDraw::tickLength(QwtScaleDiv::MajorTick). */ double QwtAbstractScaleDraw::majTickLength() const { return d_data->tickLength[QwtScaleDiv::MajorTick]; } /*! \brief Convert a value into its representing label The value is converted to a plain text using QLocale::system().toString(value). This method is often overloaded by applications to have individual labels. \param value Value \return Label string. */ QwtText QwtAbstractScaleDraw::label( double value ) const { return QLocale::system().toString( value ); } /*! \brief Convert a value into its representing label and cache it. The conversion between value and label is called very often in the layout and painting code. Unfortunately the calculation of the label sizes might be slow (really slow for rich text in Qt4), so it's necessary to cache the labels. \param font Font \param value Value \return Tick label */ const QwtText &QwtAbstractScaleDraw::tickLabel( const QFont &font, double value ) const { QMap::const_iterator it = d_data->labelCache.find( value ); if ( it == d_data->labelCache.end() ) { QwtText lbl = label( value ); lbl.setRenderFlags( 0 ); lbl.setLayoutAttribute( QwtText::MinimumLayout ); ( void )lbl.textSize( font ); // initialize the internal cache it = d_data->labelCache.insert( value, lbl ); } return ( *it ); } /*! Invalidate the cache used by QwtAbstractScaleDraw::tickLabel The cache is invalidated, when a new QwtScaleDiv is set. If the labels need to be changed. while the same QwtScaleDiv is set, QwtAbstractScaleDraw::invalidateCache needs to be called manually. */ void QwtAbstractScaleDraw::invalidateCache() { d_data->labelCache.clear(); } starpu-1.1.5/starpu-top/qwt/qwt_knob.cpp0000644000373600000000000002770712571536557015264 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_knob.h" #include "qwt_round_scale_draw.h" #include "qwt_math.h" #include "qwt_painter.h" #include #include #include #include #include #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #define qFabs(x) ::fabs(x) #define qFastCos(x) ::cos(x) #define qFastSin(x) ::sin(x) #endif class QwtKnob::PrivateData { public: PrivateData() { angle = 0.0; nTurns = 0.0; borderWidth = 2; borderDist = 4; totalAngle = 270.0; scaleDist = 4; symbol = Line; maxScaleTicks = 11; knobWidth = 50; dotWidth = 8; } int borderWidth; int borderDist; int scaleDist; int maxScaleTicks; int knobWidth; int dotWidth; Symbol symbol; double angle; double totalAngle; double nTurns; QRect knobRect; // bounding rect of the knob without scale }; /*! Constructor \param parent Parent widget */ QwtKnob::QwtKnob( QWidget* parent ): QwtAbstractSlider( Qt::Horizontal, parent ) { initKnob(); } void QwtKnob::initKnob() { d_data = new PrivateData; setScaleDraw( new QwtRoundScaleDraw() ); setUpdateTime( 50 ); setTotalAngle( 270.0 ); recalcAngle(); setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ) ); setRange( 0.0, 10.0, 1.0 ); setValue( 0.0 ); } //! Destructor QwtKnob::~QwtKnob() { delete d_data; } /*! \brief Set the symbol of the knob \sa symbol() */ void QwtKnob::setSymbol( QwtKnob::Symbol s ) { if ( d_data->symbol != s ) { d_data->symbol = s; update(); } } /*! \return symbol of the knob \sa setSymbol() */ QwtKnob::Symbol QwtKnob::symbol() const { return d_data->symbol; } /*! \brief Set the total angle by which the knob can be turned \param angle Angle in degrees. The default angle is 270 degrees. It is possible to specify an angle of more than 360 degrees so that the knob can be turned several times around its axis. */ void QwtKnob::setTotalAngle ( double angle ) { if ( angle < 10.0 ) d_data->totalAngle = 10.0; else d_data->totalAngle = angle; scaleDraw()->setAngleRange( -0.5 * d_data->totalAngle, 0.5 * d_data->totalAngle ); layoutKnob(); } //! Return the total angle double QwtKnob::totalAngle() const { return d_data->totalAngle; } /*! Change the scale draw of the knob For changing the labels of the scales, it is necessary to derive from QwtRoundScaleDraw and overload QwtRoundScaleDraw::label(). \sa scaleDraw() */ void QwtKnob::setScaleDraw( QwtRoundScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); setTotalAngle( d_data->totalAngle ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ const QwtRoundScaleDraw *QwtKnob::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the knob \sa setScaleDraw() */ QwtRoundScaleDraw *QwtKnob::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! \brief Draw the knob \param painter painter \param r Bounding rectangle of the knob (without scale) */ void QwtKnob::drawKnob( QPainter *painter, const QRect &r ) { const QBrush buttonBrush = palette().brush( QPalette::Button ); const QColor buttonTextColor = palette().color( QPalette::ButtonText ); const QColor lightColor = palette().color( QPalette::Light ); const QColor darkColor = palette().color( QPalette::Dark ); const int bw2 = d_data->borderWidth / 2; const int radius = ( qMin( r.width(), r.height() ) - bw2 ) / 2; const QRect aRect( r.center().x() - radius, r.center().y() - radius, 2 * radius, 2 * radius ); // // draw button face // painter->setBrush( buttonBrush ); painter->drawEllipse( aRect ); // // draw button shades // QPen pn; pn.setWidth( d_data->borderWidth ); pn.setColor( lightColor ); painter->setPen( pn ); painter->drawArc( aRect, 45*16, 180*16 ); pn.setColor( darkColor ); painter->setPen( pn ); painter->drawArc( aRect, 225*16, 180*16 ); // // draw marker // if ( isValid() ) drawMarker( painter, d_data->angle, buttonTextColor ); } /*! \brief Notify change of value Sets the knob's value to the nearest multiple of the step size. */ void QwtKnob::valueChange() { recalcAngle(); update(); QwtAbstractSlider::valueChange(); } /*! \brief Determine the value corresponding to a specified position Called by QwtAbstractSlider \param p point */ double QwtKnob::getValue( const QPoint &p ) { const double dx = double( ( rect().x() + rect().width() / 2 ) - p.x() ); const double dy = double( ( rect().y() + rect().height() / 2 ) - p.y() ); const double arc = qAtan2( -dx, dy ) * 180.0 / M_PI; double newValue = 0.5 * ( minValue() + maxValue() ) + ( arc + d_data->nTurns * 360.0 ) * ( maxValue() - minValue() ) / d_data->totalAngle; const double oneTurn = qFabs( maxValue() - minValue() ) * 360.0 / d_data->totalAngle; const double eqValue = value() + mouseOffset(); if ( qFabs( newValue - eqValue ) > 0.5 * oneTurn ) { if ( newValue < eqValue ) newValue += oneTurn; else newValue -= oneTurn; } return newValue; } /*! \brief Set the scrolling mode and direction Called by QwtAbstractSlider \param p Point in question */ void QwtKnob::getScrollMode( const QPoint &p, int &scrollMode, int &direction ) { const int r = d_data->knobRect.width() / 2; const int dx = d_data->knobRect.x() + r - p.x(); const int dy = d_data->knobRect.y() + r - p.y(); if ( ( dx * dx ) + ( dy * dy ) <= ( r * r ) ) // point is inside the knob { scrollMode = ScrMouse; direction = 0; } else // point lies outside { scrollMode = ScrTimer; double arc = qAtan2( double( -dx ), double( dy ) ) * 180.0 / M_PI; if ( arc < d_data->angle ) direction = -1; else if ( arc > d_data->angle ) direction = 1; else direction = 0; } } /*! \brief Notify a change of the range Called by QwtAbstractSlider */ void QwtKnob::rangeChange() { if ( autoScale() ) rescale( minValue(), maxValue() ); layoutKnob(); recalcAngle(); } /*! Qt Resize Event */ void QwtKnob::resizeEvent( QResizeEvent * ) { layoutKnob( false ); } /*! Recalculate the knob's geometry and layout based on the current rect and fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtKnob::layoutKnob( bool update_geometry ) { const QRect r = rect(); const int radius = d_data->knobWidth / 2; d_data->knobRect.setWidth( 2 * radius ); d_data->knobRect.setHeight( 2 * radius ); d_data->knobRect.moveCenter( r.center() ); scaleDraw()->setRadius( radius + d_data->scaleDist ); scaleDraw()->moveCenter( r.center() ); if ( update_geometry ) { updateGeometry(); update(); } } /*! Repaint the knob \param e Paint event */ void QwtKnob::paintEvent( QPaintEvent *e ) { const QRect &ur = e->rect(); if ( ur.isValid() ) { QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing ); draw( &painter, ur ); } } /*! Repaint the knob \param painter Painter \param rect Update rectangle */ void QwtKnob::draw( QPainter *painter, const QRect& rect ) { if ( !d_data->knobRect.contains( rect ) ) // event from valueChange() scaleDraw()->draw( painter, palette() ); drawKnob( painter, d_data->knobRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( painter, this, rect ); } /*! \brief Draw the marker at the knob's front \param p Painter \param arc Angle of the marker \param c Marker color */ void QwtKnob::drawMarker( QPainter *p, double arc, const QColor &c ) { const double rarc = arc * M_PI / 180.0; const double ca = qFastCos( rarc ); const double sa = - qFastSin( rarc ); int radius = d_data->knobRect.width() / 2 - d_data->borderWidth; if ( radius < 3 ) radius = 3; const int ym = d_data->knobRect.y() + radius + d_data->borderWidth; const int xm = d_data->knobRect.x() + radius + d_data->borderWidth; switch ( d_data->symbol ) { case Dot: { p->setBrush( c ); p->setPen( Qt::NoPen ); const double rb = double( qMax( radius - 4 - d_data->dotWidth / 2, 0 ) ); p->drawEllipse( xm - qRound( sa * rb ) - d_data->dotWidth / 2, ym - qRound( ca * rb ) - d_data->dotWidth / 2, d_data->dotWidth, d_data->dotWidth ); break; } case Line: { p->setPen( QPen( c, 2 ) ); const double rb = qMax( double( ( radius - 4 ) / 3.0 ), 0.0 ); const double re = qMax( double( radius - 4 ), 0.0 ); p->drawLine ( xm - qRound( sa * rb ), ym - qRound( ca * rb ), xm - qRound( sa * re ), ym - qRound( ca * re ) ); break; } } } /*! \brief Change the knob's width. The specified width must be >= 5, or it will be clipped. \param w New width */ void QwtKnob::setKnobWidth( int w ) { d_data->knobWidth = qMax( w, 5 ); layoutKnob(); } //! Return the width of the knob int QwtKnob::knobWidth() const { return d_data->knobWidth; } /*! \brief Set the knob's border width \param bw new border width */ void QwtKnob::setBorderWidth( int bw ) { d_data->borderWidth = qMax( bw, 0 ); layoutKnob(); } //! Return the border width int QwtKnob::borderWidth() const { return d_data->borderWidth; } /*! \brief Recalculate the marker angle corresponding to the current value */ void QwtKnob::recalcAngle() { // // calculate the angle corresponding to the value // if ( maxValue() == minValue() ) { d_data->angle = 0; d_data->nTurns = 0; } else { d_data->angle = ( value() - 0.5 * ( minValue() + maxValue() ) ) / ( maxValue() - minValue() ) * d_data->totalAngle; d_data->nTurns = qFloor( ( d_data->angle + 180.0 ) / 360.0 ); d_data->angle = d_data->angle - d_data->nTurns * 360.0; } } /*! Recalculates the layout \sa layoutKnob() */ void QwtKnob::scaleChange() { layoutKnob(); } /*! Recalculates the layout \sa layoutKnob() */ void QwtKnob::fontChange( const QFont &f ) { QwtAbstractSlider::fontChange( f ); layoutKnob(); } /*! \return minimumSizeHint() */ QSize QwtKnob::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value of QwtKnob::minimumSizeHint() depends on the font and the scale. */ QSize QwtKnob::minimumSizeHint() const { // Add the scale radial thickness to the knobWidth const int sh = qCeil( scaleDraw()->extent( font() ) ); const int d = 2 * sh + 2 * d_data->scaleDist + d_data->knobWidth; return QSize( d, d ); } starpu-1.1.5/starpu-top/qwt/qwt_knob.h0000644000373600000000000000553312571536557014722 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_KNOB_H #define QWT_KNOB_H #include "qwt_global.h" #include "qwt_abstract_slider.h" #include "qwt_abstract_scale.h" class QwtRoundScaleDraw; /*! \brief The Knob Widget The QwtKnob widget imitates look and behaviour of a volume knob on a radio. It contains a scale around the knob which is set up automatically or can be configured manually (see QwtAbstractScale). Automatic scrolling is enabled when the user presses a mouse button on the scale. For a description of signals, slots and other members, see QwtAbstractSlider. \image html knob.png \sa QwtAbstractSlider and QwtAbstractScale for the descriptions of the inherited members. */ class QWT_EXPORT QwtKnob : public QwtAbstractSlider, public QwtAbstractScale { Q_OBJECT Q_ENUMS ( Symbol ) Q_PROPERTY( int knobWidth READ knobWidth WRITE setKnobWidth ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( double totalAngle READ totalAngle WRITE setTotalAngle ) Q_PROPERTY( Symbol symbol READ symbol WRITE setSymbol ) public: /*! Symbol \sa setSymbol() */ enum Symbol { Line, Dot }; explicit QwtKnob( QWidget* parent = NULL ); virtual ~QwtKnob(); void setKnobWidth( int w ); int knobWidth() const; void setTotalAngle ( double angle ); double totalAngle() const; void setBorderWidth( int bw ); int borderWidth() const; void setSymbol( Symbol ); Symbol symbol() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtRoundScaleDraw * ); const QwtRoundScaleDraw *scaleDraw() const; QwtRoundScaleDraw *scaleDraw(); protected: virtual void paintEvent( QPaintEvent *e ); virtual void resizeEvent( QResizeEvent *e ); void draw( QPainter *p, const QRect& ur ); void drawKnob( QPainter *p, const QRect &r ); void drawMarker( QPainter *p, double arc, const QColor &c ); private: void initKnob(); void layoutKnob( bool update = true ); double getValue( const QPoint &p ); void getScrollMode( const QPoint &p, int &scrollMode, int &direction ); void recalcAngle(); virtual void valueChange(); virtual void rangeChange(); virtual void scaleChange(); virtual void fontChange( const QFont &oldFont ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_canvas.cpp0000644000373600000000000002170312571536557016632 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_canvas.h" #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_plot.h" #include #include #include #include #ifdef Q_WS_X11 #include #endif #include class QwtPlotCanvas::PrivateData { public: PrivateData(): focusIndicator( NoFocusIndicator ), paintAttributes( 0 ), cache( NULL ) { } ~PrivateData() { delete cache; } FocusIndicator focusIndicator; int paintAttributes; QPixmap *cache; }; //! Sets a cross cursor, enables QwtPlotCanvas::PaintCached QwtPlotCanvas::QwtPlotCanvas( QwtPlot *plot ): QFrame( plot ) { d_data = new PrivateData; setAutoFillBackground( true ); #ifndef QT_NO_CURSOR setCursor( Qt::CrossCursor ); #endif setPaintAttribute( PaintCached, true ); setPaintAttribute( PaintPacked, true ); } //! Destructor QwtPlotCanvas::~QwtPlotCanvas() { delete d_data; } //! Return parent plot widget QwtPlot *QwtPlotCanvas::plot() { return qobject_cast( parentWidget() ); } //! Return parent plot widget const QwtPlot *QwtPlotCanvas::plot() const { return qobject_cast( parentWidget() ); } /*! \brief Changing the paint attributes \param attribute Paint attribute \param on On/Off The default setting enables PaintCached and PaintPacked \sa testPaintAttribute(), drawCanvas(), drawContents(), paintCache() */ void QwtPlotCanvas::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( bool( d_data->paintAttributes & attribute ) == on ) return; if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; switch ( attribute ) { case PaintCached: { if ( on ) { if ( d_data->cache == NULL ) d_data->cache = new QPixmap(); if ( isVisible() ) { const QRect cr = contentsRect(); *d_data->cache = QPixmap::grabWidget( this, cr.x(), cr.y(), cr.width(), cr.height() ); } } else { delete d_data->cache; d_data->cache = NULL; } break; } case PaintPacked: { /* If not visible, changing of the background mode is delayed until it becomes visible. This tries to avoid looking through the canvas when the canvas is shown the first time. */ if ( on == false || isVisible() ) QwtPlotCanvas::setSystemBackground( !on ); break; } } } /*! Test wether a paint attribute is enabled \param attribute Paint attribute \return true if the attribute is enabled \sa setPaintAttribute() */ bool QwtPlotCanvas::testPaintAttribute( PaintAttribute attribute ) const { return ( d_data->paintAttributes & attribute ) != 0; } //! Return the paint cache, might be null QPixmap *QwtPlotCanvas::paintCache() { return d_data->cache; } //! Return the paint cache, might be null const QPixmap *QwtPlotCanvas::paintCache() const { return d_data->cache; } //! Invalidate the internal paint cache void QwtPlotCanvas::invalidatePaintCache() { if ( d_data->cache ) *d_data->cache = QPixmap(); } /*! Set the focus indicator \sa FocusIndicator, focusIndicator() */ void QwtPlotCanvas::setFocusIndicator( FocusIndicator focusIndicator ) { d_data->focusIndicator = focusIndicator; } /*! \return Focus indicator \sa FocusIndicator, setFocusIndicator() */ QwtPlotCanvas::FocusIndicator QwtPlotCanvas::focusIndicator() const { return d_data->focusIndicator; } /*! Hide event \param event Hide event */ void QwtPlotCanvas::hideEvent( QHideEvent *event ) { QFrame::hideEvent( event ); if ( d_data->paintAttributes & PaintPacked ) { // enable system background to avoid the "looking through // the canvas" effect, for the next show setSystemBackground( true ); } } /*! Paint event \param event Paint event */ void QwtPlotCanvas::paintEvent( QPaintEvent *event ) { QPainter painter( this ); if ( !contentsRect().contains( event->rect() ) ) { painter.save(); painter.setClipRegion( event->region() & frameRect() ); drawFrame( &painter ); painter.restore(); } painter.setClipRegion( event->region() & contentsRect() ); drawContents( &painter ); if ( d_data->paintAttributes & PaintPacked ) setSystemBackground( false ); } /*! Redraw the canvas, and focus rect \param painter Painter */ void QwtPlotCanvas::drawContents( QPainter *painter ) { if ( d_data->paintAttributes & PaintCached && d_data->cache && d_data->cache->size() == contentsRect().size() ) { painter->drawPixmap( contentsRect().topLeft(), *d_data->cache ); } else { QwtPlot *plot = ( ( QwtPlot * )parent() ); const bool doAutoReplot = plot->autoReplot(); plot->setAutoReplot( false ); drawCanvas( painter ); plot->setAutoReplot( doAutoReplot ); } if ( hasFocus() && focusIndicator() == CanvasFocusIndicator ) drawFocusIndicator( painter ); } /*! Draw the the canvas Paints all plot items to the contentsRect(), using QwtPlot::drawCanvas and updates the paint cache. \param painter Painter \sa QwtPlot::drawCanvas(), setPaintAttributes(), testPaintAttributes() */ void QwtPlotCanvas::drawCanvas( QPainter *painter ) { if ( !contentsRect().isValid() ) return; QBrush bgBrush = palette().brush( backgroundRole() ); if ( d_data->paintAttributes & PaintCached && d_data->cache ) { *d_data->cache = QPixmap( contentsRect().size() ); #ifdef Q_WS_X11 if ( d_data->cache->x11Info().screen() != x11Info().screen() ) d_data->cache->x11SetScreen( x11Info().screen() ); #endif if ( d_data->paintAttributes & PaintPacked ) { QPainter bgPainter( d_data->cache ); bgPainter.setPen( Qt::NoPen ); bgPainter.setBrush( bgBrush ); bgPainter.drawRect( d_data->cache->rect() ); } else d_data->cache->fill( this, d_data->cache->rect().topLeft() ); QPainter cachePainter( d_data->cache ); cachePainter.translate( -contentsRect().x(), -contentsRect().y() ); ( ( QwtPlot * )parent() )->drawCanvas( &cachePainter ); cachePainter.end(); painter->drawPixmap( contentsRect(), *d_data->cache ); } else { if ( d_data->paintAttributes & PaintPacked ) { painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( bgBrush ); painter->drawRect( contentsRect() ); painter->restore(); } ( ( QwtPlot * )parent() )->drawCanvas( painter ); } } /*! Draw the focus indication \param painter Painter */ void QwtPlotCanvas::drawFocusIndicator( QPainter *painter ) { const int margin = 1; QRect focusRect = contentsRect(); focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin, focusRect.height() - 2 * margin ); QwtPainter::drawFocusRect( painter, this, focusRect ); } void QwtPlotCanvas::setSystemBackground( bool on ) { if ( testAttribute( Qt::WA_NoSystemBackground ) == on ) setAttribute( Qt::WA_NoSystemBackground, !on ); } /*! Invalidate the paint cache and repaint the canvas \sa invalidatePaintCache() */ void QwtPlotCanvas::replot() { invalidatePaintCache(); /* In case of cached or packed painting the canvas is repainted completely and doesn't need to be erased. */ const bool erase = !testPaintAttribute( QwtPlotCanvas::PaintPacked ) && !testPaintAttribute( QwtPlotCanvas::PaintCached ); const bool noBackgroundMode = testAttribute( Qt::WA_NoBackground ); if ( !erase && !noBackgroundMode ) setAttribute( Qt::WA_NoBackground, true ); repaint( contentsRect() ); if ( !erase && !noBackgroundMode ) setAttribute( Qt::WA_NoBackground, false ); } starpu-1.1.5/starpu-top/qwt/qwt_series_data.h0000644000373600000000000002512712571536557016255 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SERIES_DATA_H #define QWT_SERIES_DATA_H 1 #include "qwt_global.h" #include "qwt_interval.h" #include "qwt_point_3d.h" #include "qwt_point_polar.h" #include #include //! \brief A sample of the types (x1-x2, y) or (x, y1-y2) class QWT_EXPORT QwtIntervalSample { public: QwtIntervalSample(); QwtIntervalSample( double, const QwtInterval & ); QwtIntervalSample( double value, double min, double max ); bool operator==( const QwtIntervalSample & ) const; bool operator!=( const QwtIntervalSample & ) const; //! Value double value; //! Interval QwtInterval interval; }; /*! Constructor The value is set to 0.0, the interval is invalid */ inline QwtIntervalSample::QwtIntervalSample(): value( 0.0 ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, const QwtInterval &intv ): value( v ), interval( intv ) { } //! Constructor inline QwtIntervalSample::QwtIntervalSample( double v, double min, double max ): value( v ), interval( min, max ) { } //! Compare operator inline bool QwtIntervalSample::operator==( const QwtIntervalSample &other ) const { return value == other.value && interval == other.interval; } //! Compare operator inline bool QwtIntervalSample::operator!=( const QwtIntervalSample &other ) const { return !( *this == other ); } //! \brief A sample of the types (x1...xn, y) or (x, y1..yn) class QWT_EXPORT QwtSetSample { public: QwtSetSample(); bool operator==( const QwtSetSample &other ) const; bool operator!=( const QwtSetSample &other ) const; //! value double value; //! Vector of values associated to value QVector set; }; /*! Constructor The value is set to 0.0 */ inline QwtSetSample::QwtSetSample(): value( 0.0 ) { } //! Compare operator inline bool QwtSetSample::operator==( const QwtSetSample &other ) const { return value == other.value && set == other.set; } //! Compare operator inline bool QwtSetSample::operator!=( const QwtSetSample &other ) const { return !( *this == other ); } /*! \brief Abstract interface for iterating over samples Qwt offers several implementations of the QwtSeriesData API, but in situations, where data of an application specific format needs to be displayed, without having to copy it, it is recommended to implement an individual data access. */ template class QwtSeriesData { public: QwtSeriesData(); virtual ~QwtSeriesData(); //! \return Number of samples virtual size_t size() const = 0; /*! Return a sample \param i Index \return Sample at position i */ virtual T sample( size_t i ) const = 0; /*! Calculate the bounding rect of all samples The bounding rect is necessary for autoscaling and can be used for a couple of painting optimizations. qwtBoundingRect(...) offers slow implementations iterating over the samples. For large sets it is recommended to implement something faster f.e. by caching the bounding rect. */ virtual QRectF boundingRect() const = 0; virtual void setRectOfInterest( const QRectF & ); protected: //! Can be used to cache a calculated bounding rectangle mutable QRectF d_boundingRect; private: QwtSeriesData &operator=( const QwtSeriesData & ); }; //! Constructor template QwtSeriesData::QwtSeriesData(): d_boundingRect( 0.0, 0.0, -1.0, -1.0 ) { } //! Destructor template QwtSeriesData::~QwtSeriesData() { } /*! Set a the "rect of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). It can be used to implement different levels of details. The default implementation does nothing. */ template void QwtSeriesData::setRectOfInterest( const QRectF & ) { } /*! \brief Template class for data, that is organized as QVector QVector uses implicit data sharing and can be passed around as argument efficiently. */ template class QwtArraySeriesData: public QwtSeriesData { public: QwtArraySeriesData(); QwtArraySeriesData( const QVector & ); void setSamples( const QVector & ); const QVector samples() const; virtual size_t size() const; virtual T sample( size_t ) const; protected: //! Vector of samples QVector d_samples; }; //! Constructor template QwtArraySeriesData::QwtArraySeriesData() { } /*! Constructor \param samples Array of samples */ template QwtArraySeriesData::QwtArraySeriesData( const QVector &samples ): d_samples( samples ) { } /*! Assign an array of samples \param samples Array of samples */ template void QwtArraySeriesData::setSamples( const QVector &samples ) { QwtSeriesData::d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 ); d_samples = samples; } //! \return Array of samples template const QVector QwtArraySeriesData::samples() const { return d_samples; } //! \return Number of samples template size_t QwtArraySeriesData::size() const { return d_samples.size(); } /*! Return a sample \param i Index \return Sample at position i */ template T QwtArraySeriesData::sample( size_t i ) const { return d_samples[i]; } //! Interface for iterating over an array of points class QWT_EXPORT QwtPointSeriesData: public QwtArraySeriesData { public: QwtPointSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of 3D points class QWT_EXPORT QwtPoint3DSeriesData: public QwtArraySeriesData { public: QwtPoint3DSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of intervals class QWT_EXPORT QwtIntervalSeriesData: public QwtArraySeriesData { public: QwtIntervalSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; //! Interface for iterating over an array of samples class QWT_EXPORT QwtSetSeriesData: public QwtArraySeriesData { public: QwtSetSeriesData( const QVector & = QVector() ); virtual QRectF boundingRect() const; }; /*! \brief Interface for iterating over two QVector objects. */ class QWT_EXPORT QwtPointArrayData: public QwtSeriesData { public: QwtPointArrayData( const QVector &x, const QVector &y ); QwtPointArrayData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const QVector &xData() const; const QVector &yData() const; private: QVector d_x; QVector d_y; }; /*! \brief Data class containing two pointers to memory blocks of doubles. */ class QWT_EXPORT QwtCPointerData: public QwtSeriesData { public: QwtCPointerData( const double *x, const double *y, size_t size ); virtual QRectF boundingRect() const; virtual size_t size() const; virtual QPointF sample( size_t i ) const; const double *xData() const; const double *yData() const; private: const double *d_x; const double *d_y; size_t d_size; }; /*! \brief Synthetic point data QwtSyntheticPointData provides a fixed number of points for an interval. The points are calculated in equidistant steps in x-direction. If the interval is invalid, the points are calculated for the "rect of interest", what normally is the displayed area on the plot canvas. In this mode you get different levels of detail, when zooming in/out. \par Example The following example shows how to implement a sinus curve. \verbatim #include #include #include #include #include class SinusData: public QwtSyntheticPointData { public: SinusData(): QwtSyntheticPointData(100) { } virtual double y(double x) const { return qSin(x); } }; int main(int argc, char **argv) { QApplication a(argc, argv); QwtPlot plot; plot.setAxisScale(QwtPlot::xBottom, 0.0, 10.0); plot.setAxisScale(QwtPlot::yLeft, -1.0, 1.0); QwtPlotCurve *curve = new QwtPlotCurve("y = sin(x)"); curve->setData(SinusData()); curve->attach(&plot); plot.show(); return a.exec(); } \endverbatim */ class QWT_EXPORT QwtSyntheticPointData: public QwtSeriesData { public: QwtSyntheticPointData( size_t size, const QwtInterval & = QwtInterval() ); void setSize( size_t size ); size_t size() const; void setInterval( const QwtInterval& ); QwtInterval interval() const; virtual QRectF boundingRect() const; virtual QPointF sample( size_t i ) const; /*! Calculate a y value for a x value \param x x value \return Corresponding y value */ virtual double y( double x ) const = 0; virtual double x( uint index ) const; virtual void setRectOfInterest( const QRectF & ); QRectF rectOfInterest() const; private: size_t d_size; QwtInterval d_interval; QRectF d_rectOfInterest; QwtInterval d_intervalOfInterest; }; QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); QWT_EXPORT QRectF qwtBoundingRect( const QwtSeriesData & ); #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_seriesitem.h0000644000373600000000000001214612571536560017170 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_SERIES_ITEM_H #define QWT_PLOT_SERIES_ITEM_H #include "qwt_global.h" #include "qwt_plot_item.h" #include "qwt_scale_div.h" #include "qwt_series_data.h" /*! \brief Base class for plot items reprsenting a series of samples */ class QWT_EXPORT QwtPlotAbstractSeriesItem: public QwtPlotItem { public: explicit QwtPlotAbstractSeriesItem( const QString &title = QString::null ); explicit QwtPlotAbstractSeriesItem( const QwtText &title ); virtual ~QwtPlotAbstractSeriesItem(); void setOrientation( Qt::Orientation ); Qt::Orientation orientation() const; virtual void draw( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF & ) const; /*! Draw a subset of the samples \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas \param from Index of the first point to be painted \param to Index of the last point to be painted. If to < 0 the curve will be painted to its last point. */ virtual void drawSeries( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const = 0; private: class PrivateData; PrivateData *d_data; }; /*! \brief Class template for plot items reprsenting a series of samples */ template class QwtPlotSeriesItem: public QwtPlotAbstractSeriesItem { public: explicit QwtPlotSeriesItem( const QString &title = QString::null ); explicit QwtPlotSeriesItem( const QwtText &title ); virtual ~QwtPlotSeriesItem(); void setData( QwtSeriesData * ); QwtSeriesData *data(); const QwtSeriesData *data() const; size_t dataSize() const; T sample( int i ) const; virtual QRectF boundingRect() const; virtual void updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & ); protected: //! Series QwtSeriesData *d_series; }; /*! Constructor \param title Title of the series item */ template QwtPlotSeriesItem::QwtPlotSeriesItem( const QString &title ): QwtPlotAbstractSeriesItem( QwtText( title ) ), d_series( NULL ) { } /*! Constructor \param title Title of the series item */ template QwtPlotSeriesItem::QwtPlotSeriesItem( const QwtText &title ): QwtPlotAbstractSeriesItem( title ), d_series( NULL ) { } //! Destructor template QwtPlotSeriesItem::~QwtPlotSeriesItem() { delete d_series; } //! \return the the curve data template inline QwtSeriesData *QwtPlotSeriesItem::data() { return d_series; } //! \return the the curve data template inline const QwtSeriesData *QwtPlotSeriesItem::data() const { return d_series; } /*! \param index Index \return Sample at position index */ template inline T QwtPlotSeriesItem::sample( int index ) const { return d_series ? d_series->sample( index ) : T(); } /*! Assign a series of samples \param data Data \warning The item takes ownership of the data object, deleting it when its not used anymore. */ template void QwtPlotSeriesItem::setData( QwtSeriesData *data ) { if ( d_series != data ) { delete d_series; d_series = data; itemChanged(); } } /*! Return the size of the data arrays \sa setData() */ template size_t QwtPlotSeriesItem::dataSize() const { if ( d_series == NULL ) return 0; return d_series->size(); } /*! \return Bounding rectangle of the data. If there is no bounding rect, like for empty data the rectangle is invalid. \sa QwtSeriesData::boundingRect(), QRectF::isValid() */ template QRectF QwtPlotSeriesItem::boundingRect() const { if ( d_series == NULL ) return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid return d_series->boundingRect(); } /*! Update the rect of interest according to the current scale ranges \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtSeriesData::setRectOfInterest() */ template void QwtPlotSeriesItem::updateScaleDiv( const QwtScaleDiv &xScaleDiv, const QwtScaleDiv &yScaleDiv ) { const QRectF rect = QRectF( xScaleDiv.lowerBound(), yScaleDiv.lowerBound(), xScaleDiv.range(), yScaleDiv.range() ); d_series->setRectOfInterest( rect ); } #endif starpu-1.1.5/starpu-top/qwt/qwt_scale_div.cpp0000644000373600000000000001000712571536557016245 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_div.h" #include "qwt_math.h" #include "qwt_interval.h" #include //! Construct an invalid QwtScaleDiv instance. QwtScaleDiv::QwtScaleDiv(): d_lowerBound( 0.0 ), d_upperBound( 0.0 ), d_isValid( false ) { } /*! Construct QwtScaleDiv instance. \param interval Interval \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( const QwtInterval &interval, QList ticks[NTickTypes] ): d_lowerBound( interval.minValue() ), d_upperBound( interval.maxValue() ), d_isValid( true ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Construct QwtScaleDiv instance. \param lowerBound First interval limit \param upperBound Second interval limit \param ticks List of major, medium and minor ticks */ QwtScaleDiv::QwtScaleDiv( double lowerBound, double upperBound, QList ticks[NTickTypes] ): d_lowerBound( lowerBound ), d_upperBound( upperBound ), d_isValid( true ) { for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i] = ticks[i]; } /*! Change the interval \param interval Interval */ void QwtScaleDiv::setInterval( const QwtInterval &interval ) { setInterval( interval.minValue(), interval.maxValue() ); } /*! \brief Equality operator \return true if this instance is equal to other */ bool QwtScaleDiv::operator==( const QwtScaleDiv &other ) const { if ( d_lowerBound != other.d_lowerBound || d_upperBound != other.d_upperBound || d_isValid != other.d_isValid ) { return false; } for ( int i = 0; i < NTickTypes; i++ ) { if ( d_ticks[i] != other.d_ticks[i] ) return false; } return true; } /*! \brief Inequality \return true if this instance is not equal to s */ bool QwtScaleDiv::operator!=( const QwtScaleDiv &s ) const { return ( !( *this == s ) ); } //! Invalidate the scale division void QwtScaleDiv::invalidate() { d_isValid = false; // detach arrays for ( int i = 0; i < NTickTypes; i++ ) d_ticks[i].clear(); d_lowerBound = d_upperBound = 0; } //! Check if the scale division is valid bool QwtScaleDiv::isValid() const { return d_isValid; } /*! Return if a value is between lowerBound() and upperBound() \param value Value \return true/false */ bool QwtScaleDiv::contains( double value ) const { if ( !d_isValid ) return false; const double min = qMin( d_lowerBound, d_upperBound ); const double max = qMax( d_lowerBound, d_upperBound ); return value >= min && value <= max; } //! Invert the scale divison void QwtScaleDiv::invert() { qSwap( d_lowerBound, d_upperBound ); for ( int i = 0; i < NTickTypes; i++ ) { QList& ticks = d_ticks[i]; const int size = ticks.count(); const int size2 = size / 2; for ( int i = 0; i < size2; i++ ) qSwap( ticks[i], ticks[size - 1 - i] ); } } /*! Assign ticks \param type MinorTick, MediumTick or MajorTick \param ticks Values of the tick positions */ void QwtScaleDiv::setTicks( int type, const QList &ticks ) { if ( type >= 0 || type < NTickTypes ) d_ticks[type] = ticks; } /*! Return a list of ticks \param type MinorTick, MediumTick or MajorTick */ const QList &QwtScaleDiv::ticks( int type ) const { if ( type >= 0 || type < NTickTypes ) return d_ticks[type]; static QList noTicks; return noTicks; } starpu-1.1.5/starpu-top/qwt/qwt_scale_engine.cpp0000644000373600000000000006021712571536557016740 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_engine.h" #include "qwt_math.h" #include "qwt_scale_map.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qExp(x) ::exp(x) #endif static const double _eps = 1.0e-6; /*! Ceil a value, relative to an interval \param value Value to ceil \param intervalSize Interval size \sa floorEps() */ double QwtScaleArithmetic::ceilEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value - eps ) / intervalSize; return qCeil( value ) * intervalSize; } /*! Floor a value, relative to an interval \param value Value to floor \param intervalSize Interval size \sa floorEps() */ double QwtScaleArithmetic::floorEps( double value, double intervalSize ) { const double eps = _eps * intervalSize; value = ( value + eps ) / intervalSize; return qFloor( value ) * intervalSize; } /*! \brief Divide an interval into steps \f$stepSize = (intervalSize - intervalSize * 10e^{-6}) / numSteps\f$ \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleArithmetic::divideEps( double intervalSize, double numSteps ) { if ( numSteps == 0.0 || intervalSize == 0.0 ) return 0.0; return ( intervalSize - ( _eps * intervalSize ) ) / numSteps; } /*! Find the smallest value out of {1,2,5}*10^n with an integer number n which is greater than or equal to x \param x Input value */ double QwtScaleArithmetic::ceil125( double x ) { if ( x == 0.0 ) return 0.0; const double sign = ( x > 0 ) ? 1.0 : -1.0; const double lx = ::log10( qFabs( x ) ); const double p10 = qFloor( lx ); double fr = qPow( 10.0, lx - p10 ); if ( fr <= 1.0 ) fr = 1.0; else if ( fr <= 2.0 ) fr = 2.0; else if ( fr <= 5.0 ) fr = 5.0; else fr = 10.0; return sign * fr * qPow( 10.0, p10 ); } /*! \brief Find the largest value out of {1,2,5}*10^n with an integer number n which is smaller than or equal to x \param x Input value */ double QwtScaleArithmetic::floor125( double x ) { if ( x == 0.0 ) return 0.0; double sign = ( x > 0 ) ? 1.0 : -1.0; const double lx = ::log10( qFabs( x ) ); const double p10 = qFloor( lx ); double fr = qPow( 10.0, lx - p10 ); if ( fr >= 10.0 ) fr = 10.0; else if ( fr >= 5.0 ) fr = 5.0; else if ( fr >= 2.0 ) fr = 2.0; else fr = 1.0; return sign * fr * qPow( 10.0, p10 ); } class QwtScaleEngine::PrivateData { public: PrivateData(): attributes( QwtScaleEngine::NoAttribute ), lowerMargin( 0.0 ), upperMargin( 0.0 ), referenceValue( 0.0 ) { } int attributes; // scale attributes double lowerMargin; // margins double upperMargin; double referenceValue; // reference value }; //! Constructor QwtScaleEngine::QwtScaleEngine() { d_data = new PrivateData; } //! Destructor QwtScaleEngine::~QwtScaleEngine () { delete d_data; } /*! \return the margin at the lower end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::lowerMargin() const { return d_data->lowerMargin; } /*! \return the margin at the upper end of the scale The default margin is 0. \sa setMargins() */ double QwtScaleEngine::upperMargin() const { return d_data->upperMargin; } /*! \brief Specify margins at the scale's endpoints \param lower minimum distance between the scale's lower boundary and the smallest enclosed value \param upper minimum distance between the scale's upper boundary and the greatest enclosed value Margins can be used to leave a minimum amount of space between the enclosed intervals and the boundaries of the scale. \warning \li QwtLog10ScaleEngine measures the margins in decades. \sa upperMargin(), lowerMargin() */ void QwtScaleEngine::setMargins( double lower, double upper ) { d_data->lowerMargin = qMax( lower, 0.0 ); d_data->upperMargin = qMax( upper, 0.0 ); } /*! Calculate a step size for an interval size \param intervalSize Interval size \param numSteps Number of steps \return Step size */ double QwtScaleEngine::divideInterval( double intervalSize, int numSteps ) const { if ( numSteps <= 0 ) return 0.0; double v = QwtScaleArithmetic::divideEps( intervalSize, numSteps ); return QwtScaleArithmetic::ceil125( v ); } /*! Check if an interval "contains" a value \param interval Interval \param value Value \sa QwtScaleArithmetic::compareEps() */ bool QwtScaleEngine::contains( const QwtInterval &interval, double value ) const { if ( !interval.isValid() ) return false; if ( qwtFuzzyCompare( value, interval.minValue(), interval.width() ) < 0 ) return false; if ( qwtFuzzyCompare( value, interval.maxValue(), interval.width() ) > 0 ) return false; return true; } /*! Remove ticks from a list, that are not inside an interval \param ticks Tick list \param interval Interval \return Stripped tick list */ QList QwtScaleEngine::strip( const QList& ticks, const QwtInterval &interval ) const { if ( !interval.isValid() || ticks.count() == 0 ) return QList(); if ( contains( interval, ticks.first() ) && contains( interval, ticks.last() ) ) { return ticks; } QList strippedTicks; for ( int i = 0; i < ( int )ticks.count(); i++ ) { if ( contains( interval, ticks[i] ) ) strippedTicks += ticks[i]; } return strippedTicks; } /*! \brief Build an interval for a value In case of v == 0.0 the interval is [-0.5, 0.5], otherwide it is [0.5 * v, 1.5 * v] */ QwtInterval QwtScaleEngine::buildInterval( double v ) const { const double delta = ( v == 0.0 ) ? 0.5 : qAbs( 0.5 * v ); return QwtInterval( v - delta, v + delta ); } /*! Change a scale attribute \param attribute Attribute to change \param on On/Off \sa Attribute, testAttribute() */ void QwtScaleEngine::setAttribute( Attribute attribute, bool on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ( ~attribute ); } /*! Check if a attribute is set. \param attribute Attribute to be tested \sa Attribute, setAttribute() */ bool QwtScaleEngine::testAttribute( Attribute attribute ) const { return bool( d_data->attributes & attribute ); } /*! Change the scale attribute \param attributes Set scale attributes \sa Attribute, attributes() */ void QwtScaleEngine::setAttributes( int attributes ) { d_data->attributes = attributes; } /*! Return the scale attributes \sa Attribute, setAttributes(), testAttribute() */ int QwtScaleEngine::attributes() const { return d_data->attributes; } /*! \brief Specify a reference point \param r new reference value The reference point is needed if options IncludeReference or Symmetric are active. Its default value is 0.0. \sa Attribute */ void QwtScaleEngine::setReference( double r ) { d_data->referenceValue = r; } /*! \return the reference value \sa setReference(), setAttribute() */ double QwtScaleEngine::reference() const { return d_data->referenceValue; } /*! Return a transformation, for linear scales */ QwtScaleTransformation *QwtLinearScaleEngine::transformation() const { return new QwtScaleTransformation( QwtScaleTransformation::Linear ); } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa setAttribute() */ void QwtLinearScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { QwtInterval interval( x1, x2 ); interval = interval.normalized(); interval.setMinValue( interval.minValue() - lowerMargin() ); interval.setMaxValue( interval.maxValue() + upperMargin() ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) interval = interval.symmetrize( reference() ); if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( reference() ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = divideInterval( interval.width(), qMax( maxNumSteps, 1 ) ); if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajSteps Maximum for the number of major steps \param maxMinSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the scaleEngine calculates one. \sa QwtScaleEngine::stepSize(), QwtScaleEngine::subDivide() */ QwtScaleDiv QwtLinearScaleEngine::divideScale( double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); if ( interval.width() <= 0 ) return QwtScaleDiv(); stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajSteps < 1 ) maxMajSteps = 1; stepSize = divideInterval( interval.width(), maxMajSteps ); } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param stepSize Step size \param maxMinSteps Maximum number of minor steps \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLinearScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinSteps > 0 ) { buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinSteps, stepSize, ticks[QwtScaleDiv::MinorTick], ticks[QwtScaleDiv::MediumTick] ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) { ticks[i] = strip( ticks[i], interval ); // ticks very close to 0.0 are // explicitely set to 0.0 for ( int j = 0; j < ( int )ticks[i].count(); j++ ) { if ( qwtFuzzyCompare( ticks[i][j], 0.0, stepSize ) == 0 ) ticks[i][j] = 0.0; } } } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLinearScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { int numTicks = qRound( interval.width() / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks - 1; i++ ) ticks += interval.minValue() + i * stepSize; ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinSteps Maximum number of minor steps \param stepSize Step size \param minorTicks Array to be filled with the calculated minor ticks \param mediumTicks Array to be filled with the calculated medium ticks */ void QwtLinearScaleEngine::buildMinorTicks( const QList& majorTicks, int maxMinSteps, double stepSize, QList &minorTicks, QList &mediumTicks ) const { double minStep = divideInterval( stepSize, maxMinSteps ); if ( minStep == 0.0 ) return; // # ticks per interval int numTicks = qCeil( qAbs( stepSize / minStep ) ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( numTicks + 1 ) * qAbs( minStep ), qAbs( stepSize ), stepSize ) > 0 ) { numTicks = 1; minStep = stepSize * 0.5; } int medIndex = -1; if ( numTicks % 2 ) medIndex = numTicks / 2; // calculate minor ticks for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { double val = majorTicks[i]; for ( int k = 0; k < numTicks; k++ ) { val += minStep; double alignedValue = val; if ( qwtFuzzyCompare( val, 0.0, stepSize ) == 0 ) alignedValue = 0.0; if ( k == medIndex ) mediumTicks += alignedValue; else minorTicks += alignedValue; } } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLinearScaleEngine::align( const QwtInterval &interval, double stepSize ) const { double x1 = QwtScaleArithmetic::floorEps( interval.minValue(), stepSize ); if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 ) x1 = interval.minValue(); double x2 = QwtScaleArithmetic::ceilEps( interval.maxValue(), stepSize ); if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 ) x2 = interval.maxValue(); return QwtInterval( x1, x2 ); } /*! Return a transformation, for logarithmic (base 10) scales */ QwtScaleTransformation *QwtLog10ScaleEngine::transformation() const { return new QwtScaleTransformation( QwtScaleTransformation::Log10 ); } /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Out) \sa QwtScaleEngine::setAttribute() */ void QwtLog10ScaleEngine::autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const { if ( x1 > x2 ) qSwap( x1, x2 ); QwtInterval interval( x1 / qPow( 10.0, lowerMargin() ), x2 * qPow( 10.0, upperMargin() ) ); if ( interval.maxValue() / interval.minValue() < 10.0 ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); linearScaler.autoScale( maxNumSteps, x1, x2, stepSize ); stepSize = ::log10( stepSize ); return; } double logRef = 1.0; if ( reference() > LOG_MIN / 2 ) logRef = qMin( reference(), LOG_MAX / 2 ); if ( testAttribute( QwtScaleEngine::Symmetric ) ) { const double delta = qMax( interval.maxValue() / logRef, logRef / interval.minValue() ); interval.setInterval( logRef / delta, logRef * delta ); } if ( testAttribute( QwtScaleEngine::IncludeReference ) ) interval = interval.extend( logRef ); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() == 0.0 ) interval = buildInterval( interval.minValue() ); stepSize = divideInterval( log10( interval ).width(), qMax( maxNumSteps, 1 ) ); if ( stepSize < 1.0 ) stepSize = 1.0; if ( !testAttribute( QwtScaleEngine::Floating ) ) interval = align( interval, stepSize ); x1 = interval.minValue(); x2 = interval.maxValue(); if ( testAttribute( QwtScaleEngine::Inverted ) ) { qSwap( x1, x2 ); stepSize = -stepSize; } } /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajSteps Maximum for the number of major steps \param maxMinSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0, the scaleEngine calculates one. \sa QwtScaleEngine::stepSize(), QwtLog10ScaleEngine::subDivide() */ QwtScaleDiv QwtLog10ScaleEngine::divideScale( double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize ) const { QwtInterval interval = QwtInterval( x1, x2 ).normalized(); interval = interval.limited( LOG_MIN, LOG_MAX ); if ( interval.width() <= 0 ) return QwtScaleDiv(); if ( interval.maxValue() / interval.minValue() < 10.0 ) { // scale width is less than one decade -> build linear scale QwtLinearScaleEngine linearScaler; linearScaler.setAttributes( attributes() ); linearScaler.setReference( reference() ); linearScaler.setMargins( lowerMargin(), upperMargin() ); if ( stepSize != 0.0 ) stepSize = qPow( 10.0, stepSize ); return linearScaler.divideScale( x1, x2, maxMajSteps, maxMinSteps, stepSize ); } stepSize = qAbs( stepSize ); if ( stepSize == 0.0 ) { if ( maxMajSteps < 1 ) maxMajSteps = 1; stepSize = divideInterval( log10( interval ).width(), maxMajSteps ); if ( stepSize < 1.0 ) stepSize = 1.0; // major step must be >= 1 decade } QwtScaleDiv scaleDiv; if ( stepSize != 0.0 ) { QList ticks[QwtScaleDiv::NTickTypes]; buildTicks( interval, stepSize, maxMinSteps, ticks ); scaleDiv = QwtScaleDiv( interval, ticks ); } if ( x1 > x2 ) scaleDiv.invert(); return scaleDiv; } /*! \brief Calculate ticks for an interval \param interval Interval \param maxMinSteps Maximum number of minor steps \param stepSize Step size \param ticks Arrays to be filled with the calculated ticks \sa buildMajorTicks(), buildMinorTicks */ void QwtLog10ScaleEngine::buildTicks( const QwtInterval& interval, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const { const QwtInterval boundingInterval = align( interval, stepSize ); ticks[QwtScaleDiv::MajorTick] = buildMajorTicks( boundingInterval, stepSize ); if ( maxMinSteps > 0 ) { ticks[QwtScaleDiv::MinorTick] = buildMinorTicks( ticks[QwtScaleDiv::MajorTick], maxMinSteps, stepSize ); } for ( int i = 0; i < QwtScaleDiv::NTickTypes; i++ ) ticks[i] = strip( ticks[i], interval ); } /*! \brief Calculate major ticks for an interval \param interval Interval \param stepSize Step size \return Calculated ticks */ QList QwtLog10ScaleEngine::buildMajorTicks( const QwtInterval &interval, double stepSize ) const { double width = log10( interval ).width(); int numTicks = qRound( width / stepSize ) + 1; if ( numTicks > 10000 ) numTicks = 10000; const double lxmin = ::log( interval.minValue() ); const double lxmax = ::log( interval.maxValue() ); const double lstep = ( lxmax - lxmin ) / double( numTicks - 1 ); QList ticks; ticks += interval.minValue(); for ( int i = 1; i < numTicks; i++ ) ticks += qExp( lxmin + double( i ) * lstep ); ticks += interval.maxValue(); return ticks; } /*! \brief Calculate minor/medium ticks for major ticks \param majorTicks Major ticks \param maxMinSteps Maximum number of minor steps \param stepSize Step size */ QList QwtLog10ScaleEngine::buildMinorTicks( const QList &majorTicks, int maxMinSteps, double stepSize ) const { if ( stepSize < 1.1 ) // major step width is one decade { if ( maxMinSteps < 1 ) return QList(); int k0, kstep, kmax; if ( maxMinSteps >= 8 ) { k0 = 2; kmax = 9; kstep = 1; } else if ( maxMinSteps >= 4 ) { k0 = 2; kmax = 8; kstep = 2; } else if ( maxMinSteps >= 2 ) { k0 = 2; kmax = 5; kstep = 3; } else { k0 = 5; kmax = 5; kstep = 1; } QList minorTicks; for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { const double v = majorTicks[i]; for ( int k = k0; k <= kmax; k += kstep ) minorTicks += v * double( k ); } return minorTicks; } else // major step > one decade { double minStep = divideInterval( stepSize, maxMinSteps ); if ( minStep == 0.0 ) return QList(); if ( minStep < 1.0 ) minStep = 1.0; // # subticks per interval int nMin = qRound( stepSize / minStep ) - 1; // Do the minor steps fit into the interval? if ( qwtFuzzyCompare( ( nMin + 1 ) * minStep, qAbs( stepSize ), stepSize ) > 0 ) { nMin = 0; } if ( nMin < 1 ) return QList(); // no subticks // substep factor = 10^substeps const qreal minFactor = qMax( qPow( 10.0, minStep ), qreal( 10.0 ) ); QList minorTicks; for ( int i = 0; i < ( int )majorTicks.count(); i++ ) { double val = majorTicks[i]; for ( int k = 0; k < nMin; k++ ) { val *= minFactor; minorTicks += val; } } return minorTicks; } } /*! \brief Align an interval to a step size The limits of an interval are aligned that both are integer multiples of the step size. \param interval Interval \param stepSize Step size \return Aligned interval */ QwtInterval QwtLog10ScaleEngine::align( const QwtInterval &interval, double stepSize ) const { const QwtInterval intv = log10( interval ); double x1 = QwtScaleArithmetic::floorEps( intv.minValue(), stepSize ); if ( qwtFuzzyCompare( interval.minValue(), x1, stepSize ) == 0 ) x1 = interval.minValue(); double x2 = QwtScaleArithmetic::ceilEps( intv.maxValue(), stepSize ); if ( qwtFuzzyCompare( interval.maxValue(), x2, stepSize ) == 0 ) x2 = interval.maxValue(); return pow10( QwtInterval( x1, x2 ) ); } /*! Return the interval [log10(interval.minValue(), log10(interval.maxValue] */ QwtInterval QwtLog10ScaleEngine::log10( const QwtInterval &interval ) const { return QwtInterval( ::log10( interval.minValue() ), ::log10( interval.maxValue() ) ); } /*! Return the interval [pow10(interval.minValue(), pow10(interval.maxValue] */ QwtInterval QwtLog10ScaleEngine::pow10( const QwtInterval &interval ) const { return QwtInterval( qPow( 10.0, interval.minValue() ), qPow( 10.0, interval.maxValue() ) ); } starpu-1.1.5/starpu-top/qwt/qwt_plot_dict.h0000644000373600000000000000303412571536557015744 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file !*/ #ifndef QWT_PLOT_DICT #define QWT_PLOT_DICT #include "qwt_global.h" #include "qwt_plot_item.h" #include /// \var typedef QList< QwtPlotItem *> QwtPlotItemList /// \brief See QT 4.x assistant documentation for QList typedef QList QwtPlotItemList; typedef QList::ConstIterator QwtPlotItemIterator; /*! \brief A dictionary for plot items QwtPlotDict organizes plot items in increasing z-order. If autoDelete() is enabled, all attached items will be deleted in the destructor of the dictionary. \sa QwtPlotItem::attach(), QwtPlotItem::detach(), QwtPlotItem::z() */ class QWT_EXPORT QwtPlotDict { public: explicit QwtPlotDict(); virtual ~QwtPlotDict(); void setAutoDelete( bool ); bool autoDelete() const; const QwtPlotItemList& itemList() const; QwtPlotItemList itemList( int rtti ) const; void detachItems( int rtti = QwtPlotItem::Rtti_PlotItem, bool autoDelete = true ); private: friend class QwtPlotItem; void attachItem( QwtPlotItem *, bool ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_spline.h0000644000373600000000000000464712571536557015270 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SPLINE_H #define QWT_SPLINE_H #include "qwt_global.h" #include #include /*! \brief A class for spline interpolation The QwtSpline class is used for cubical spline interpolation. Two types of splines, natural and periodic, are supported. \par Usage:
  1. First call setPoints() to determine the spline coefficients for a tabulated function y(x).
  2. After the coefficients have been set up, the interpolated function value for an argument x can be determined by calling QwtSpline::value().
\par Example: \code #include QPolygonF interpolate(const QPolygonF& points, int numValues) { QwtSpline spline; if ( !spline.setPoints(points) ) return points; QPolygonF interpolatedPoints(numValues); const double delta = (points[numPoints - 1].x() - points[0].x()) / (points.size() - 1); for(i = 0; i < points.size(); i++) / interpolate { const double x = points[0].x() + i * delta; interpolatedPoints[i].setX(x); interpolatedPoints[i].setY(spline.value(x)); } return interpolatedPoints; } \endcode */ class QWT_EXPORT QwtSpline { public: //! Spline type enum SplineType { Natural, Periodic }; QwtSpline(); QwtSpline( const QwtSpline & ); ~QwtSpline(); QwtSpline &operator=( const QwtSpline & ); void setSplineType( SplineType ); SplineType splineType() const; bool setPoints( const QPolygonF& points ); QPolygonF points() const; void reset(); bool isValid() const; double value( double x ) const; const QVector &coefficientsA() const; const QVector &coefficientsB() const; const QVector &coefficientsC() const; protected: bool buildNaturalSpline( const QPolygonF & ); bool buildPeriodicSpline( const QPolygonF & ); private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_scale_div.h0000644000373600000000000000532312571536557015717 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_DIV_H #define QWT_SCALE_DIV_H #include "qwt_global.h" #include "qwt_interval.h" #include class QwtInterval; /*! \brief A class representing a scale division A scale division consists of its limits and 3 list of tick values qualified as major, medium and minor ticks. In most cases scale divisions are calculated by a QwtScaleEngine. \sa subDivideInto(), subDivide() */ class QWT_EXPORT QwtScaleDiv { public: //! Scale tick types enum TickType { NoTick = -1, MinorTick, MediumTick, MajorTick, NTickTypes }; explicit QwtScaleDiv(); explicit QwtScaleDiv( const QwtInterval &, QList[NTickTypes] ); explicit QwtScaleDiv( double lowerBound, double upperBound, QList[NTickTypes] ); bool operator==( const QwtScaleDiv &s ) const; bool operator!=( const QwtScaleDiv &s ) const; void setInterval( double lowerBound, double upperBound ); void setInterval( const QwtInterval & ); QwtInterval interval() const; double lowerBound() const; double upperBound() const; double range() const; bool contains( double v ) const; void setTicks( int type, const QList & ); const QList &ticks( int type ) const; void invalidate(); bool isValid() const; void invert(); private: double d_lowerBound; double d_upperBound; QList d_ticks[NTickTypes]; bool d_isValid; }; /*! Change the interval \param lowerBound lower bound \param upperBound upper bound */ inline void QwtScaleDiv::setInterval( double lowerBound, double upperBound ) { d_lowerBound = lowerBound; d_upperBound = upperBound; } /*! \return lowerBound -> upperBound */ inline QwtInterval QwtScaleDiv::interval() const { return QwtInterval( d_lowerBound, d_upperBound ); } /*! \return lower bound \sa upperBound() */ inline double QwtScaleDiv::lowerBound() const { return d_lowerBound; } /*! \return upper bound \sa lowerBound() */ inline double QwtScaleDiv::upperBound() const { return d_upperBound; } /*! \return upperBound() - lowerBound() */ inline double QwtScaleDiv::range() const { return d_upperBound - d_lowerBound; } #endif starpu-1.1.5/starpu-top/qwt/qwt_text_engine.h0000644000373600000000000001163712571536557016304 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_ENGINE_H #define QWT_TEXT_ENGINE_H 1 #include "qwt_global.h" #include class QFont; class QRectF; class QString; class QPainter; /*! \brief Abstract base class for rendering text strings A text engine is responsible for rendering texts for a specific text format. They are used by QwtText to render a text. QwtPlainTextEngine and QwtRichTextEngine are part of the Qwt library. The implementation of QwtMathMLTextEngine uses code from the Qt solution package. Because of license implications it is built into a separate library. \sa QwtText::setTextEngine() */ class QWT_EXPORT QwtTextEngine { public: virtual ~QwtTextEngine(); /*! Find the height for a given width \param font Font of the text \param flags Bitwise OR of the flags used like in QPainter::drawText \param text Text to be rendered \param width Width \return Calculated height */ virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const = 0; /*! Returns the size, that is needed to render text \param font Font of the text \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered \return Caluclated size */ virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const = 0; /*! Test if a string can be rendered by this text engine \param text Text to be tested \return true, if it can be rendered */ virtual bool mightRender( const QString &text ) const = 0; /*! Return margins around the texts The textSize might include margins around the text, like QFontMetrics::descent. In situations where texts need to be aligend in detail, knowing these margins might improve the layout calculations. \param font Font of the text \param text Text to be rendered \param left Return value for the left margin \param right Return value for the right margin \param top Return value for the top margin \param bottom Return value for the bottom margin */ virtual void textMargins( const QFont &font, const QString &text, double &left, double &right, double &top, double &bottom ) const = 0; /*! Draw the text in a clipping rectangle \param painter Painter \param rect Clipping rectangle \param flags Bitwise OR of the flags like in for QPainter::drawText \param text Text to be rendered */ virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const = 0; protected: QwtTextEngine(); }; /*! \brief A text engine for plain texts QwtPlainTextEngine renders texts using the basic Qt classes QPainter and QFontMetrics. */ class QWT_EXPORT QwtPlainTextEngine: public QwtTextEngine { public: QwtPlainTextEngine(); virtual ~QwtPlainTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: class PrivateData; PrivateData *d_data; }; #ifndef QT_NO_RICHTEXT /*! \brief A text engine for Qt rich texts QwtRichTextEngine renders Qt rich texts using the classes of the Scribe framework of Qt. */ class QWT_EXPORT QwtRichTextEngine: public QwtTextEngine { public: QwtRichTextEngine(); virtual double heightForWidth( const QFont &font, int flags, const QString &text, double width ) const; virtual QSizeF textSize( const QFont &font, int flags, const QString &text ) const; virtual void draw( QPainter *painter, const QRectF &rect, int flags, const QString &text ) const; virtual bool mightRender( const QString & ) const; virtual void textMargins( const QFont &, const QString &, double &left, double &right, double &top, double &bottom ) const; private: QString taggedText( const QString &, int flags ) const; }; #endif // !QT_NO_RICHTEXT #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_xml.cpp0000644000373600000000000000216412571536557016157 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" /*! This method is intended for manipulating the plot widget from a specific editor in the Qwt designer plugin. \warning The plot editor has never been implemented. */ void QwtPlot::applyProperties( const QString & /* xmlDocument */ ) { #if 0 // Temporary dummy code, for designer tests setTitle( xmlDocument ); replot(); #endif } /*! This method is intended for manipulating the plot widget from a specific editor in the Qwt designer plugin. \warning The plot editor has never been implemented. */ QString QwtPlot::grabProperties() const { #if 0 // Temporary dummy code, for designer tests return title().text(); #else return QString::null; #endif } starpu-1.1.5/starpu-top/qwt/qwt_slider.h0000644000373600000000000000714412571536557015253 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SLIDER_H #define QWT_SLIDER_H #include "qwt_global.h" #include "qwt_abstract_scale.h" #include "qwt_abstract_slider.h" class QwtScaleDraw; /*! \brief The Slider Widget QwtSlider is a slider widget which operates on an interval of type double. QwtSlider supports different layouts as well as a scale. \image html sliders.png \sa QwtAbstractSlider and QwtAbstractScale for the descriptions of the inherited members. */ class QWT_EXPORT QwtSlider : public QwtAbstractSlider, public QwtAbstractScale { Q_OBJECT Q_ENUMS( ScalePos ) Q_ENUMS( BGSTYLE ) Q_PROPERTY( ScalePos scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( BGSTYLE bgStyle READ bgStyle WRITE setBgStyle ) Q_PROPERTY( int thumbLength READ thumbLength WRITE setThumbLength ) Q_PROPERTY( int thumbWidth READ thumbWidth WRITE setThumbWidth ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) public: /*! Scale position. QwtSlider tries to enforce valid combinations of its orientation and scale position: - Qt::Horizonal combines with NoScale, TopScale and BottomScale - Qt::Vertical combines with NoScale, LeftScale and RightScale \sa QwtSlider() */ enum ScalePos { NoScale, LeftScale, RightScale, TopScale, BottomScale }; /*! Background style. \sa QwtSlider() */ enum BGSTYLE { BgTrough = 0x1, BgSlot = 0x2, BgBoth = BgTrough | BgSlot }; explicit QwtSlider( QWidget *parent, Qt::Orientation = Qt::Horizontal, ScalePos = NoScale, BGSTYLE bgStyle = BgTrough ); virtual ~QwtSlider(); virtual void setOrientation( Qt::Orientation ); void setBgStyle( BGSTYLE ); BGSTYLE bgStyle() const; void setScalePosition( ScalePos s ); ScalePos scalePosition() const; int thumbLength() const; int thumbWidth() const; int borderWidth() const; void setThumbLength( int l ); void setThumbWidth( int w ); void setBorderWidth( int bw ); void setMargins( int x, int y ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; protected: virtual double getValue( const QPoint &p ); virtual void getScrollMode( const QPoint &p, int &scrollMode, int &direction ); void draw( QPainter *p, const QRect& update_rect ); virtual void drawSlider ( QPainter *p, const QRect &r ); virtual void drawThumb( QPainter *p, const QRect &, int pos ); virtual void resizeEvent( QResizeEvent *e ); virtual void paintEvent ( QPaintEvent *e ); virtual void valueChange(); virtual void rangeChange(); virtual void scaleChange(); virtual void fontChange( const QFont &oldFont ); void layoutSlider( bool update = true ); int xyPosition( double v ) const; QwtScaleDraw *scaleDraw(); private: void initSlider( Qt::Orientation, ScalePos scalePos, BGSTYLE bgStyle ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_painter.cpp0000644000373600000000000004207512571536560015762 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_painter.h" #include "qwt_math.h" #include "qwt_clipper.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include bool QwtPainter::d_polylineSplitting = true; bool QwtPainter::d_roundingAlignment = true; static inline bool isClippingNeeded( const QPainter *painter, QRectF &clipRect ) { bool doClipping = false; const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::SVG ) { // The SVG paint engine ignores any clipping, if ( painter->hasClipping() ) { doClipping = true; clipRect = painter->clipRegion().boundingRect(); } } return doClipping; } static inline void drawPolyline( QPainter *painter, const QPointF *points, int pointCount, bool polylineSplitting ) { bool doSplit = false; if ( polylineSplitting ) { const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::Raster ) { /* The raster paint engine seems to use some algo with O(n*n). ( Qt 4.3 is better than Qt 4.2, but remains unacceptable) To work around this problem, we have to split the polygon into smaller pieces. */ doSplit = true; } } if ( doSplit ) { const int splitSize = 20; for ( int i = 0; i < pointCount; i += splitSize ) { const int n = qMin( splitSize + 1, pointCount - i ); painter->drawPolyline( points + i, n ); } } else painter->drawPolyline( points, pointCount ); } static inline void unscaleFont( QPainter *painter ) { if ( painter->font().pixelSize() >= 0 ) return; static QSize screenResolution; if ( !screenResolution.isValid() ) { QDesktopWidget *desktop = QApplication::desktop(); if ( desktop ) { screenResolution.setWidth( desktop->logicalDpiX() ); screenResolution.setHeight( desktop->logicalDpiY() ); } } const QPaintDevice *pd = painter->device(); if ( pd->logicalDpiX() != screenResolution.width() || pd->logicalDpiY() != screenResolution.height() ) { QFont pixelFont( painter->font(), QApplication::desktop() ); pixelFont.setPixelSize( QFontInfo( pixelFont ).pixelSize() ); painter->setFont( pixelFont ); } } /*! Check if the painter is using a paint engine, that aligns coordinates to integers. Today these are all paint engines beside QPaintEngine::Pdf and QPaintEngine::SVG. \param painter Painter \return true, when the paint engine is aligning \sa setRoundingAlignment() */ bool QwtPainter::isAligning( QPainter *painter ) { if ( painter && painter->isActive() ) { switch ( painter->paintEngine()->type() ) { case QPaintEngine::Pdf: case QPaintEngine::SVG: return false; default:; } } return true; } /*! Enable whether coordinates should be rounded, before they are painted to a paint engine that floors to integer values. For other paint engines this ( Pdf, SVG ), this flag has no effect. QwtPainter stores this flag only, the rounding itsself is done in the painting code ( f.e the plot items ). The default setting is true. \sa roundingAlignment(), isAligning() */ void QwtPainter::setRoundingAlignment( bool enable ) { d_roundingAlignment = enable; } /*! \brief En/Disable line splitting for the raster paint engine The raster paint engine paints polylines of many points much faster when they are splitted in smaller chunks. \sa polylineSplitting() */ void QwtPainter::setPolylineSplitting( bool enable ) { d_polylineSplitting = enable; } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, double x, double y, double w, double h ) { drawRect( painter, QRectF( x, y, w, h ) ); } //! Wrapper for QPainter::drawRect() void QwtPainter::drawRect( QPainter *painter, const QRectF &rect ) { const QRectF r = rect; QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping ) { if ( !clipRect.intersects( r ) ) return; if ( !clipRect.contains( r ) ) { fillRect( painter, r & clipRect, painter->brush() ); painter->save(); painter->setBrush( Qt::NoBrush ); drawPolyline( painter, QPolygonF( r ) ); painter->restore(); return; } } painter->drawRect( r ); } //! Wrapper for QPainter::fillRect() void QwtPainter::fillRect( QPainter *painter, const QRectF &rect, const QBrush &brush ) { if ( !rect.isValid() ) return; QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); /* Performance of Qt4 is horrible for non trivial brushs. Without clipping expect minutes or hours for repainting large rects (might result from zooming) */ if ( deviceClipping ) clipRect &= painter->window(); else clipRect = painter->window(); if ( painter->hasClipping() ) clipRect &= painter->clipRegion().boundingRect(); QRectF r = rect; if ( deviceClipping ) r = r.intersect( clipRect ); if ( r.isValid() ) painter->fillRect( r, brush ); } //! Wrapper for QPainter::drawPie() void QwtPainter::drawPie( QPainter *painter, const QRectF &rect, int a, int alen ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawPie( rect, a, alen ); } //! Wrapper for QPainter::drawEllipse() void QwtPainter::drawEllipse( QPainter *painter, const QRectF &rect ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( rect ) ) return; painter->drawEllipse( rect ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, const QString &text ) { drawText( painter, QPointF( x, y ), text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QPointF &pos, const QString &text ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->save(); unscaleFont( painter ); painter->drawText( pos, text ); painter->restore(); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, double x, double y, double w, double h, int flags, const QString &text ) { drawText( painter, QRectF( x, y, w, h ), flags, text ); } //! Wrapper for QPainter::drawText() void QwtPainter::drawText( QPainter *painter, const QRectF &rect, int flags, const QString &text ) { painter->save(); unscaleFont( painter ); painter->drawText( rect, flags, text ); painter->restore(); } #ifndef QT_NO_RICHTEXT /*! Draw a text document into a rectangle \param painter Painter \param rect Traget rectangle \param flags Alignments/Text flags, see QPainter::drawText() \param text Text document */ void QwtPainter::drawSimpleRichText( QPainter *painter, const QRectF &rect, int flags, const QTextDocument &text ) { QTextDocument *txt = text.clone(); painter->save(); painter->setFont( txt->defaultFont() ); unscaleFont( painter ); txt->setDefaultFont( painter->font() ); txt->setPageSize( QSizeF( rect.width(), QWIDGETSIZE_MAX ) ); QAbstractTextDocumentLayout* layout = txt->documentLayout(); const double height = layout->documentSize().height(); double y = rect.y(); if ( flags & Qt::AlignBottom ) y += ( rect.height() - height ); else if ( flags & Qt::AlignVCenter ) y += ( rect.height() - height ) / 2; QAbstractTextDocumentLayout::PaintContext context; context.palette.setColor( QPalette::Text, painter->pen().color() ); painter->translate( rect.x(), y ); layout->draw( painter, context ); painter->restore(); delete txt; } #endif // !QT_NO_RICHTEXT //! Wrapper for QPainter::drawLine() void QwtPainter::drawLine( QPainter *painter, const QPointF &p1, const QPointF &p2 ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !( clipRect.contains( p1 ) && clipRect.contains( p2 ) ) ) { QPolygonF polygon; polygon += p1; polygon += p2; drawPolyline( painter, polygon ); return; } painter->drawLine( p1, p2 ); } //! Wrapper for QPainter::drawPolygon() void QwtPainter::drawPolygon( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, polygon ); painter->drawPolygon( cpa ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPolygonF &polygon ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); QPolygonF cpa = polygon; if ( deviceClipping ) cpa = QwtClipper::clipPolygonF( clipRect, cpa ); ::drawPolyline( painter, cpa.constData(), cpa.size(), d_polylineSplitting ); } //! Wrapper for QPainter::drawPolyline() void QwtPainter::drawPolyline( QPainter *painter, const QPointF *points, int pointCount ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping ) { QPolygonF polygon( pointCount ); qMemCopy( polygon.data(), points, pointCount * sizeof( QPointF ) ); polygon = QwtClipper::clipPolygonF( clipRect, polygon ); ::drawPolyline( painter, polygon.constData(), polygon.size(), d_polylineSplitting ); } else ::drawPolyline( painter, points, pointCount, d_polylineSplitting ); } //! Wrapper for QPainter::drawPoint() void QwtPainter::drawPoint( QPainter *painter, const QPointF &pos ) { QRectF clipRect; const bool deviceClipping = isClippingNeeded( painter, clipRect ); if ( deviceClipping && !clipRect.contains( pos ) ) return; painter->drawPoint( pos ); } //! Wrapper for QPainter::drawImage() void QwtPainter::drawImage( QPainter *painter, const QRectF &rect, const QImage &image ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawImage( alignedRect, image ); painter->restore(); } else { painter->drawImage( alignedRect, image ); } } //! Wrapper for QPainter::drawPixmap() void QwtPainter::drawPixmap( QPainter *painter, const QRectF &rect, const QPixmap &pixmap ) { const QRect alignedRect = rect.toAlignedRect(); if ( alignedRect != rect ) { const QRectF clipRect = rect.adjusted( 0.0, 0.0, -1.0, -1.0 ); painter->save(); painter->setClipRect( clipRect, Qt::IntersectClip ); painter->drawPixmap( alignedRect, pixmap ); painter->restore(); } else { painter->drawPixmap( alignedRect, pixmap ); } } /*! Draw a arc with a linear gradient \note This method needs to be replaced by using QGradient */ void QwtPainter::drawColoredArc( QPainter *painter, const QRect &rect, int peak, int arc, int interval, const QColor &c1, const QColor &c2 ) { int h1, s1, v1; int h2, s2, v2; c1.getHsv( &h1, &s1, &v1 ); c2.getHsv( &h2, &s2, &v2 ); arc /= 2; for ( int angle = -arc; angle < arc; angle += interval ) { double ratio; if ( angle >= 0 ) ratio = 1.0 - angle / double( arc ); else ratio = 1.0 + angle / double( arc ); QColor c; c.setHsv( h1 + qRound( ratio * ( h2 - h1 ) ), s1 + qRound( ratio * ( s2 - s1 ) ), v1 + qRound( ratio * ( v2 - v1 ) ) ); painter->setPen( QPen( c, painter->pen().width() ) ); painter->drawArc( rect, ( peak + angle ) * 16, interval * 16 ); } } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, QWidget *widget ) { drawFocusRect( painter, widget, widget->rect() ); } //! Draw a focus rectangle on a widget using its style. void QwtPainter::drawFocusRect( QPainter *painter, QWidget *widget, const QRect &rect ) { QStyleOptionFocusRect opt; opt.init( widget ); opt.rect = rect; opt.state |= QStyle::State_HasFocus; widget->style()->drawPrimitive( QStyle::PE_FrameFocusRect, &opt, painter, widget ); } //! Draw a round frame void QwtPainter::drawRoundFrame( QPainter *painter, const QRect &rect, int width, const QPalette &palette, bool sunken ) { QColor c0 = palette.color( QPalette::Mid ); QColor c1, c2; if ( sunken ) { c1 = palette.color( QPalette::Dark ); c2 = palette.color( QPalette::Light ); } else { c1 = palette.color( QPalette::Light ); c2 = palette.color( QPalette::Dark ); } painter->setPen( QPen( c0, width ) ); painter->drawArc( rect, 0, 360 * 16 ); // full const int peak = 150; const int interval = 2; if ( c0 != c1 ) drawColoredArc( painter, rect, peak, 160, interval, c0, c1 ); if ( c0 != c2 ) drawColoredArc( painter, rect, peak + 180, 120, interval, c0, c2 ); } /*! Draw a color bar into a rectangle \param painter Painter \param colorMap Color map \param interval Value range \param scaleMap Scale map \param orientation Orientation \param rect Traget rectangle */ void QwtPainter::drawColorBar( QPainter *painter, const QwtColorMap &colorMap, const QwtInterval &interval, const QwtScaleMap &scaleMap, Qt::Orientation orientation, const QRectF &rect ) { QVector colorTable; if ( colorMap.format() == QwtColorMap::Indexed ) colorTable = colorMap.colorTable( interval ); QColor c; const QRect devRect = rect.toAlignedRect(); /* We paint to a pixmap first to have something scalable for printing ( f.e. in a Pdf document ) */ QPixmap pixmap( devRect.size() ); QPainter pmPainter( &pixmap ); pmPainter.translate( -devRect.x(), -devRect.y() ); if ( orientation == Qt::Horizontal ) { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.left(), rect.right() ); for ( int x = devRect.left(); x <= devRect.right(); x++ ) { const double value = sMap.invTransform( x ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( x, devRect.top(), x, devRect.bottom() ); } } else // Vertical { QwtScaleMap sMap = scaleMap; sMap.setPaintInterval( rect.bottom(), rect.top() ); for ( int y = devRect.top(); y <= devRect.bottom(); y++ ) { const double value = sMap.invTransform( y ); if ( colorMap.format() == QwtColorMap::RGB ) c.setRgb( colorMap.rgb( interval, value ) ); else c = colorTable[colorMap.colorIndex( interval, value )]; pmPainter.setPen( c ); pmPainter.drawLine( devRect.left(), y, devRect.right(), y ); } } pmPainter.end(); drawPixmap( painter, rect, pixmap ); } starpu-1.1.5/starpu-top/qwt/qwt_round_scale_draw.h0000644000373600000000000000405112571536560017270 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ROUND_SCALE_DRAW_H #define QWT_ROUND_SCALE_DRAW_H #include "qwt_global.h" #include "qwt_abstract_scale_draw.h" #include class QPen; /*! \brief A class for drawing round scales QwtRoundScaleDraw can be used to draw round scales. The circle segment can be adjusted by QwtRoundScaleDraw::setAngleRange(). The geometry of the scale can be specified with QwtRoundScaleDraw::moveCenter() and QwtRoundScaleDraw::setRadius(). After a scale division has been specified as a QwtScaleDiv object using QwtAbstractScaleDraw::setScaleDiv(const QwtScaleDiv &s), the scale can be drawn with the QwtAbstractScaleDraw::draw() member. */ class QWT_EXPORT QwtRoundScaleDraw: public QwtAbstractScaleDraw { public: QwtRoundScaleDraw(); virtual ~QwtRoundScaleDraw(); void setRadius( int radius ); int radius() const; void moveCenter( double x, double y ); void moveCenter( const QPointF & ); QPointF center() const; void setAngleRange( double angle1, double angle2 ); virtual double extent( const QFont & ) const; protected: virtual void drawTick( QPainter *p, double val, double len ) const; virtual void drawBackbone( QPainter *p ) const; virtual void drawLabel( QPainter *p, double val ) const; private: QwtRoundScaleDraw( const QwtRoundScaleDraw & ); QwtRoundScaleDraw &operator=( const QwtRoundScaleDraw &other ); class PrivateData; PrivateData *d_data; }; //! Move the center of the scale draw, leaving the radius unchanged inline void QwtRoundScaleDraw::moveCenter( double x, double y ) { moveCenter( QPointF( x, y ) ); } #endif starpu-1.1.5/starpu-top/qwt/qwt_abstract_scale.h0000644000373600000000000000355112571536557016741 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_ABSTRACT_SCALE_H #define QWT_ABSTRACT_SCALE_H #include "qwt_global.h" class QwtScaleEngine; class QwtAbstractScaleDraw; class QwtScaleDiv; class QwtScaleMap; class QwtInterval; /*! \brief An abstract base class for classes containing a scale QwtAbstractScale is used to provide classes with a QwtScaleDraw, and a QwtScaleDiv. The QwtScaleDiv might be set explicitely or calculated by a QwtScaleEngine. */ class QWT_EXPORT QwtAbstractScale { public: QwtAbstractScale(); virtual ~QwtAbstractScale(); void setScale( double vmin, double vmax, double step = 0.0 ); void setScale( const QwtInterval &, double step = 0.0 ); void setScale( const QwtScaleDiv & ); void setAutoScale(); bool autoScale() const; void setScaleMaxMajor( int ticks ); int scaleMaxMinor() const; void setScaleMaxMinor( int ticks ); int scaleMaxMajor() const; void setScaleEngine( QwtScaleEngine * ); const QwtScaleEngine *scaleEngine() const; QwtScaleEngine *scaleEngine(); const QwtScaleMap &scaleMap() const; protected: void rescale( double vmin, double vmax, double step = 0.0 ); void setAbstractScaleDraw( QwtAbstractScaleDraw * ); const QwtAbstractScaleDraw *abstractScaleDraw() const; QwtAbstractScaleDraw *abstractScaleDraw(); virtual void scaleChange(); private: void updateScaleDraw(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_dial.cpp0000644000373600000000000007170512571536560015233 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dial.h" #include "qwt_dial_needle.h" #include "qwt_math.h" #include "qwt_scale_engine.h" #include "qwt_scale_map.h" #include "qwt_painter.h" #include #include #include #include #include #include #include #if QT_VERSION < 0x040601 #define qAtan(x) ::atan(x) #endif class QwtDial::PrivateData { public: PrivateData(): visibleBackground( true ), frameShadow( Sunken ), lineWidth( 0 ), mode( RotateNeedle ), direction( Clockwise ), origin( 90.0 ), minScaleArc( 0.0 ), maxScaleArc( 0.0 ), scaleDraw( 0 ), maxMajIntv( 36 ), maxMinIntv( 10 ), scaleStep( 0.0 ), needle( 0 ) { } ~PrivateData() { delete scaleDraw; delete needle; } bool visibleBackground; Shadow frameShadow; int lineWidth; QwtDial::Mode mode; QwtDial::Direction direction; double origin; double minScaleArc; double maxScaleArc; QwtDialScaleDraw *scaleDraw; int maxMajIntv; int maxMinIntv; double scaleStep; QwtDialNeedle *needle; static double previousDir; }; double QwtDial::PrivateData::previousDir = -1.0; /*! Constructor \param parent Parent dial widget */ QwtDialScaleDraw::QwtDialScaleDraw( QwtDial *parent ): d_parent( parent ), d_penWidth( 1.0 ) { } /*! Set the pen width used for painting the scale \param penWidth Pen width \sa penWidth(), QwtDial::drawScale() */ void QwtDialScaleDraw::setPenWidth( double penWidth ) { d_penWidth = qMax( penWidth, 0.0 ); } /*! \return Pen width used for painting the scale \sa setPenWidth, QwtDial::drawScale() */ double QwtDialScaleDraw::penWidth() const { return d_penWidth; } /*! Call QwtDial::scaleLabel of the parent dial widget. \param value Value to display \sa QwtDial::scaleLabel() */ QwtText QwtDialScaleDraw::label( double value ) const { if ( d_parent == NULL ) return QwtRoundScaleDraw::label( value ); return d_parent->scaleLabel( value ); } /*! \brief Constructor \param parent Parent widget Create a dial widget with no scale and no needle. The default origin is 90.0 with no valid value. It accepts mouse and keyboard inputs and has no step size. The default mode is QwtDial::RotateNeedle. */ QwtDial::QwtDial( QWidget* parent ): QwtAbstractSlider( Qt::Horizontal, parent ) { initDial(); } void QwtDial::initDial() { d_data = new PrivateData; setFocusPolicy( Qt::TabFocus ); QPalette p = palette(); for ( int i = 0; i < QPalette::NColorGroups; i++ ) { const QPalette::ColorGroup cg = ( QPalette::ColorGroup )i; // Base: background color of the circle inside the frame. // WindowText: background color of the circle inside the scale p.setColor( cg, QPalette::WindowText, p.color( cg, QPalette::Base ) ); } setPalette( p ); d_data->scaleDraw = new QwtDialScaleDraw( this ); d_data->scaleDraw->setRadius( 0 ); setScaleArc( 0.0, 360.0 ); // scale as a full circle setRange( 0.0, 360.0, 1.0, 10 ); // degrees as deafult } //! Destructor QwtDial::~QwtDial() { delete d_data; } /*! Show/Hide the area outside of the frame \param show Show if true, hide if false \sa hasVisibleBackground(), setMask() \warning When QwtDial is a toplevel widget the window border might disappear too. */ void QwtDial::showBackground( bool show ) { if ( d_data->visibleBackground != show ) { d_data->visibleBackground = show; updateMask(); } } /*! true when the area outside of the frame is visible \sa showBackground(), setMask() */ bool QwtDial::hasVisibleBackground() const { return d_data->visibleBackground; } /*! Sets the frame shadow value from the frame style. \param shadow Frame shadow \sa setLineWidth(), QFrame::setFrameShadow() */ void QwtDial::setFrameShadow( Shadow shadow ) { if ( shadow != d_data->frameShadow ) { d_data->frameShadow = shadow; if ( lineWidth() > 0 ) update(); } } /*! \return Frame shadow /sa setFrameShadow(), lineWidth(), QFrame::frameShadow */ QwtDial::Shadow QwtDial::frameShadow() const { return d_data->frameShadow; } /*! Sets the line width \param lineWidth Line width \sa setFrameShadow() */ void QwtDial::setLineWidth( int lineWidth ) { if ( lineWidth < 0 ) lineWidth = 0; if ( d_data->lineWidth != lineWidth ) { d_data->lineWidth = lineWidth; update(); } } /*! \return Line width of the frame \sa setLineWidth(), frameShadow(), lineWidth() */ int QwtDial::lineWidth() const { return d_data->lineWidth; } /*! \return bounding rect of the circle inside the frame \sa setLineWidth(), scaleContentsRect(), boundingRect() */ QRect QwtDial::contentsRect() const { const int lw = lineWidth(); QRect r = boundingRect(); if ( lw > 0 ) { r.setRect( r.x() + lw, r.y() + lw, r.width() - 2 * lw, r.height() - 2 * lw ); } return r; } /*! \return bounding rect of the dial including the frame \sa setLineWidth(), scaleContentsRect(), contentsRect() */ QRect QwtDial::boundingRect() const { const int radius = qMin( width(), height() ) / 2; QRect r( 0, 0, 2 * radius, 2 * radius ); r.moveCenter( rect().center() ); return r; } /*! \return rect inside the scale \sa setLineWidth(), boundingRect(), contentsRect() */ QRect QwtDial::scaleContentsRect() const { const QPen scalePen( palette().text(), 0, Qt::NoPen ); int scaleDist = 0; if ( d_data->scaleDraw ) { scaleDist = qCeil( d_data->scaleDraw->extent( font() ) ); scaleDist++; // margin } const QRect rect = contentsRect(); return QRect( rect.x() + scaleDist, rect.y() + scaleDist, rect.width() - 2 * scaleDist, rect.height() - 2 * scaleDist ); } /*! \brief Change the mode of the meter. \param mode New mode The value of the meter is indicated by the difference between north of the scale and the direction of the needle. In case of QwtDial::RotateNeedle north is pointing to the origin() and the needle is rotating, in case of QwtDial::RotateScale, the needle points to origin() and the scale is rotating. The default mode is QwtDial::RotateNeedle. \sa mode(), setValue(), setOrigin() */ void QwtDial::setMode( Mode mode ) { if ( mode != d_data->mode ) { d_data->mode = mode; update(); } } /*! \return mode of the dial. The value of the dial is indicated by the difference between the origin and the direction of the needle. In case of QwtDial::RotateNeedle the scale arc is fixed to the origin() and the needle is rotating, in case of QwtDial::RotateScale, the needle points to origin() and the scale is rotating. The default mode is QwtDial::RotateNeedle. \sa setMode(), origin(), setScaleArc(), value() */ QwtDial::Mode QwtDial::mode() const { return d_data->mode; } /*! Sets whether it is possible to step the value from the highest value to the lowest value and vice versa to on. \param wrapping en/disables wrapping \sa wrapping(), QwtDoubleRange::periodic() \note The meaning of wrapping is like the wrapping property of QSpinBox, but not like it is used in QDial. */ void QwtDial::setWrapping( bool wrapping ) { setPeriodic( wrapping ); } /*! wrapping() holds whether it is possible to step the value from the highest value to the lowest value and vice versa. \sa setWrapping(), QwtDoubleRange::setPeriodic() \note The meaning of wrapping is like the wrapping property of QSpinBox, but not like it is used in QDial. */ bool QwtDial::wrapping() const { return periodic(); } /*! Set the direction of the dial (clockwise/counterclockwise) Direction direction \sa direction() */ void QwtDial::setDirection( Direction direction ) { if ( direction != d_data->direction ) { d_data->direction = direction; update(); } } /*! \return Direction of the dial The default direction of a dial is QwtDial::Clockwise \sa setDirection() */ QwtDial::Direction QwtDial::direction() const { return d_data->direction; } /*! Resize the dial widget \param e Resize event */ void QwtDial::resizeEvent( QResizeEvent *e ) { QWidget::resizeEvent( e ); if ( !hasVisibleBackground() ) updateMask(); } /*! Paint the dial \param e Paint event */ void QwtDial::paintEvent( QPaintEvent *e ) { const QRect &ur = e->rect(); if ( ur.isValid() ) { QPainter painter( this ); painter.setRenderHint( QPainter::Antialiasing, true ); painter.save(); drawContents( &painter ); painter.restore(); painter.save(); drawFrame( &painter ); painter.restore(); if ( hasFocus() ) drawFocusIndicator( &painter ); } } /*! Draw a dotted round circle, if !isReadOnly() \param painter Painter */ void QwtDial::drawFocusIndicator( QPainter *painter ) const { if ( !isReadOnly() ) { QRect focusRect = contentsRect(); const int margin = 2; focusRect.setRect( focusRect.x() + margin, focusRect.y() + margin, focusRect.width() - 2 * margin, focusRect.height() - 2 * margin ); QColor color = palette().color( QPalette::Base ); if ( color.isValid() ) { const QColor gray( Qt::gray ); int h, s, v; color.getHsv( &h, &s, &v ); color = ( v > 128 ) ? gray.dark( 120 ) : gray.light( 120 ); } else color = Qt::darkGray; painter->save(); painter->setBrush( Qt::NoBrush ); painter->setPen( QPen( color, 0, Qt::DotLine ) ); painter->drawEllipse( focusRect ); painter->restore(); } } /*! Draw the frame around the dial \param painter Painter \sa lineWidth(), frameShadow() */ void QwtDial::drawFrame( QPainter *painter ) { const int lw = lineWidth(); const int off = ( lw + 1 ) % 2; QRect r = boundingRect(); r.setRect( r.x() + lw / 2 - off, r.y() + lw / 2 - off, r.width() - lw + off + 1, r.height() - lw + off + 1 ); r.setX( r.x() + 1 ); r.setY( r.y() + 1 ); r.setWidth( r.width() - 2 ); r.setHeight( r.height() - 2 ); if ( lw > 0 ) { switch ( d_data->frameShadow ) { case QwtDial::Raised: QwtPainter::drawRoundFrame( painter, r, lw, palette(), false ); break; case QwtDial::Sunken: QwtPainter::drawRoundFrame( painter, r, lw, palette(), true ); break; default: // Plain { painter->save(); painter->setPen( QPen( Qt::black, lw ) ); painter->setBrush( Qt::NoBrush ); painter->drawEllipse( r ); painter->restore(); } } } } /*! \brief Draw the contents inside the frame QPalette::Window is the background color outside of the frame. QPalette::Base is the background color inside the frame. QPalette::WindowText is the background color inside the scale. \param painter Painter \sa boundingRect(), contentsRect(), scaleContentsRect(), QWidget::setPalette() */ void QwtDial::drawContents( QPainter *painter ) const { if ( testAttribute( Qt::WA_NoSystemBackground ) || palette().brush( QPalette::Base ) != palette().brush( QPalette::Window ) ) { const QRect br = boundingRect(); painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::Base ) ); painter->drawEllipse( br ); painter->restore(); } const QRect insideScaleRect = scaleContentsRect(); if ( palette().brush( QPalette::WindowText ) != palette().brush( QPalette::Base ) ) { painter->save(); painter->setPen( Qt::NoPen ); painter->setBrush( palette().brush( QPalette::WindowText ) ); painter->drawEllipse( insideScaleRect.x() - 1, insideScaleRect.y() - 1, insideScaleRect.width(), insideScaleRect.height() ); painter->restore(); } const QPoint center = insideScaleRect.center(); const int radius = insideScaleRect.width() / 2; painter->save(); drawScaleContents( painter, center, radius ); painter->restore(); double direction = d_data->origin; if ( isValid() ) { direction = d_data->minScaleArc; if ( maxValue() > minValue() && d_data->maxScaleArc > d_data->minScaleArc ) { const double ratio = ( value() - minValue() ) / ( maxValue() - minValue() ); direction += ratio * ( d_data->maxScaleArc - d_data->minScaleArc ); } if ( d_data->direction == QwtDial::CounterClockwise ) direction = d_data->maxScaleArc - ( direction - d_data->minScaleArc ); direction += d_data->origin; if ( direction >= 360.0 ) direction -= 360.0; else if ( direction < 0.0 ) direction += 360.0; } double origin = d_data->origin; if ( mode() == RotateScale ) { origin -= direction - d_data->origin; direction = d_data->origin; } painter->save(); drawScale( painter, center, radius, origin, d_data->minScaleArc, d_data->maxScaleArc ); painter->restore(); if ( isValid() ) { QPalette::ColorGroup cg; if ( isEnabled() ) cg = hasFocus() ? QPalette::Active : QPalette::Inactive; else cg = QPalette::Disabled; painter->save(); drawNeedle( painter, center, radius, direction, cg ); painter->restore(); } } /*! Draw the needle \param painter Painter \param center Center of the dial \param radius Length for the needle \param direction Direction of the needle in degrees, counter clockwise \param cg ColorGroup */ void QwtDial::drawNeedle( QPainter *painter, const QPoint ¢er, int radius, double direction, QPalette::ColorGroup cg ) const { if ( d_data->needle ) { direction = 360.0 - direction; // counter clockwise d_data->needle->draw( painter, center, radius, direction, cg ); } } /*! Draw the scale \param painter Painter \param center Center of the dial \param radius Radius of the scale \param origin Origin of the scale \param minArc Minimum of the arc \param maxArc Minimum of the arc \sa QwtAbstractScaleDraw::setAngleRange() */ void QwtDial::drawScale( QPainter *painter, const QPoint ¢er, int radius, double origin, double minArc, double maxArc ) const { if ( d_data->scaleDraw == NULL ) return; origin -= 270.0; // hardcoded origin of QwtScaleDraw double angle = maxArc - minArc; if ( angle > 360.0 ) angle = ::fmod( angle, 360.0 ); minArc += origin; if ( minArc < -360.0 ) minArc = ::fmod( minArc, 360.0 ); maxArc = minArc + angle; if ( maxArc > 360.0 ) { // QwtAbstractScaleDraw::setAngleRange accepts only values // in the range [-360.0..360.0] minArc -= 360.0; maxArc -= 360.0; } if ( d_data->direction == QwtDial::CounterClockwise ) qSwap( minArc, maxArc ); painter->setFont( font() ); d_data->scaleDraw->setAngleRange( minArc, maxArc ); d_data->scaleDraw->setRadius( radius ); d_data->scaleDraw->moveCenter( center ); QPalette pal = palette(); const QColor textColor = pal.color( QPalette::Text ); pal.setColor( QPalette::WindowText, textColor ); //ticks, backbone painter->setPen( QPen( textColor, d_data->scaleDraw->penWidth() ) ); d_data->scaleDraw->draw( painter, pal ); } void QwtDial::drawScaleContents( QPainter *, const QPoint &, int ) const { // empty default implementation } /*! Set a needle for the dial Qwt is missing a set of good looking needles. Contributions are very welcome. \param needle Needle \warning The needle will be deleted, when a different needle is set or in ~QwtDial() */ void QwtDial::setNeedle( QwtDialNeedle *needle ) { if ( needle != d_data->needle ) { if ( d_data->needle ) delete d_data->needle; d_data->needle = needle; update(); } } /*! \return needle \sa setNeedle() */ const QwtDialNeedle *QwtDial::needle() const { return d_data->needle; } /*! \return needle \sa setNeedle() */ QwtDialNeedle *QwtDial::needle() { return d_data->needle; } //! QwtDoubleRange update hook void QwtDial::rangeChange() { updateScale(); } /*! Update the scale with the current attributes \sa setScale() */ void QwtDial::updateScale() { if ( d_data->scaleDraw ) { QwtLinearScaleEngine scaleEngine; const QwtScaleDiv scaleDiv = scaleEngine.divideScale( minValue(), maxValue(), d_data->maxMajIntv, d_data->maxMinIntv, d_data->scaleStep ); d_data->scaleDraw->setTransformation( scaleEngine.transformation() ); d_data->scaleDraw->setScaleDiv( scaleDiv ); } } //! Return the scale draw QwtDialScaleDraw *QwtDial::scaleDraw() { return d_data->scaleDraw; } //! Return the scale draw const QwtDialScaleDraw *QwtDial::scaleDraw() const { return d_data->scaleDraw; } /*! Set an individual scale draw \param scaleDraw Scale draw \warning The previous scale draw is deleted */ void QwtDial::setScaleDraw( QwtDialScaleDraw *scaleDraw ) { if ( scaleDraw != d_data->scaleDraw ) { if ( d_data->scaleDraw ) delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; updateScale(); update(); } } /*! Change the intervals of the scale \sa QwtAbstractScaleDraw::setScale() */ void QwtDial::setScale( int maxMajIntv, int maxMinIntv, double step ) { d_data->maxMajIntv = maxMajIntv; d_data->maxMinIntv = maxMinIntv; d_data->scaleStep = step; updateScale(); } /*! A wrapper method for accessing the scale draw. - options == 0\n No visible scale: setScaleDraw(NULL) - options & ScaleBackbone\n En/disable the backbone of the scale. - options & ScaleTicks\n En/disable the ticks of the scale. - options & ScaleLabel\n En/disable scale labels \sa QwtAbstractScaleDraw::enableComponent() */ void QwtDial::setScaleOptions( int options ) { if ( options == 0 ) setScaleDraw( NULL ); QwtDialScaleDraw *sd = d_data->scaleDraw; if ( sd == NULL ) return; sd->enableComponent( QwtAbstractScaleDraw::Backbone, options & ScaleBackbone ); sd->enableComponent( QwtAbstractScaleDraw::Ticks, options & ScaleTicks ); sd->enableComponent( QwtAbstractScaleDraw::Labels, options & ScaleLabel ); } /*! Assign length and width of the ticks \param minLen Length of the minor ticks \param medLen Length of the medium ticks \param majLen Length of the major ticks \param penWidth Width of the pen for all ticks \sa QwtAbstractScaleDraw::setTickLength(), QwtDialScaleDraw::setPenWidth() */ void QwtDial::setScaleTicks( int minLen, int medLen, int majLen, int penWidth ) { QwtDialScaleDraw *sd = d_data->scaleDraw; if ( sd ) { sd->setTickLength( QwtScaleDiv::MinorTick, minLen ); sd->setTickLength( QwtScaleDiv::MediumTick, medLen ); sd->setTickLength( QwtScaleDiv::MajorTick, majLen ); sd->setPenWidth( penWidth ); } } /*! Find the label for a value \param value Value \return label */ QwtText QwtDial::scaleLabel( double value ) const { #if 1 if ( value == -0 ) value = 0; #endif return QString::number( value ); } //! \return Lower limit of the scale arc double QwtDial::minScaleArc() const { return d_data->minScaleArc; } //! \return Upper limit of the scale arc double QwtDial::maxScaleArc() const { return d_data->maxScaleArc; } /*! \brief Change the origin The origin is the angle where scale and needle is relative to. \param origin New origin \sa origin() */ void QwtDial::setOrigin( double origin ) { d_data->origin = origin; update(); } /*! The origin is the angle where scale and needle is relative to. \return Origin of the dial \sa setOrigin() */ double QwtDial::origin() const { return d_data->origin; } /*! Change the arc of the scale \param minArc Lower limit \param maxArc Upper limit */ void QwtDial::setScaleArc( double minArc, double maxArc ) { if ( minArc != 360.0 && minArc != -360.0 ) minArc = ::fmod( minArc, 360.0 ); if ( maxArc != 360.0 && maxArc != -360.0 ) maxArc = ::fmod( maxArc, 360.0 ); d_data->minScaleArc = qMin( minArc, maxArc ); d_data->maxScaleArc = qMax( minArc, maxArc ); if ( d_data->maxScaleArc - d_data->minScaleArc > 360.0 ) d_data->maxScaleArc = d_data->minScaleArc + 360.0; update(); } //! QwtDoubleRange update hook void QwtDial::valueChange() { update(); QwtAbstractSlider::valueChange(); } /*! \return Size hint */ QSize QwtDial::sizeHint() const { int sh = 0; if ( d_data->scaleDraw ) sh = qCeil( d_data->scaleDraw->extent( font() ) ); const int d = 6 * sh + 2 * lineWidth(); return QSize( d, d ); } /*! \brief Return a minimum size hint \warning The return value of QwtDial::minimumSizeHint() depends on the font and the scale. */ QSize QwtDial::minimumSizeHint() const { int sh = 0; if ( d_data->scaleDraw ) sh = qCeil( d_data->scaleDraw->extent( font() ) ); const int d = 3 * sh + 2 * lineWidth(); return QSize( d, d ); } static double line2Radians( const QPoint &p1, const QPoint &p2 ) { const QPoint p = p2 - p1; double angle; if ( p.x() == 0 ) angle = ( p.y() <= 0 ) ? M_PI_2 : 3 * M_PI_2; else { angle = qAtan( double( -p.y() ) / double( p.x() ) ); if ( p.x() < 0 ) angle += M_PI; if ( angle < 0.0 ) angle += 2 * M_PI; } return 360.0 - angle * 180.0 / M_PI; } /*! Find the value for a given position \param pos Position \return Value */ double QwtDial::getValue( const QPoint &pos ) { if ( d_data->maxScaleArc == d_data->minScaleArc || maxValue() == minValue() ) return minValue(); double dir = line2Radians( rect().center(), pos ) - d_data->origin; if ( dir < 0.0 ) dir += 360.0; if ( mode() == RotateScale ) dir = 360.0 - dir; // The position might be in the area that is outside the scale arc. // We need the range of the scale if it was a complete circle. const double completeCircle = 360.0 / ( d_data->maxScaleArc - d_data->minScaleArc ) * ( maxValue() - minValue() ); double posValue = minValue() + completeCircle * dir / 360.0; if ( scrollMode() == ScrMouse ) { if ( d_data->previousDir >= 0.0 ) // valid direction { // We have to find out whether the mouse is moving // clock or counter clockwise bool clockWise = false; const double angle = dir - d_data->previousDir; if ( ( angle >= 0.0 && angle <= 180.0 ) || angle < -180.0 ) clockWise = true; if ( clockWise ) { if ( dir < d_data->previousDir && mouseOffset() > 0.0 ) { // We passed 360 -> 0 setMouseOffset( mouseOffset() - completeCircle ); } if ( wrapping() ) { if ( posValue - mouseOffset() > maxValue() ) { // We passed maxValue and the value will be set // to minValue. We have to adjust the mouseOffset. setMouseOffset( posValue - minValue() ); } } else { if ( posValue - mouseOffset() > maxValue() || value() == maxValue() ) { // We fix the value at maxValue by adjusting // the mouse offset. setMouseOffset( posValue - maxValue() ); } } } else { if ( dir > d_data->previousDir && mouseOffset() < 0.0 ) { // We passed 0 -> 360 setMouseOffset( mouseOffset() + completeCircle ); } if ( wrapping() ) { if ( posValue - mouseOffset() < minValue() ) { // We passed minValue and the value will be set // to maxValue. We have to adjust the mouseOffset. setMouseOffset( posValue - maxValue() ); } } else { if ( posValue - mouseOffset() < minValue() || value() == minValue() ) { // We fix the value at minValue by adjusting // the mouse offset. setMouseOffset( posValue - minValue() ); } } } } d_data->previousDir = dir; } return posValue; } /*! See QwtAbstractSlider::getScrollMode() \param pos point where the mouse was pressed \retval scrollMode The scrolling mode \retval direction direction: 1, 0, or -1. \sa QwtAbstractSlider::getScrollMode() */ void QwtDial::getScrollMode( const QPoint &pos, int &scrollMode, int &direction ) { direction = 0; scrollMode = ScrNone; const QRegion region( contentsRect(), QRegion::Ellipse ); if ( region.contains( pos ) && pos != rect().center() ) { scrollMode = ScrMouse; d_data->previousDir = -1.0; } } /*! Handles key events - Key_Down, KeyLeft\n Decrement by 1 - Key_Prior\n Decrement by pageSize() - Key_Home\n Set the value to minValue() - Key_Up, KeyRight\n Increment by 1 - Key_Next\n Increment by pageSize() - Key_End\n Set the value to maxValue() \param event Key event \sa isReadOnly() */ void QwtDial::keyPressEvent( QKeyEvent *event ) { if ( isReadOnly() ) { event->ignore(); return; } if ( !isValid() ) return; double previous = prevValue(); switch ( event->key() ) { case Qt::Key_Down: case Qt::Key_Left: QwtDoubleRange::incValue( -1 ); break; case Qt::Key_PageUp: QwtDoubleRange::incValue( -pageSize() ); break; case Qt::Key_Home: setValue( minValue() ); break; case Qt::Key_Up: case Qt::Key_Right: QwtDoubleRange::incValue( 1 ); break; case Qt::Key_PageDown: QwtDoubleRange::incValue( pageSize() ); break; case Qt::Key_End: setValue( maxValue() ); break; default:; event->ignore(); } if ( value() != previous ) Q_EMIT sliderMoved( value() ); } /*! \brief Update the mask of the dial In case of "hasVisibleBackground() == false", the backgound is transparent by a mask. \sa showBackground(), hasVisibleBackground() */ void QwtDial::updateMask() { if ( d_data->visibleBackground ) clearMask(); else setMask( QRegion( boundingRect(), QRegion::Ellipse ) ); } starpu-1.1.5/starpu-top/qwt/qwt_plot.cpp0000644000373600000000000004742512571536557015310 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot.h" #include "qwt_plot_dict.h" #include "qwt_plot_layout.h" #include "qwt_scale_widget.h" #include "qwt_scale_engine.h" #include "qwt_text_label.h" #include "qwt_legend.h" #include "qwt_dyngrid_layout.h" #include "qwt_plot_canvas.h" #include #include #include #include #include class QwtPlot::PrivateData { public: QPointer lblTitle; QPointer canvas; QPointer legend; QwtPlotLayout *layout; bool autoReplot; }; /*! \brief Constructor \param parent Parent widget */ QwtPlot::QwtPlot( QWidget *parent ): QFrame( parent ) { initPlot( QwtText() ); } /*! \brief Constructor \param title Title text \param parent Parent widget */ QwtPlot::QwtPlot( const QwtText &title, QWidget *parent ): QFrame( parent ) { initPlot( title ); } //! Destructor QwtPlot::~QwtPlot() { detachItems( QwtPlotItem::Rtti_PlotItem, autoDelete() ); delete d_data->layout; deleteAxesData(); delete d_data; } /*! \brief Initializes a QwtPlot instance \param title Title text */ void QwtPlot::initPlot( const QwtText &title ) { d_data = new PrivateData; d_data->layout = new QwtPlotLayout; d_data->autoReplot = false; d_data->lblTitle = new QwtTextLabel( title, this ); d_data->lblTitle->setFont( QFont( fontInfo().family(), 14, QFont::Bold ) ); QwtText text( title ); text.setRenderFlags( Qt::AlignCenter | Qt::TextWordWrap ); d_data->lblTitle->setText( text ); d_data->legend = NULL; initAxesData(); d_data->canvas = new QwtPlotCanvas( this ); d_data->canvas->setFrameStyle( QFrame::Panel | QFrame::Sunken ); d_data->canvas->setLineWidth( 2 ); updateTabOrder(); setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ); } /*! \brief Adds handling of layout requests */ bool QwtPlot::event( QEvent *e ) { bool ok = QFrame::event( e ); switch ( e->type() ) { case QEvent::LayoutRequest: updateLayout(); break; case QEvent::PolishRequest: polish(); break; default:; } return ok; } //! Replots the plot if QwtPlot::autoReplot() is \c true. void QwtPlot::autoRefresh() { if ( d_data->autoReplot ) replot(); } /*! \brief Set or reset the autoReplot option If the autoReplot option is set, the plot will be updated implicitly by manipulating member functions. Since this may be time-consuming, it is recommended to leave this option switched off and call replot() explicitly if necessary. The autoReplot option is set to false by default, which means that the user has to call replot() in order to make changes visible. \param tf \c true or \c false. Defaults to \c true. \sa replot() */ void QwtPlot::setAutoReplot( bool tf ) { d_data->autoReplot = tf; } //! \return true if the autoReplot option is set. bool QwtPlot::autoReplot() const { return d_data->autoReplot; } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QString &title ) { if ( title != d_data->lblTitle->text().text() ) { d_data->lblTitle->setText( title ); updateLayout(); } } /*! Change the plot's title \param title New title */ void QwtPlot::setTitle( const QwtText &title ) { if ( title != d_data->lblTitle->text() ) { d_data->lblTitle->setText( title ); updateLayout(); } } //! \return the plot's title QwtText QwtPlot::title() const { return d_data->lblTitle->text(); } //! \return the plot's title QwtPlotLayout *QwtPlot::plotLayout() { return d_data->layout; } //! \return the plot's titel label. const QwtPlotLayout *QwtPlot::plotLayout() const { return d_data->layout; } //! \return the plot's titel label. QwtTextLabel *QwtPlot::titleLabel() { return d_data->lblTitle; } /*! \return the plot's titel label. */ const QwtTextLabel *QwtPlot::titleLabel() const { return d_data->lblTitle; } /*! \return the plot's legend \sa insertLegend() */ QwtLegend *QwtPlot::legend() { return d_data->legend; } /*! \return the plot's legend \sa insertLegend() */ const QwtLegend *QwtPlot::legend() const { return d_data->legend; } /*! \return the plot's canvas */ QwtPlotCanvas *QwtPlot::canvas() { return d_data->canvas; } /*! \return the plot's canvas */ const QwtPlotCanvas *QwtPlot::canvas() const { return d_data->canvas; } //! Polish void QwtPlot::polish() { replot(); } /*! Return sizeHint \sa minimumSizeHint() */ QSize QwtPlot::sizeHint() const { int dw = 0; int dh = 0; for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { const int niceDist = 40; const QwtScaleWidget *scaleWidget = axisWidget( axisId ); const QwtScaleDiv &scaleDiv = scaleWidget->scaleDraw()->scaleDiv(); const int majCnt = scaleDiv.ticks( QwtScaleDiv::MajorTick ).count(); if ( axisId == yLeft || axisId == yRight ) { int hDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().height(); if ( hDiff > dh ) dh = hDiff; } else { int wDiff = ( majCnt - 1 ) * niceDist - scaleWidget->minimumSizeHint().width(); if ( wDiff > dw ) dw = wDiff; } } } return minimumSizeHint() + QSize( dw, dh ); } /*! \brief Return a minimum size hint */ QSize QwtPlot::minimumSizeHint() const { QSize hint = d_data->layout->minimumSizeHint( this ); hint += QSize( 2 * frameWidth(), 2 * frameWidth() ); return hint; } /*! Resize and update internal layout \param e Resize event */ void QwtPlot::resizeEvent( QResizeEvent *e ) { QFrame::resizeEvent( e ); updateLayout(); } /*! \brief Redraw the plot If the autoReplot option is not set (which is the default) or if any curves are attached to raw data, the plot has to be refreshed explicitly in order to make changes visible. \sa setAutoReplot() \warning Calls canvas()->repaint, take care of infinite recursions */ void QwtPlot::replot() { bool doAutoReplot = autoReplot(); setAutoReplot( false ); updateAxes(); /* Maybe the layout needs to be updated, because of changed axes labels. We need to process them here before painting to avoid that scales and canvas get out of sync. */ QApplication::sendPostedEvents( this, QEvent::LayoutRequest ); d_data->canvas->replot(); setAutoReplot( doAutoReplot ); } /*! \brief Adjust plot content to its current size. \sa resizeEvent() */ void QwtPlot::updateLayout() { d_data->layout->activate( this, contentsRect() ); QRect titleRect = d_data->layout->titleRect().toRect(); QRect scaleRect[QwtPlot::axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) scaleRect[axisId] = d_data->layout->scaleRect( axisId ).toRect(); QRect legendRect = d_data->layout->legendRect().toRect(); QRect canvasRect = d_data->layout->canvasRect().toRect(); // // resize and show the visible widgets // if ( !d_data->lblTitle->text().isEmpty() ) { d_data->lblTitle->setGeometry( titleRect ); if ( !d_data->lblTitle->isVisible() ) d_data->lblTitle->show(); } else d_data->lblTitle->hide(); for ( int axisId = 0; axisId < axisCnt; axisId++ ) { if ( axisEnabled( axisId ) ) { axisWidget( axisId )->setGeometry( scaleRect[axisId] ); if ( axisId == xBottom || axisId == xTop ) { QRegion r( scaleRect[axisId] ); if ( axisEnabled( yLeft ) ) r = r.subtract( QRegion( scaleRect[yLeft] ) ); if ( axisEnabled( yRight ) ) r = r.subtract( QRegion( scaleRect[yRight] ) ); r.translate( -d_data->layout->scaleRect( axisId ).x(), -scaleRect[axisId].y() ); axisWidget( axisId )->setMask( r ); } if ( !axisWidget( axisId )->isVisible() ) axisWidget( axisId )->show(); } else axisWidget( axisId )->hide(); } if ( d_data->legend && d_data->layout->legendPosition() != ExternalLegend ) { if ( d_data->legend->itemCount() > 0 ) { d_data->legend->setGeometry( legendRect ); d_data->legend->show(); } else d_data->legend->hide(); } d_data->canvas->setGeometry( canvasRect ); } /*! Update the focus tab order The order is changed so that the canvas will be in front of the first legend item, or behind the last legend item - depending on the position of the legend. */ void QwtPlot::updateTabOrder() { if ( d_data->canvas->focusPolicy() == Qt::NoFocus ) return; if ( d_data->legend.isNull() || d_data->layout->legendPosition() == ExternalLegend || d_data->legend->legendItems().count() == 0 ) { return; } // Depending on the position of the legend the // tab order will be changed that the canvas is // next to the last legend item, or before // the first one. const bool canvasFirst = d_data->layout->legendPosition() == QwtPlot::BottomLegend || d_data->layout->legendPosition() == QwtPlot::RightLegend; QWidget *previous = NULL; QWidget *w = d_data->canvas; while ( ( w = w->nextInFocusChain() ) != d_data->canvas ) { bool isLegendItem = false; if ( w->focusPolicy() != Qt::NoFocus && w->parent() && w->parent() == d_data->legend->contentsWidget() ) { isLegendItem = true; } if ( canvasFirst ) { if ( isLegendItem ) break; previous = w; } else { if ( isLegendItem ) previous = w; else { if ( previous ) break; } } } if ( previous && previous != d_data->canvas ) setTabOrder( previous, d_data->canvas ); } /*! Redraw the canvas. \param painter Painter used for drawing \warning drawCanvas calls drawItems what is also used for printing. Applications that like to add individual plot items better overload drawItems() \sa drawItems() */ void QwtPlot::drawCanvas( QPainter *painter ) { QwtScaleMap maps[axisCnt]; for ( int axisId = 0; axisId < axisCnt; axisId++ ) maps[axisId] = canvasMap( axisId ); drawItems( painter, d_data->canvas->contentsRect(), maps ); } /*! Redraw the canvas items. \param painter Painter used for drawing \param canvasRect Bounding rectangle where to paint \param map QwtPlot::axisCnt maps, mapping between plot and paint device coordinates */ void QwtPlot::drawItems( QPainter *painter, const QRectF &canvasRect, const QwtScaleMap map[axisCnt] ) const { const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { QwtPlotItem *item = *it; if ( item && item->isVisible() ) { painter->save(); painter->setRenderHint( QPainter::Antialiasing, item->testRenderHint( QwtPlotItem::RenderAntialiased ) ); item->draw( painter, map[item->xAxis()], map[item->yAxis()], canvasRect ); painter->restore(); } } } /*! \param axisId Axis \return Map for the axis on the canvas. With this map pixel coordinates can translated to plot coordinates and vice versa. \sa QwtScaleMap, transform(), invTransform() */ QwtScaleMap QwtPlot::canvasMap( int axisId ) const { QwtScaleMap map; if ( !d_data->canvas ) return map; map.setTransformation( axisScaleEngine( axisId )->transformation() ); const QwtScaleDiv *sd = axisScaleDiv( axisId ); map.setScaleInterval( sd->lowerBound(), sd->upperBound() ); if ( axisEnabled( axisId ) ) { const QwtScaleWidget *s = axisWidget( axisId ); if ( axisId == yLeft || axisId == yRight ) { double y = s->y() + s->startBorderDist() - d_data->canvas->y(); double h = s->height() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( y + h, y ); } else { double x = s->x() + s->startBorderDist() - d_data->canvas->x(); double w = s->width() - s->startBorderDist() - s->endBorderDist(); map.setPaintInterval( x, x + w ); } } else { int margin = 0; if ( !plotLayout()->alignCanvasToScales() ) margin = plotLayout()->canvasMargin( axisId ); const QRect &canvasRect = d_data->canvas->contentsRect(); if ( axisId == yLeft || axisId == yRight ) { map.setPaintInterval( canvasRect.bottom() - margin, canvasRect.top() + margin ); } else { map.setPaintInterval( canvasRect.left() + margin, canvasRect.right() - margin ); } } return map; } /*! Change the margin of the plot. The margin is the space around all components. \param margin new margin \sa QwtPlotLayout::setMargin(), margin(), plotLayout() */ void QwtPlot::setMargin( int margin ) { if ( margin < 0 ) margin = 0; if ( margin != d_data->layout->margin() ) { d_data->layout->setMargin( margin ); updateLayout(); } } /*! \return margin \sa setMargin(), QwtPlotLayout::margin(), plotLayout() */ int QwtPlot::margin() const { return d_data->layout->margin(); } /*! \brief Change the background of the plotting area Sets c to QPalette::Window of all colorgroups of the palette of the canvas. Using canvas()->setPalette() is a more powerful way to set these colors. \param c new background color */ void QwtPlot::setCanvasBackground( const QColor &c ) { QPalette p = d_data->canvas->palette(); for ( int i = 0; i < QPalette::NColorGroups; i++ ) p.setColor( ( QPalette::ColorGroup )i, QPalette::Window, c ); canvas()->setPalette( p ); } /*! Nothing else than: canvas()->palette().color( QPalette::Normal, QPalette::Window); \return the background color of the plotting area. */ const QColor &QwtPlot::canvasBackground() const { return canvas()->palette().color( QPalette::Normal, QPalette::Window ); } /*! \brief Change the border width of the plotting area Nothing else than canvas()->setLineWidth(w), left for compatibility only. \param w new border width */ void QwtPlot::setCanvasLineWidth( int w ) { canvas()->setLineWidth( w ); updateLayout(); } /*! Nothing else than: canvas()->lineWidth(), left for compatibility only. \return the border width of the plotting area */ int QwtPlot::canvasLineWidth() const { return canvas()->lineWidth(); } /*! \return \c true if the specified axis exists, otherwise \c false \param axisId axis index */ bool QwtPlot::axisValid( int axisId ) { return ( ( axisId >= QwtPlot::yLeft ) && ( axisId < QwtPlot::axisCnt ) ); } /*! Called internally when the legend has been clicked on. Emits a legendClicked() signal. */ void QwtPlot::legendItemClicked() { if ( d_data->legend && sender()->isWidgetType() ) { QwtPlotItem *plotItem = ( QwtPlotItem* )d_data->legend->find( ( QWidget * )sender() ); if ( plotItem ) Q_EMIT legendClicked( plotItem ); } } /*! Called internally when the legend has been checked Emits a legendClicked() signal. */ void QwtPlot::legendItemChecked( bool on ) { if ( d_data->legend && sender()->isWidgetType() ) { QwtPlotItem *plotItem = ( QwtPlotItem* )d_data->legend->find( ( QWidget * )sender() ); if ( plotItem ) Q_EMIT legendChecked( plotItem, on ); } } /*! \brief Insert a legend If the position legend is \c QwtPlot::LeftLegend or \c QwtPlot::RightLegend the legend will be organized in one column from top to down. Otherwise the legend items will be placed in a table with a best fit number of columns from left to right. If pos != QwtPlot::ExternalLegend the plot widget will become parent of the legend. It will be deleted when the plot is deleted, or another legend is set with insertLegend(). \param legend Legend \param pos The legend's position. For top/left position the number of colums will be limited to 1, otherwise it will be set to unlimited. \param ratio Ratio between legend and the bounding rect of title, canvas and axes. The legend will be shrinked if it would need more space than the given ratio. The ratio is limited to ]0.0 .. 1.0]. In case of <= 0.0 it will be reset to the default ratio. The default vertical/horizontal ratio is 0.33/0.5. \sa legend(), QwtPlotLayout::legendPosition(), QwtPlotLayout::setLegendPosition() */ void QwtPlot::insertLegend( QwtLegend *legend, QwtPlot::LegendPosition pos, double ratio ) { d_data->layout->setLegendPosition( pos, ratio ); if ( legend != d_data->legend ) { if ( d_data->legend && d_data->legend->parent() == this ) delete d_data->legend; d_data->legend = legend; if ( d_data->legend ) { if ( pos != ExternalLegend ) { if ( d_data->legend->parent() != this ) d_data->legend->setParent( this ); } const QwtPlotItemList& itmList = itemList(); for ( QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it ) { ( *it )->updateLegend( d_data->legend ); } QLayout *l = d_data->legend->contentsWidget()->layout(); if ( l && l->inherits( "QwtDynGridLayout" ) ) { QwtDynGridLayout *tl = ( QwtDynGridLayout * )l; switch ( d_data->layout->legendPosition() ) { case LeftLegend: case RightLegend: tl->setMaxCols( 1 ); // 1 column: align vertical break; case TopLegend: case BottomLegend: tl->setMaxCols( 0 ); // unlimited break; case ExternalLegend: break; } } } updateTabOrder(); } updateLayout(); } starpu-1.1.5/starpu-top/qwt/qwt_abstract_slider.cpp0000644000373600000000000003270712571536560017466 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_slider.h" #include "qwt_math.h" #include #include #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #define qExp(x) ::exp(x) #endif class QwtAbstractSlider::PrivateData { public: PrivateData(): scrollMode( ScrNone ), mouseOffset( 0.0 ), tracking( true ), tmrID( 0 ), updTime( 150 ), mass( 0.0 ), readOnly( false ) { } int scrollMode; double mouseOffset; int direction; int tracking; int tmrID; int updTime; int timerTick; QTime time; double speed; double mass; Qt::Orientation orientation; bool readOnly; }; /*! \brief Constructor \param orientation Orientation \param parent Parent widget */ QwtAbstractSlider::QwtAbstractSlider( Qt::Orientation orientation, QWidget *parent ): QWidget( parent, NULL ) { d_data = new QwtAbstractSlider::PrivateData; d_data->orientation = orientation; setFocusPolicy( Qt::TabFocus ); } //! Destructor QwtAbstractSlider::~QwtAbstractSlider() { if ( d_data->tmrID ) killTimer( d_data->tmrID ); delete d_data; } /*! En/Disable read only mode In read only mode the slider can't be controlled by mouse or keyboard. \param readOnly Enables in case of true \sa isReadOnly() */ void QwtAbstractSlider::setReadOnly( bool readOnly ) { d_data->readOnly = readOnly; update(); } /*! In read only mode the slider can't be controlled by mouse or keyboard. \return true if read only \sa setReadOnly() */ bool QwtAbstractSlider::isReadOnly() const { return d_data->readOnly; } /*! \brief Set the orientation. \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical. */ void QwtAbstractSlider::setOrientation( Qt::Orientation o ) { d_data->orientation = o; } /*! \return Orientation \sa setOrientation() */ Qt::Orientation QwtAbstractSlider::orientation() const { return d_data->orientation; } //! Stop updating if automatic scrolling is active void QwtAbstractSlider::stopMoving() { if ( d_data->tmrID ) { killTimer( d_data->tmrID ); d_data->tmrID = 0; } } /*! \brief Specify the update interval for automatic scrolling \param t update interval in milliseconds \sa getScrollMode() */ void QwtAbstractSlider::setUpdateTime( int t ) { if ( t < 50 ) t = 50; d_data->updTime = t; } /*! Mouse press event handler \param e Mouse event */ void QwtAbstractSlider::mousePressEvent( QMouseEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; const QPoint &p = e->pos(); d_data->timerTick = 0; getScrollMode( p, d_data->scrollMode, d_data->direction ); stopMoving(); switch ( d_data->scrollMode ) { case ScrPage: case ScrTimer: d_data->mouseOffset = 0; d_data->tmrID = startTimer( qMax( 250, 2 * d_data->updTime ) ); break; case ScrMouse: d_data->time.start(); d_data->speed = 0; d_data->mouseOffset = getValue( p ) - value(); Q_EMIT sliderPressed(); break; default: d_data->mouseOffset = 0; d_data->direction = 0; break; } } //! Emits a valueChanged() signal if necessary void QwtAbstractSlider::buttonReleased() { if ( ( !d_data->tracking ) || ( value() != prevValue() ) ) Q_EMIT valueChanged( value() ); } /*! Mouse Release Event handler \param e Mouse event */ void QwtAbstractSlider::mouseReleaseEvent( QMouseEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; const double inc = step(); switch ( d_data->scrollMode ) { case ScrMouse: { setPosition( e->pos() ); d_data->direction = 0; d_data->mouseOffset = 0; if ( d_data->mass > 0.0 ) { const int ms = d_data->time.elapsed(); if ( ( qFabs( d_data->speed ) > 0.0 ) && ( ms < 50 ) ) d_data->tmrID = startTimer( d_data->updTime ); } else { d_data->scrollMode = ScrNone; buttonReleased(); } Q_EMIT sliderReleased(); break; } case ScrDirect: { setPosition( e->pos() ); d_data->direction = 0; d_data->mouseOffset = 0; d_data->scrollMode = ScrNone; buttonReleased(); break; } case ScrPage: { stopMoving(); if ( !d_data->timerTick ) QwtDoubleRange::incPages( d_data->direction ); d_data->timerTick = 0; buttonReleased(); d_data->scrollMode = ScrNone; break; } case ScrTimer: { stopMoving(); if ( !d_data->timerTick ) QwtDoubleRange::fitValue( value() + double( d_data->direction ) * inc ); d_data->timerTick = 0; buttonReleased(); d_data->scrollMode = ScrNone; break; } default: { d_data->scrollMode = ScrNone; buttonReleased(); } } } /*! Move the slider to a specified point, adjust the value and emit signals if necessary. */ void QwtAbstractSlider::setPosition( const QPoint &p ) { QwtDoubleRange::fitValue( getValue( p ) - d_data->mouseOffset ); } /*! \brief Enables or disables tracking. If tracking is enabled, the slider emits a valueChanged() signal whenever its value changes (the default behaviour). If tracking is disabled, the value changed() signal will only be emitted if:
  • the user releases the mouse button and the value has changed or
  • at the end of automatic scrolling.
Tracking is enabled by default. \param enable \c true (enable) or \c false (disable) tracking. */ void QwtAbstractSlider::setTracking( bool enable ) { d_data->tracking = enable; } /*! Mouse Move Event handler \param e Mouse event */ void QwtAbstractSlider::mouseMoveEvent( QMouseEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; if ( d_data->scrollMode == ScrMouse ) { setPosition( e->pos() ); if ( d_data->mass > 0.0 ) { double ms = double( d_data->time.elapsed() ); if ( ms < 1.0 ) ms = 1.0; d_data->speed = ( exactValue() - exactPrevValue() ) / ms; d_data->time.start(); } if ( value() != prevValue() ) Q_EMIT sliderMoved( value() ); } } /*! Wheel Event handler \param e Whell event */ void QwtAbstractSlider::wheelEvent( QWheelEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; int mode = ScrNone, direction = 0; // Give derived classes a chance to say ScrNone getScrollMode( e->pos(), mode, direction ); if ( mode != ScrNone ) { // Most mouse types work in steps of 15 degrees, in which case // the delta value is a multiple of 120 const int inc = e->delta() / 120; QwtDoubleRange::incPages( inc ); if ( value() != prevValue() ) Q_EMIT sliderMoved( value() ); } } /*! Handles key events - Key_Down, KeyLeft\n Decrement by 1 - Key_Up, Key_Right\n Increment by 1 \param e Key event \sa isReadOnly() */ void QwtAbstractSlider::keyPressEvent( QKeyEvent *e ) { if ( isReadOnly() ) { e->ignore(); return; } if ( !isValid() ) return; int increment = 0; switch ( e->key() ) { case Qt::Key_Down: if ( orientation() == Qt::Vertical ) increment = -1; break; case Qt::Key_Up: if ( orientation() == Qt::Vertical ) increment = 1; break; case Qt::Key_Left: if ( orientation() == Qt::Horizontal ) increment = -1; break; case Qt::Key_Right: if ( orientation() == Qt::Horizontal ) increment = 1; break; default:; e->ignore(); } if ( increment != 0 ) { QwtDoubleRange::incValue( increment ); if ( value() != prevValue() ) Q_EMIT sliderMoved( value() ); } } /*! Qt timer event \param e Timer event */ void QwtAbstractSlider::timerEvent( QTimerEvent * ) { const double inc = step(); switch ( d_data->scrollMode ) { case ScrMouse: { if ( d_data->mass > 0.0 ) { d_data->speed *= qExp( - double( d_data->updTime ) * 0.001 / d_data->mass ); const double newval = exactValue() + d_data->speed * double( d_data->updTime ); QwtDoubleRange::fitValue( newval ); // stop if d_data->speed < one step per second if ( qFabs( d_data->speed ) < 0.001 * qFabs( step() ) ) { d_data->speed = 0; stopMoving(); buttonReleased(); } } else stopMoving(); break; } case ScrPage: { QwtDoubleRange::incPages( d_data->direction ); if ( !d_data->timerTick ) { killTimer( d_data->tmrID ); d_data->tmrID = startTimer( d_data->updTime ); } break; } case ScrTimer: { QwtDoubleRange::fitValue( value() + double( d_data->direction ) * inc ); if ( !d_data->timerTick ) { killTimer( d_data->tmrID ); d_data->tmrID = startTimer( d_data->updTime ); } break; } default: { stopMoving(); break; } } d_data->timerTick = 1; } /*! Notify change of value This function can be reimplemented by derived classes in order to keep track of changes, i.e. repaint the widget. The default implementation emits a valueChanged() signal if tracking is enabled. */ void QwtAbstractSlider::valueChange() { if ( d_data->tracking ) Q_EMIT valueChanged( value() ); } /*! \brief Set the slider's mass for flywheel effect. If the slider's mass is greater then 0, it will continue to move after the mouse button has been released. Its speed decreases with time at a rate depending on the slider's mass. A large mass means that it will continue to move for a long time. Derived widgets may overload this function to make it public. \param val New mass in kg \bug If the mass is smaller than 1g, it is set to zero. The maximal mass is limited to 100kg. \sa mass() */ void QwtAbstractSlider::setMass( double val ) { if ( val < 0.001 ) d_data->mass = 0.0; else if ( val > 100.0 ) d_data->mass = 100.0; else d_data->mass = val; } /*! \return mass \sa setMass() */ double QwtAbstractSlider::mass() const { return d_data->mass; } /*! \brief Move the slider to a specified value This function can be used to move the slider to a value which is not an integer multiple of the step size. \param val new value \sa fitValue() */ void QwtAbstractSlider::setValue( double val ) { if ( d_data->scrollMode == ScrMouse ) stopMoving(); QwtDoubleRange::setValue( val ); } /*! \brief Set the slider's value to the nearest integer multiple of the step size. \param value Value \sa setValue(), incValue() */ void QwtAbstractSlider::fitValue( double value ) { if ( d_data->scrollMode == ScrMouse ) stopMoving(); QwtDoubleRange::fitValue( value ); } /*! \brief Increment the value by a specified number of steps \param steps number of steps \sa setValue() */ void QwtAbstractSlider::incValue( int steps ) { if ( d_data->scrollMode == ScrMouse ) stopMoving(); QwtDoubleRange::incValue( steps ); } /*! \sa mouseOffset() */ void QwtAbstractSlider::setMouseOffset( double offset ) { d_data->mouseOffset = offset; } /*! \sa setMouseOffset() */ double QwtAbstractSlider::mouseOffset() const { return d_data->mouseOffset; } //! sa ScrollMode int QwtAbstractSlider::scrollMode() const { return d_data->scrollMode; } starpu-1.1.5/starpu-top/qwt/qwt_dyngrid_layout.h0000644000373600000000000000455712571536557017033 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DYNGRID_LAYOUT_H #define QWT_DYNGRID_LAYOUT_H #include "qwt_global.h" #include #include #include /*! \brief The QwtDynGridLayout class lays out widgets in a grid, adjusting the number of columns and rows to the current size. QwtDynGridLayout takes the space it gets, divides it up into rows and columns, and puts each of the widgets it manages into the correct cell(s). It lays out as many number of columns as possible (limited by maxCols()). */ class QWT_EXPORT QwtDynGridLayout : public QLayout { Q_OBJECT public: explicit QwtDynGridLayout( QWidget *, int margin = 0, int space = -1 ); explicit QwtDynGridLayout( int space = -1 ); virtual ~QwtDynGridLayout(); virtual void invalidate(); void setMaxCols( uint maxCols ); uint maxCols() const; uint numRows () const; uint numCols () const; virtual void addItem( QLayoutItem * ); virtual QLayoutItem *itemAt( int index ) const; virtual QLayoutItem *takeAt( int index ); virtual int count() const; void setExpandingDirections( Qt::Orientations ); virtual Qt::Orientations expandingDirections() const; QList layoutItems( const QRect &, uint numCols ) const; virtual int maxItemWidth() const; virtual void setGeometry( const QRect &rect ); virtual bool hasHeightForWidth() const; virtual int heightForWidth( int ) const; virtual QSize sizeHint() const; virtual bool isEmpty() const; uint itemCount() const; virtual uint columnsForWidth( int width ) const; protected: void layoutGrid( uint numCols, QVector& rowHeight, QVector& colWidth ) const; void stretchGrid( const QRect &rect, uint numCols, QVector& rowHeight, QVector& colWidth ) const; private: void init(); int maxRowWidth( int numCols ) const; class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_seriesitem.cpp0000644000373600000000000000427212571536557017532 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_seriesitem.h" class QwtPlotAbstractSeriesItem::PrivateData { public: PrivateData(): orientation( Qt::Vertical ) { } Qt::Orientation orientation; }; /*! Constructor \param title Title of the curve */ QwtPlotAbstractSeriesItem::QwtPlotAbstractSeriesItem( const QwtText &title ): QwtPlotItem( title ) { d_data = new PrivateData(); } /*! Constructor \param title Title of the curve */ QwtPlotAbstractSeriesItem::QwtPlotAbstractSeriesItem( const QString &title ): QwtPlotItem( QwtText( title ) ) { d_data = new PrivateData(); } //! Destructor QwtPlotAbstractSeriesItem::~QwtPlotAbstractSeriesItem() { delete d_data; } /*! Set the orientation of the item. The orientation() might be used in specific way by a plot item. F.e. a QwtPlotCurve uses it to identify how to display the curve int QwtPlotCurve::Steps or QwtPlotCurve::Sticks style. \sa orientation() */ void QwtPlotAbstractSeriesItem::setOrientation( Qt::Orientation orientation ) { if ( d_data->orientation != orientation ) { d_data->orientation = orientation; itemChanged(); } } /*! \return Orientation of the plot item \sa setOrientation() */ Qt::Orientation QwtPlotAbstractSeriesItem::orientation() const { return d_data->orientation; } /*! \brief Draw the complete series \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas */ void QwtPlotAbstractSeriesItem::draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const { drawSeries( painter, xMap, yMap, canvasRect, 0, -1 ); } starpu-1.1.5/starpu-top/qwt/qwt_series_data.cpp0000644000373600000000000003166612571536557016615 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_series_data.h" #include "qwt_math.h" static inline QRectF qwtBoundingRect( const QPointF &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPoint3D &sample ) { return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtPointPolar &sample ) { return QRectF( sample.azimuth(), sample.radius(), 0.0, 0.0 ); } static inline QRectF qwtBoundingRect( const QwtIntervalSample &sample ) { return QRectF( sample.interval.minValue(), sample.value, sample.interval.maxValue() - sample.interval.minValue(), 0.0 ); } static inline QRectF qwtBoundingRect( const QwtSetSample &sample ) { double minX = sample.set[0]; double maxX = sample.set[0]; for ( int i = 1; i < ( int )sample.set.size(); i++ ) { if ( sample.set[i] < minX ) minX = sample.set[i]; if ( sample.set[i] > maxX ) maxX = sample.set[i]; } double minY = sample.value; double maxY = sample.value; return QRectF( minX, minY, maxX - minX, maxY - minY ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ template QRectF qwtBoundingRectT( const QwtSeriesData& series ) { QRectF boundingRect( 1.0, 1.0, -2.0, -2.0 ); // invalid; const size_t sz = series.size(); if ( sz <= 0 ) return boundingRect; size_t i; for ( i = 0; i < sz; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect = rect; i++; break; } } for ( ; i < sz; i++ ) { const QRectF rect = qwtBoundingRect( series.sample( i ) ); if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) { boundingRect.setLeft( qMin( boundingRect.left(), rect.left() ) ); boundingRect.setRight( qMax( boundingRect.right(), rect.right() ) ); boundingRect.setTop( qMin( boundingRect.top(), rect.top() ) ); boundingRect.setBottom( qMax( boundingRect.bottom(), rect.bottom() ) ); } } return boundingRect; } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series The horizontal coordinates represent the azimuth, the vertical coordinates the radius. Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData &series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series ) { return qwtBoundingRectT( series ); } /*! \brief Calculate the bounding rect of a series Slow implementation, that iterates over the series. \param series Series \return Bounding rectangle */ QRectF qwtBoundingRect( const QwtSeriesData& series ) { return qwtBoundingRectT( series ); } /*! Constructor \param samples Samples */ QwtPointSeriesData::QwtPointSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtPoint3DSeriesData::QwtPoint3DSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPoint3DSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtIntervalSeriesData::QwtIntervalSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtIntervalSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param samples Samples */ QwtSetSeriesData::QwtSetSeriesData( const QVector &samples ): QwtArraySeriesData( samples ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtSetSeriesData::boundingRect() const { if ( d_boundingRect.width() < 0.0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } /*! Constructor \param x Array of x values \param y Array of y values \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const QVector &x, const QVector &y ): d_x( x ), d_y( y ) { } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \sa QwtPlotCurve::setData(), QwtPlotCurve::setSamples() */ QwtPointArrayData::QwtPointArrayData( const double *x, const double *y, size_t size ) { d_x.resize( size ); qMemCopy( d_x.data(), x, size * sizeof( double ) ); d_y.resize( size ); qMemCopy( d_y.data(), y, size * sizeof( double ) ); } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtPointArrayData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtPointArrayData::size() const { return qMin( d_x.size(), d_y.size() ); } /*! Return the sample at position i \param i Index \return Sample at position i */ QPointF QwtPointArrayData::sample( size_t i ) const { return QPointF( d_x[int( i )], d_y[int( i )] ); } //! \return Array of the x-values const QVector &QwtPointArrayData::xData() const { return d_x; } //! \return Array of the y-values const QVector &QwtPointArrayData::yData() const { return d_y; } /*! Constructor \param x Array of x values \param y Array of y values \param size Size of the x and y arrays \warning The programmer must assure that the memory blocks referenced by the pointers remain valid during the lifetime of the QwtPlotCPointer object. \sa QwtPlotCurve::setData(), QwtPlotCurve::setRawSamples() */ QwtCPointerData::QwtCPointerData( const double *x, const double *y, size_t size ): d_x( x ), d_y( y ), d_size( size ) { } /*! \brief Calculate the bounding rect The bounding rectangle is calculated once by iterating over all points and is stored for all following requests. \return Bounding rectangle */ QRectF QwtCPointerData::boundingRect() const { if ( d_boundingRect.width() < 0 ) d_boundingRect = qwtBoundingRect( *this ); return d_boundingRect; } //! \return Size of the data set size_t QwtCPointerData::size() const { return d_size; } /*! Return the sample at position i \param i Index \return Sample at position i */ QPointF QwtCPointerData::sample( size_t i ) const { return QPointF( d_x[int( i )], d_y[int( i )] ); } //! \return Array of the x-values const double *QwtCPointerData::xData() const { return d_x; } //! \return Array of the y-values const double *QwtCPointerData::yData() const { return d_y; } /*! Constructor \param size Number of points \param interval Bounding interval for the points \sa setInterval(), setSize() */ QwtSyntheticPointData::QwtSyntheticPointData( size_t size, const QwtInterval &interval ): d_size( size ), d_interval( interval ) { } /*! Change the number of points \param size Number of points \sa size(), setInterval() */ void QwtSyntheticPointData::setSize( size_t size ) { d_size = size; } /*! \return Number of points \sa setSize(), interval() */ size_t QwtSyntheticPointData::size() const { return d_size; } /*! Set the bounding interval \param interval Interval \sa interval(), setSize() */ void QwtSyntheticPointData::setInterval( const QwtInterval &interval ) { d_interval = interval.normalized(); } /*! \return Bounding interval \sa setInterval(), size() */ QwtInterval QwtSyntheticPointData::interval() const { return d_interval; } /*! Set a the "rect of interest" QwtPlotSeriesItem defines the current area of the plot canvas as "rect of interest" ( QwtPlotSeriesItem::updateScaleDiv() ). If interval().isValid() == false the x values are calculated in the interval rect.left() -> rect.right(). \sa rectOfInterest() */ void QwtSyntheticPointData::setRectOfInterest( const QRectF &rect ) { d_rectOfInterest = rect; d_intervalOfInterest = QwtInterval( rect.left(), rect.right() ).normalized(); } /*! \return "rect of interest" \sa setRectOfInterest() */ QRectF QwtSyntheticPointData::rectOfInterest() const { return d_rectOfInterest; } /*! \brief Calculate the bounding rect This implementation iterates over all points, what could often be implemented much faster using the characteristics of the series. When there are many points it is recommended to overload and reimplement this method using the characteristics of the series ( if possible ). \return Bounding rectangle */ QRectF QwtSyntheticPointData::boundingRect() const { if ( d_size == 0 || !( d_interval.isValid() || d_intervalOfInterest.isValid() ) ) { return QRectF(1.0, 1.0, -2.0, -2.0); // something invalid } return qwtBoundingRect( *this ); } /*! Calculate the point from an index \param index Index \return QPointF(x(index), y(x(index))); \warning For invalid indices ( index < 0 || index >= size() ) (0, 0) is returned. */ QPointF QwtSyntheticPointData::sample( size_t index ) const { if ( index >= d_size ) return QPointF( 0, 0 ); const double xValue = x( index ); const double yValue = y( xValue ); return QPointF( xValue, yValue ); } /*! Calculate a x-value from an index x values are calculated by deviding an interval into equidistant steps. If !interval().isValid() the interval is calculated from the "rect of interest". \sa interval(), rectOfInterest(), y() */ double QwtSyntheticPointData::x( uint index ) const { const QwtInterval &interval = d_interval.isValid() ? d_interval : d_intervalOfInterest; if ( !interval.isValid() || d_size == 0 || index >= d_size ) return 0.0; const double dx = interval.width() / d_size; return interval.minValue() + index * dx; } starpu-1.1.5/starpu-top/qwt/qwt_text.h0000644000373600000000000001350412571536557014752 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_TEXT_H #define QWT_TEXT_H #include "qwt_global.h" #include #include #include class QColor; class QPen; class QBrush; class QRectF; class QPainter; class QwtTextEngine; /*! \brief A class representing a text A QwtText is a text including a set of attributes how to render it. - Format\n A text might include control sequences (f.e tags) describing how to render it. Each format (f.e MathML, TeX, Qt Rich Text) has its own set of control sequences, that can be handles by a QwtTextEngine for this format. - Background\n A text might have a background, defined by a QPen and QBrush to improve its visibility. - Font\n A text might have an individual font. - Color\n A text might have an individual color. - Render Flags\n Flags from Qt::AlignmentFlag and Qt::TextFlag used like in QPainter::drawText. \sa QwtTextEngine, QwtTextLabel */ class QWT_EXPORT QwtText { public: /*! \brief Text format The text format defines the QwtTextEngine, that is used to render the text. - AutoText\n The text format is determined using QwtTextEngine::mightRender for all available text engines in increasing order > PlainText. If none of the text engines can render the text is rendered like PlainText. - PlainText\n Draw the text as it is, using a QwtPlainTextEngine. - RichText\n Use the Scribe framework (Qt Rich Text) to render the text. - MathMLText\n Use a MathML (http://en.wikipedia.org/wiki/MathML) render engine to display the text. The Qwt MathML extension offers such an engine based on the MathML renderer of the Qt solutions package. To enable MathML support the following code needs to be added to the application: \verbatimQwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine());\endverbatim - TeXText\n Use a TeX (http://en.wikipedia.org/wiki/TeX) render engine to display the text ( not implemented yet ). - OtherFormat\n The number of text formats can be extended using setTextEngine. Formats >= OtherFormat are not used by Qwt. \sa QwtTextEngine, setTextEngine() */ enum TextFormat { AutoText = 0, PlainText, RichText, MathMLText, TeXText, OtherFormat = 100 }; /*! \brief Paint Attributes Font and color and background are optional attributes of a QwtText. The paint attributes hold the information, if they are set. - PaintUsingTextFont\n The text has an individual font. - PaintUsingTextColor\n The text has an individual color. - PaintBackground\n The text has an individual background. */ enum PaintAttribute { PaintUsingTextFont = 1, PaintUsingTextColor = 2, PaintBackground = 4 }; /*! \brief Layout Attributes The layout attributes affects some aspects of the layout of the text. - MinimumLayout\n Layout the text without its margins. This mode is useful if a text needs to be aligned accurately, like the tick labels of a scale. If QwtTextEngine::textMargins is not implemented for the format of the text, MinimumLayout has no effect. */ enum LayoutAttribute { MinimumLayout = 1 }; QwtText( const QString & = QString::null, TextFormat textFormat = AutoText ); QwtText( const QwtText & ); ~QwtText(); QwtText &operator=( const QwtText & ); bool operator==( const QwtText & ) const; bool operator!=( const QwtText & ) const; void setText( const QString &, QwtText::TextFormat textFormat = AutoText ); QString text() const; bool isNull() const; bool isEmpty() const; void setFont( const QFont & ); QFont font() const; QFont usedFont( const QFont & ) const; void setRenderFlags( int flags ); int renderFlags() const; void setColor( const QColor & ); QColor color() const; QColor usedColor( const QColor & ) const; void setBackgroundPen( const QPen & ); QPen backgroundPen() const; void setBackgroundBrush( const QBrush & ); QBrush backgroundBrush() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLayoutAttribute( LayoutAttribute, bool on = true ); bool testLayoutAttribute( LayoutAttribute ) const; double heightForWidth( double width, const QFont & = QFont() ) const; QSizeF textSize( const QFont & = QFont() ) const; void draw( QPainter *painter, const QRectF &rect ) const; static const QwtTextEngine *textEngine( const QString &text, QwtText::TextFormat = AutoText ); static const QwtTextEngine *textEngine( QwtText::TextFormat ); static void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); private: class PrivateData; PrivateData *d_data; class LayoutCache; LayoutCache *d_layoutCache; }; //! \return text().isNull() inline bool QwtText::isNull() const { return text().isNull(); } //! \return text().isEmpty() inline bool QwtText::isEmpty() const { return text().isEmpty(); } #endif starpu-1.1.5/starpu-top/qwt/qwt_symbol.cpp0000644000373600000000000006335312571536557015635 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_symbol.h" #include "qwt_painter.h" #include #include #include namespace QwtTriangle { enum Type { Left, Right, Up, Down }; } static inline void qwtDrawEllipseSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const QSize size = symbol.size(); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawEllipse( painter, r ); } } } static inline void qwtDrawRectSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const QRect r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const double x = points[i].x(); const double y = points[i].y(); const QRectF r( x - sw2, y - sh2, sw, sh ); QwtPainter::drawRect( painter, r ); } } } static inline void qwtDrawDiamondSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); if ( QwtPainter::roundingAlignment( painter ) ) { for ( int i = 0; i < numPoints; i++ ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ); const int x1 = x - size.width() / 2; const int y1 = y - size.height() / 2; const int x2 = x1 + size.width(); const int y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( x, y1 ); polygon += QPointF( x1, y ); polygon += QPointF( x, y2 ); polygon += QPointF( x2, y ); QwtPainter::drawPolygon( painter, polygon ); } } else { for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - 0.5 * size.width(); const double y1 = pos.y() - 0.5 * size.height(); const double x2 = x1 + size.width(); const double y2 = y1 + size.height(); QPolygonF polygon; polygon += QPointF( pos.x(), y1 ); polygon += QPointF( x2, pos.y() ); polygon += QPointF( pos.x(), y2 ); polygon += QPointF( x1, pos.y() ); QwtPainter::drawPolygon( painter, polygon ); } } } static inline void qwtDrawTriangleSymbols( QPainter *painter, QwtTriangle::Type type, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const bool doAlign = QwtPainter::roundingAlignment( painter ); double sw2 = 0.5 * size.width(); double sh2 = 0.5 * size.height(); if ( doAlign ) { sw2 = qFloor( sw2 ); sh2 = qFloor( sh2 ); } QPolygonF triangle( 3 ); QPointF *trianglePoints = triangle.data(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; double x = pos.x(); double y = pos.y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } const double x1 = x - sw2; const double x2 = x1 + size.width(); const double y1 = y - sh2; const double y2 = y1 + size.height(); switch ( type ) { case QwtTriangle::Left: { trianglePoints[0].rx() = x2; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x1; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Right: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x2; trianglePoints[1].ry() = y; trianglePoints[2].rx() = x1; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Up: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y2; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y1; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y2; break; } case QwtTriangle::Down: { trianglePoints[0].rx() = x1; trianglePoints[0].ry() = y1; trianglePoints[1].rx() = x; trianglePoints[1].ry() = y2; trianglePoints[2].rx() = x2; trianglePoints[2].ry() = y1; break; } } QwtPainter::drawPolygon( painter, triangle ); } } static inline void qwtDrawLineSymbols( QPainter *painter, int orientations, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); painter->setRenderHint( QPainter::Antialiasing, false ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = qFloor( size.width() ); const int sh = qFloor( size.height() ); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const int x = qRound( points[i].x() ) - sw2; const int y = qRound( points[i].y() ); QwtPainter::drawLine( painter, x, y, x + sw, y ); } if ( orientations & Qt::Vertical ) { const int x = qRound( points[i].x() ); const int y = qRound( points[i].y() ) - sh2; QwtPainter::drawLine( painter, x, y, x, y + sh ); } } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { if ( orientations & Qt::Horizontal ) { const double x = points[i].x() - sw2; const double y = points[i].y(); QwtPainter::drawLine( painter, x, y, x + sw, y ); } if ( orientations & Qt::Vertical ) { const double y = points[i].y() - sh2; const double x = points[i].x(); QwtPainter::drawLine( painter, x, y, x, y + sh ); } } } } static inline void qwtDrawXCrossSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); painter->setPen( pen ); if ( QwtPainter::roundingAlignment( painter ) ) { const int sw = size.width(); const int sh = size.height(); const int sw2 = size.width() / 2; const int sh2 = size.height() / 2; for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const int x = qRound( pos.x() ); const int y = qRound( pos.y() ); const int x1 = x - sw2; const int x2 = x1 + sw; const int y1 = y - sh2; const int y2 = y1 + sh; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x2, y1, x1, y2 ); } } else { const double sw = size.width(); const double sh = size.height(); const double sw2 = 0.5 * size.width(); const double sh2 = 0.5 * size.height(); for ( int i = 0; i < numPoints; i++ ) { const QPointF &pos = points[i]; const double x1 = pos.x() - sw2; const double x2 = x1 + sw; const double y1 = pos.y() - sh2; const double y2 = y1 + sh; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); QwtPainter::drawLine( painter, x1, y2, x2, y1 ); } } } static inline void qwtDrawStar1Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { const QSize size = symbol.size(); painter->setPen( symbol.pen() ); if ( QwtPainter::roundingAlignment( painter ) ) { QRect r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i].toPoint() ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.top() + d1 ), qRound( r.right() - d1 ), qRound( r.bottom() - d1 ) ); QwtPainter::drawLine( painter, qRound( r.left() + d1 ), qRound( r.bottom() - d1 ), qRound( r .right() - d1), qRound( r.top() + d1 ) ); const QPoint c = r.center(); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } else { QRectF r( 0, 0, size.width(), size.height() ); for ( int i = 0; i < numPoints; i++ ) { r.moveCenter( points[i] ); const double sqrt1_2 = 0.70710678118654752440; /* 1/sqrt(2) */ const QPointF c = r.center(); const double d1 = r.width() / 2.0 * ( 1.0 - sqrt1_2 ); QwtPainter::drawLine( painter, r.left() + d1, r.top() + d1, r.right() - d1, r.bottom() - d1 ); QwtPainter::drawLine( painter, r.left() + d1, r.bottom() - d1, r.right() - d1, r.top() + d1 ); QwtPainter::drawLine( painter, c.x(), r.top(), c.x(), r.bottom() ); QwtPainter::drawLine( painter, r.left(), c.y(), r.right(), c.y() ); } } } static inline void qwtDrawStar2Symbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { QPen pen = symbol.pen(); pen.setCapStyle( Qt::FlatCap ); pen.setJoinStyle( Qt::MiterJoin ); painter->setPen( pen ); painter->setBrush( symbol.brush() ); const double cos30 = 0.866025; // cos(30°) const double dy = 0.25 * symbol.size().height(); const double dx = 0.5 * symbol.size().width() * cos30 / 3.0; QPolygonF star( 12 ); QPointF *starPoints = star.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - 3 * dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qRound( x - 3 * dx ); y1 = qRound( y - 2 * dy ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double x4 = x1 + 3 * dx; const double x5 = x1 + 4 * dx; const double x6 = x1 + 5 * dx; const double x7 = x1 + 6 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 2 * dy; const double y4 = y1 + 3 * dy; const double y5 = y1 + 4 * dy; starPoints[0].rx() = x4; starPoints[0].ry() = y1; starPoints[1].rx() = x5; starPoints[1].ry() = y2; starPoints[2].rx() = x7; starPoints[2].ry() = y2; starPoints[3].rx() = x6; starPoints[3].ry() = y3; starPoints[4].rx() = x7; starPoints[4].ry() = y4; starPoints[5].rx() = x5; starPoints[5].ry() = y4; starPoints[6].rx() = x4; starPoints[6].ry() = y5; starPoints[7].rx() = x3; starPoints[7].ry() = y4; starPoints[8].rx() = x1; starPoints[8].ry() = y4; starPoints[9].rx() = x2; starPoints[9].ry() = y3; starPoints[10].rx() = x1; starPoints[10].ry() = y2; starPoints[11].rx() = x3; starPoints[11].ry() = y2; QwtPainter::drawPolygon( painter, star ); } } static inline void qwtDrawHexagonSymbols( QPainter *painter, const QPointF *points, int numPoints, const QwtSymbol &symbol ) { painter->setBrush( symbol.brush() ); painter->setPen( symbol.pen() ); const double cos30 = 0.866025; // cos(30°) const double dx = 0.5 * ( symbol.size().width() - cos30 ); const double dy = 0.25 * symbol.size().height(); QPolygonF hexaPolygon( 6 ); QPointF *hexaPoints = hexaPolygon.data(); const bool doAlign = QwtPainter::roundingAlignment( painter ); for ( int i = 0; i < numPoints; i++ ) { double x = points[i].x(); double y = points[i].y(); if ( doAlign ) { x = qRound( x ); y = qRound( y ); } double x1 = x - dx; double y1 = y - 2 * dy; if ( doAlign ) { x1 = qCeil( x1 ); y1 = qCeil( y1 ); } const double x2 = x1 + 1 * dx; const double x3 = x1 + 2 * dx; const double y2 = y1 + 1 * dy; const double y3 = y1 + 3 * dy; const double y4 = y1 + 4 * dy; hexaPoints[0].rx() = x2; hexaPoints[0].ry() = y1; hexaPoints[1].rx() = x3; hexaPoints[1].ry() = y2; hexaPoints[2].rx() = x3; hexaPoints[2].ry() = y3; hexaPoints[3].rx() = x2; hexaPoints[3].ry() = y4; hexaPoints[4].rx() = x1; hexaPoints[4].ry() = y3; hexaPoints[5].rx() = x1; hexaPoints[5].ry() = y2; QwtPainter::drawPolygon( painter, hexaPolygon ); } } class QwtSymbol::PrivateData { public: PrivateData( QwtSymbol::Style st, const QBrush &br, const QPen &pn, const QSize &sz ): style( st ), size( sz ), brush( br ), pen( pn ) { } bool operator==( const PrivateData &other ) const { return ( style == other.style ) && ( size == other.size ) && ( brush == other.brush ) && ( pen == other.pen ); } Style style; QSize size; QBrush brush; QPen pen; }; /*! Default Constructor \param style Symbol Style The symbol is constructed with gray interior, black outline with zero width, no size and style 'NoSymbol'. */ QwtSymbol::QwtSymbol( Style style ) { d_data = new PrivateData( style, QBrush( Qt::gray ), QPen( Qt::black ), QSize( 0.0, 0.0 ) ); } /*! \brief Constructor \param style Symbol Style \param brush brush to fill the interior \param pen outline pen \param size size \sa setStyle(), setBrush(), setPen(), setSize() */ QwtSymbol::QwtSymbol( QwtSymbol::Style style, const QBrush &brush, const QPen &pen, const QSize &size ) { d_data = new PrivateData( style, brush, pen, size ); } /*! \brief Copy constructor \param other Symbol */ QwtSymbol::QwtSymbol( const QwtSymbol &other ) { d_data = new PrivateData( other.style(), other.brush(), other.pen(), other.size() ); }; //! Destructor QwtSymbol::~QwtSymbol() { delete d_data; } //! \brief Assignment operator QwtSymbol &QwtSymbol::operator=( const QwtSymbol &other ) { *d_data = *other.d_data; return *this; } //! \brief Compare two symbols bool QwtSymbol::operator==( const QwtSymbol &other ) const { return *d_data == *other.d_data; } //! \brief Compare two symbols bool QwtSymbol::operator!=( const QwtSymbol &other ) const { return !( *d_data == *other.d_data ); } /*! \brief Specify the symbol's size If the 'h' parameter is left out or less than 0, and the 'w' parameter is greater than or equal to 0, the symbol size will be set to (w,w). \param width Width \param height Height (defaults to -1) \sa size() */ void QwtSymbol::setSize( int width, int height ) { if ( ( width >= 0 ) && ( height < 0 ) ) height = width; d_data->size = QSize( width, height ); } /*! Set the symbol's size \param size Size \sa size() */ void QwtSymbol::setSize( const QSize &size ) { if ( size.isValid() ) d_data->size = size; } /*! \return Size \sa setSize() */ const QSize& QwtSymbol::size() const { return d_data->size; } /*! \brief Assign a brush The brush is used to draw the interior of the symbol. \param brush Brush \sa brush() */ void QwtSymbol::setBrush( const QBrush &brush ) { d_data->brush = brush; } /*! \return Brush \sa setBrush() */ const QBrush& QwtSymbol::brush() const { return d_data->brush; } /*! Assign a pen The pen is used to draw the symbol's outline. \param pen Pen \sa pen(), setBrush() */ void QwtSymbol::setPen( const QPen &pen ) { d_data->pen = pen; } /*! \return Pen \sa setPen(), brush() */ const QPen& QwtSymbol::pen() const { return d_data->pen; } /*! \brief Set the color of the symbol Change the color of the brush for symbol types with a filled area. For all other symbol types the color will be assigned to the pen. \param color Color \sa setBrush(), setPen(), brush(), pen() */ void QwtSymbol::setColor( const QColor &color ) { switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star2: case QwtSymbol::Hexagon: { d_data->brush.setColor( color ); break; } case QwtSymbol::Cross: case QwtSymbol::XCross: case QwtSymbol::HLine: case QwtSymbol::VLine: case QwtSymbol::Star1: { d_data->pen.setColor( color ); break; } default: { d_data->brush.setColor( color ); d_data->pen.setColor( color ); } } } /*! Draw an array of symbols Painting several symbols is more effective than drawing symbols one by one, as a couple of layout calculations and setting of pen/brush can be done once for the complete array. \param painter Painter \param points Array of points \param numPoints Number of points */ void QwtSymbol::drawSymbols( QPainter *painter, const QPointF *points, int numPoints ) const { if ( numPoints <= 0 ) return; painter->save(); switch ( d_data->style ) { case QwtSymbol::Ellipse: { qwtDrawEllipseSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Rect: { qwtDrawRectSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Diamond: { qwtDrawDiamondSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Cross: { qwtDrawLineSymbols( painter, Qt::Horizontal | Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::XCross: { qwtDrawXCrossSymbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Triangle: case QwtSymbol::UTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Up, points, numPoints, *this ); break; } case QwtSymbol::DTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Down, points, numPoints, *this ); break; } case QwtSymbol::RTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Right, points, numPoints, *this ); break; } case QwtSymbol::LTriangle: { qwtDrawTriangleSymbols( painter, QwtTriangle::Left, points, numPoints, *this ); break; } case QwtSymbol::HLine: { qwtDrawLineSymbols( painter, Qt::Horizontal, points, numPoints, *this ); break; } case QwtSymbol::VLine: { qwtDrawLineSymbols( painter, Qt::Vertical, points, numPoints, *this ); break; } case QwtSymbol::Star1: { qwtDrawStar1Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Star2: { qwtDrawStar2Symbols( painter, points, numPoints, *this ); break; } case QwtSymbol::Hexagon: { qwtDrawHexagonSymbols( painter, points, numPoints, *this ); break; } default:; } painter->restore(); } //! \return Size of the bounding rectangle of a symbol QSize QwtSymbol::boundingSize() const { QSize size; switch ( d_data->style ) { case QwtSymbol::Ellipse: case QwtSymbol::Rect: case QwtSymbol::Hexagon: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); size = d_data->size + QSize( pw, pw ); break; } case QwtSymbol::XCross: case QwtSymbol::Diamond: case QwtSymbol::Triangle: case QwtSymbol::UTriangle: case QwtSymbol::DTriangle: case QwtSymbol::RTriangle: case QwtSymbol::LTriangle: case QwtSymbol::Star1: case QwtSymbol::Star2: { qreal pw = 0.0; if ( d_data->pen.style() != Qt::NoPen ) pw = qMax( d_data->pen.widthF(), qreal( 1.0 ) ); size = d_data->size + QSize( 2 * pw, 2 * pw ); break; } default: { size = d_data->size; } } return size + QSize( 1, 1 ); // for antialiasing } /*! Specify the symbol style \param style Style \sa style() */ void QwtSymbol::setStyle( QwtSymbol::Style style ) { d_data->style = style; } /*! \return Current symbol style \sa setStyle() */ QwtSymbol::Style QwtSymbol::style() const { return d_data->style; } starpu-1.1.5/starpu-top/qwt/qwt_point_3d.cpp0000644000373600000000000000123412571536557016035 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_3d.h" #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPoint3D &point ) { debug.nospace() << "QwtPoint3D(" << point.x() << "," << point.y() << "," << point.z() << ")"; return debug.space(); } #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_curve.h0000644000373600000000000002202712571536557016150 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_CURVE_H #define QWT_PLOT_CURVE_H #include "qwt_global.h" #include "qwt_plot_seriesitem.h" #include "qwt_series_data.h" #include "qwt_text.h" #include #include class QPainter; class QPolygonF; class QwtScaleMap; class QwtSymbol; class QwtCurveFitter; /*! \brief A plot item, that represents a series of points A curve is the representation of a series of points in the x-y plane. It supports different display styles, interpolation ( f.e. spline ) and symbols. \par Usage
a) Assign curve properties
When a curve is created, it is configured to draw black solid lines with in Lines style and no symbols. You can change this by calling setPen(), setStyle() and setSymbol().
b) Connect/Assign data.
QwtPlotCurve gets its points using a QwtData object offering a bridge to the real storage of the points ( like QAbstractItemModel ). There are several convenience classes derived from QwtData, that also store the points inside ( like QStandardItemModel ). QwtPlotCurve also offers a couple of variations of setData(), that build QwtData objects from arrays internally.
c) Attach the curve to a plot
See QwtPlotItem::attach()
\par Example: see examples/bode \sa QwtPointSeriesData, QwtSymbol, QwtScaleMap */ class QWT_EXPORT QwtPlotCurve: public QwtPlotSeriesItem { public: /*! Curve styles. - NoCurve\n Don't draw a curve. Note: This doesn't affect the symbols. - Lines\n Connect the points with straight lines. The lines might be interpolated depending on the 'Fitted' attribute. Curve fitting can be configured using setCurveFitter(). - Sticks\n Draw vertical or horizontal sticks ( depending on the orientation() ) from a baseline which is defined by setBaseline(). - Steps\n Connect the points with a step function. The step function is drawn from the left to the right or vice versa, depending on the 'Inverted' attribute. - Dots\n Draw dots at the locations of the data points. Note: This is different from a dotted line (see setPen()), and faster as a curve in NoStyle style and a symbol painting a point. - UserCurve\n Styles >= UserCurve are reserved for derived classes of QwtPlotCurve that overload drawCurve() with additional application specific curve types. \sa setStyle(), style() */ enum CurveStyle { NoCurve, Lines, Sticks, Steps, Dots, UserCurve = 100 }; /*! Attribute for drawing the curve - Fitted ( in combination with the Lines QwtPlotCurve::CurveStyle only )\n A QwtCurveFitter tries to interpolate/smooth the curve, before it is painted. Note that curve fitting requires temorary memory for calculating coefficients and additional points. If painting in Fitted mode is slow it might be better to fit the points, before they are passed to QwtPlotCurve. - Inverted\n For Steps only. Draws a step function from the right to the left. \sa setCurveAttribute(), testCurveAttribute(), curveFitter() */ enum CurveAttribute { Inverted = 1, Fitted = 2 }; /*! Attributes how to represent the curve on the legend - LegendShowLine If the curveStyle() is not NoCurve a line is painted with the curvePen(). - LegendShowSymbol If the curve has a valid symbol it is painted. - LegendShowBrush If the curve has a brush a rectangle filled with this brush is painted If none of the flags is activated QwtPlotCurve tries to find a color representing the curve and paints a rectangle with it. In the default setting all attributes are off. \sa setLegendAttribute(), testLegendAttribute(), drawLegendIdentifier() */ enum LegendAttribute { LegendShowLine = 1, LegendShowSymbol = 2, LegendShowBrush = 4 }; /*! Attributes to modify the drawing algorithm. - ClipPolygons\n Clip polygons before painting them. In situations, where points are far outside the visible area (f.e when zooming deep) this might be a substantial improvement for the painting performance ( especially on Windows ). - CacheSymbols\n Paint the symbol to a QPixmap and paint the pixmap instead rendering the symbol for each point. The flag has no effect, when the curve is not painted to the canvas ( or its cache ) The default setting enables ClipPolygons \sa setPaintAttribute(), testPaintAttribute() */ enum PaintAttribute { ClipPolygons = 1, CacheSymbols = 2 }; explicit QwtPlotCurve( const QString &title = QString::null ); explicit QwtPlotCurve( const QwtText &title ); virtual ~QwtPlotCurve(); virtual int rtti() const; void setPaintAttribute( PaintAttribute, bool on = true ); bool testPaintAttribute( PaintAttribute ) const; void setLegendAttribute( LegendAttribute, bool on = true ); bool testLegendAttribute( LegendAttribute ) const; #ifndef QWT_NO_COMPAT void setRawSamples( const double *xData, const double *yData, int size ); void setSamples( const double *xData, const double *yData, int size ); void setSamples( const QVector &xData, const QVector &yData ); #endif void setSamples( const QVector & ); int closestPoint( const QPoint &pos, double *dist = NULL ) const; double minXValue() const; double maxXValue() const; double minYValue() const; double maxYValue() const; void setCurveAttribute( CurveAttribute, bool on = true ); bool testCurveAttribute( CurveAttribute ) const; void setPen( const QPen & ); const QPen &pen() const; void setBrush( const QBrush & ); const QBrush &brush() const; void setBaseline( double ref ); double baseline() const; void setStyle( CurveStyle style ); CurveStyle style() const; void setSymbol( const QwtSymbol *s ); const QwtSymbol *symbol() const; void setCurveFitter( QwtCurveFitter * ); QwtCurveFitter *curveFitter() const; virtual void drawSeries( QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void updateLegend( QwtLegend * ) const; virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const; protected: void init(); virtual void drawCurve( QPainter *p, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void drawSymbols( QPainter *p, const QwtSymbol &, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawLines( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawSticks( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawDots( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; void drawSteps( QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, int from, int to ) const; virtual void fillCurve( QPainter *, const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const; void closePolyline( QPainter *, const QwtScaleMap &, const QwtScaleMap &, QPolygonF & ) const; private: class PrivateData; PrivateData *d_data; }; //! boundingRect().left() inline double QwtPlotCurve::minXValue() const { return boundingRect().left(); } //! boundingRect().right() inline double QwtPlotCurve::maxXValue() const { return boundingRect().right(); } //! boundingRect().top() inline double QwtPlotCurve::minYValue() const { return boundingRect().top(); } //! boundingRect().bottom() inline double QwtPlotCurve::maxYValue() const { return boundingRect().bottom(); } #endif starpu-1.1.5/starpu-top/qwt/qwt_point_polar.cpp0000644000373600000000000000607612571536560016647 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * QwtPolar Widget Library * Copyright (C) 2008 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_point_polar.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qAtan2(y, x) ::atan2(y, x) #endif /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates \sa setPoint(), toPoint() */ QwtPointPolar::QwtPointPolar( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and assign values from a point in Cartesian coordinates \param p Point in Cartesian coordinates */ void QwtPointPolar::setPoint( const QPointF &p ) { d_radius = qSqrt( qwtSqr( p.x() ) + qwtSqr( p.y() ) ); d_azimuth = qAtan2( p.y(), p.x() ); } /*! Convert and return values in Cartesian coordinates \note Invalid or null points will be returned as QPointF(0.0, 0.0) \sa isValid(), isNull() */ QPointF QwtPointPolar::toPoint() const { if ( d_radius <= 0.0 ) return QPointF( 0.0, 0.0 ); const double x = d_radius * qCos( d_azimuth ); const double y = d_radius * qSin( d_azimuth ); return QPointF( x, y ); } /*! Returns true if point1 is equal to point2; otherwise returns false. Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \sa normalized() */ bool QwtPointPolar::operator==( const QwtPointPolar &other ) const { return d_radius == other.d_radius && d_azimuth == other.d_azimuth; } /*! Returns true if point1 is not equal to point2; otherwise returns false. Two points are equal to each other if radius and azimuth-coordinates are the same. Points are not equal, when the azimuth differs, but other.azimuth() == azimuth() % (2 * PI). \sa normalized() */ bool QwtPointPolar::operator!=( const QwtPointPolar &other ) const { return d_radius != other.d_radius || d_azimuth != other.d_azimuth; } /*! Normalize radius and azimuth When the radius is < 0.0 it is set to 0.0. The azimuth is a value >= 0.0 and < 2 * M_PI. */ QwtPointPolar QwtPointPolar::normalized() const { const double radius = qMax( d_radius, 0.0 ); double azimuth = d_azimuth; if ( azimuth < -2.0 * M_PI || azimuth >= 2 * M_PI ) azimuth = ::fmod( d_azimuth, 2 * M_PI ); if ( azimuth < 0.0 ) azimuth += 2 * M_PI; return QwtPointPolar( azimuth, radius ); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtPointPolar &point ) { debug.nospace() << "QwtPointPolar(" << point.azimuth() << "," << point.radius() << ")"; return debug.space(); } #endif starpu-1.1.5/starpu-top/qwt/qwt_interval.h0000644000373600000000000001523212571536557015612 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_INTERVAL_H #define QWT_INTERVAL_H #include "qwt_global.h" #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief A class representing an interval The interval is represented by 2 doubles, the lower and the upper limit. */ class QWT_EXPORT QwtInterval { public: /*! Flag indicating if a border is included/excluded from an interval - IncludeBorders\n min/max values are inside the interval - ExcludeMinimum\n min value is not included in the interval - ExcludeMaximum\n max value is not included in the interval - ExcludeBorders\n min/max values are not included in the interval \sa setBorderMode(), testBorderMode() */ enum BorderMode { IncludeBorders = 0, ExcludeMinimum = 1, ExcludeMaximum = 2, ExcludeBorders = ExcludeMinimum | ExcludeMaximum }; QwtInterval(); QwtInterval( double minValue, double maxValue, int borderFlags = IncludeBorders ); void setInterval( double minValue, double maxValue, int borderFlags = IncludeBorders ); QwtInterval normalized() const; QwtInterval inverted() const; QwtInterval limited( double minValue, double maxValue ) const; bool operator==( const QwtInterval & ) const; bool operator!=( const QwtInterval & ) const; void setBorderFlags( int ); int borderFlags() const; double minValue() const; double maxValue() const; double width() const; void setMinValue( double ); void setMaxValue( double ); bool contains( double value ) const; bool intersects( const QwtInterval & ) const; QwtInterval intersect( const QwtInterval & ) const; QwtInterval unite( const QwtInterval & ) const; QwtInterval operator|( const QwtInterval & ) const; QwtInterval operator&( const QwtInterval & ) const; QwtInterval &operator|=( const QwtInterval & ); QwtInterval &operator&=( const QwtInterval & ); QwtInterval extend( double value ) const; QwtInterval operator|( double ) const; QwtInterval &operator|=( double ); bool isValid() const; bool isNull() const; void invalidate(); QwtInterval symmetrize( double value ) const; private: double d_minValue; double d_maxValue; int d_borderFlags; }; /*! \brief Default Constructor Creates an invalid interval [0.0, -1.0] \sa setInterval(), isValid() */ inline QwtInterval::QwtInterval(): d_minValue( 0.0 ), d_maxValue( -1.0 ), d_borderFlags( IncludeBorders ) { } /*! Constructor Build an interval with from min/max values \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline QwtInterval::QwtInterval( double minValue, double maxValue, int borderFlags ): d_minValue( minValue ), d_maxValue( maxValue ), d_borderFlags( borderFlags ) { } /*! Assign the limits of the interval \param minValue Minimum value \param maxValue Maximum value \param borderFlags Include/Exclude borders */ inline void QwtInterval::setInterval( double minValue, double maxValue, int borderFlags ) { d_minValue = minValue; d_maxValue = maxValue; d_borderFlags = borderFlags; } /*! Change the border flags \param borderFlags Or'd BorderMode flags \sa borderFlags() */ inline void QwtInterval::setBorderFlags( int borderFlags ) { d_borderFlags = borderFlags; } /*! \return Border flags \sa setBorderFlags() */ inline int QwtInterval::borderFlags() const { return d_borderFlags; } /*! Assign the lower limit of the interval \param minValue Minimum value */ inline void QwtInterval::setMinValue( double minValue ) { d_minValue = minValue; } /*! Assign the upper limit of the interval \param maxValue Maximum value */ inline void QwtInterval::setMaxValue( double maxValue ) { d_maxValue = maxValue; } //! \return Lower limit of the interval inline double QwtInterval::minValue() const { return d_minValue; } //! \return Upper limit of the interval inline double QwtInterval::maxValue() const { return d_maxValue; } /*! Return the width of an interval The width of invalid intervals is 0.0, otherwise the result is maxValue() - minValue(). \sa isValid() */ inline double QwtInterval::width() const { return isValid() ? ( d_maxValue - d_minValue ) : 0.0; } /*! Intersection of two intervals \sa intersect() */ inline QwtInterval QwtInterval::operator&( const QwtInterval &interval ) const { return intersect( interval ); } /*! Union of two intervals \sa unite() */ inline QwtInterval QwtInterval::operator|( const QwtInterval &interval ) const { return unite( interval ); } //! Compare two intervals inline bool QwtInterval::operator==( const QwtInterval &other ) const { return ( d_minValue == other.d_minValue ) && ( d_maxValue == other.d_maxValue ) && ( d_borderFlags == other.d_borderFlags ); } //! Compare two intervals inline bool QwtInterval::operator!=( const QwtInterval &other ) const { return ( !( *this == other ) ); } /*! Extend an interval \param value Value \return Extended interval \sa extend() */ inline QwtInterval QwtInterval::operator|( double value ) const { return extend( value ); } //! \return true, if isValid() && (minValue() >= maxValue()) inline bool QwtInterval::isNull() const { return isValid() && d_minValue >= d_maxValue; } /*! A interval is valid when minValue() <= maxValue(). In case of QwtInterval::ExcludeBorders it is true when minValue() < maxValue() */ inline bool QwtInterval::isValid() const { if ( ( d_borderFlags & ExcludeBorders ) == 0 ) return d_minValue <= d_maxValue; else return d_minValue < d_maxValue; } /*! Invalidate the interval The limits are set to interval [0.0, -1.0] \sa isValid() */ inline void QwtInterval::invalidate() { d_minValue = 0.0; d_maxValue = -1.0; } #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtInterval & ); #endif #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_dict.cpp0000644000373600000000000001121312571536557016275 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_dict.h" class QwtPlotDict::PrivateData { public: class ItemList: public QList { public: void insertItem( QwtPlotItem *item ) { if ( item == NULL ) return; QList::iterator it = qUpperBound( begin(), end(), item, LessZThan() ); insert( it, item ); } void removeItem( QwtPlotItem *item ) { if ( item == NULL ) return; QList::iterator it = qLowerBound( begin(), end(), item, LessZThan() ); for ( ; it != end(); ++it ) { if ( item == *it ) { erase( it ); break; } } } private: class LessZThan { public: inline bool operator()( const QwtPlotItem *item1, const QwtPlotItem *item2 ) const { return item1->z() < item2->z(); } }; }; ItemList itemList; bool autoDelete; }; /*! Constructor Auto deletion is enabled. \sa setAutoDelete(), attachItem() */ QwtPlotDict::QwtPlotDict() { d_data = new QwtPlotDict::PrivateData; d_data->autoDelete = true; } /*! Destructor If autoDelete is on, all attached items will be deleted \sa setAutoDelete(), autoDelete(), attachItem() */ QwtPlotDict::~QwtPlotDict() { detachItems( QwtPlotItem::Rtti_PlotItem, d_data->autoDelete ); delete d_data; } /*! En/Disable Auto deletion If Auto deletion is on all attached plot items will be deleted in the destructor of QwtPlotDict. The default value is on. \sa autoDelete(), attachItem() */ void QwtPlotDict::setAutoDelete( bool autoDelete ) { d_data->autoDelete = autoDelete; } /*! \return true if auto deletion is enabled \sa setAutoDelete(), attachItem() */ bool QwtPlotDict::autoDelete() const { return d_data->autoDelete; } /*! Attach/Detach a plot item Attached items will be deleted in the destructor, if auto deletion is enabled (default). Manually detached items are not deleted. \param item Plot item to attach/detach \ on If true attach, else detach the item \sa setAutoDelete(), ~QwtPlotDict() */ void QwtPlotDict::attachItem( QwtPlotItem *item, bool on ) { if ( on ) d_data->itemList.insertItem( item ); else d_data->itemList.removeItem( item ); } /*! Detach items from the dictionary \param rtti In case of QwtPlotItem::Rtti_PlotItem detach all items otherwise only those items of the type rtti. \param autoDelete If true, delete all detached items */ void QwtPlotDict::detachItems( int rtti, bool autoDelete ) { PrivateData::ItemList list = d_data->itemList; QwtPlotItemIterator it = list.begin(); while ( it != list.end() ) { QwtPlotItem *item = *it; ++it; // increment before removing item from the list if ( rtti == QwtPlotItem::Rtti_PlotItem || item->rtti() == rtti ) { item->attach( NULL ); if ( autoDelete ) delete item; } } } /*! \brief A QwtPlotItemList of all attached plot items. Use caution when iterating these lists, as removing/detaching an item will invalidate the iterator. Instead you can place pointers to objects to be removed in a removal list, and traverse that list later. \return List of all attached plot items. */ const QwtPlotItemList &QwtPlotDict::itemList() const { return d_data->itemList; } /*! \return List of all attached plot items of a specific type. \sa QwtPlotItem::rtti() */ QwtPlotItemList QwtPlotDict::itemList( int rtti ) const { if ( rtti == QwtPlotItem::Rtti_PlotItem ) return d_data->itemList; QwtPlotItemList items; PrivateData::ItemList list = d_data->itemList; for ( QwtPlotItemIterator it = list.begin(); it != list.end(); ++it ) { QwtPlotItem *item = *it; if ( item->rtti() == rtti ) items += item; } return items; } starpu-1.1.5/starpu-top/qwt/qwt_scale_widget.cpp0000644000373600000000000005370112571536557016756 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_widget.h" #include "qwt_painter.h" #include "qwt_color_map.h" #include "qwt_scale_map.h" #include "qwt_math.h" #include "qwt_scale_div.h" #include "qwt_text.h" #include #include #include class QwtScaleWidget::PrivateData { public: PrivateData(): scaleDraw( NULL ) { colorBar.colorMap = NULL; } ~PrivateData() { delete scaleDraw; delete colorBar.colorMap; } QwtScaleDraw *scaleDraw; int borderDist[2]; int minBorderDist[2]; int scaleLength; int margin; int titleOffset; int spacing; QwtText title; int layoutFlags; struct t_colorBar { bool isEnabled; int width; QwtInterval interval; QwtColorMap *colorMap; } colorBar; }; /*! \brief Create a scale with the position QwtScaleWidget::Left \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QWidget *parent ): QWidget( parent ) { initScale( QwtScaleDraw::LeftScale ); } /*! \brief Constructor \param align Alignment. \param parent Parent widget */ QwtScaleWidget::QwtScaleWidget( QwtScaleDraw::Alignment align, QWidget *parent ): QWidget( parent ) { initScale( align ); } //! Destructor QwtScaleWidget::~QwtScaleWidget() { delete d_data; } //! Initialize the scale void QwtScaleWidget::initScale( QwtScaleDraw::Alignment align ) { d_data = new PrivateData; d_data->layoutFlags = 0; if ( align == QwtScaleDraw::RightScale ) d_data->layoutFlags |= TitleInverted; d_data->borderDist[0] = 0; d_data->borderDist[1] = 0; d_data->minBorderDist[0] = 0; d_data->minBorderDist[1] = 0; d_data->margin = 4; d_data->titleOffset = 0; d_data->spacing = 2; d_data->scaleDraw = new QwtScaleDraw; d_data->scaleDraw->setAlignment( align ); d_data->scaleDraw->setLength( 10 ); d_data->colorBar.colorMap = new QwtLinearColorMap(); d_data->colorBar.isEnabled = false; d_data->colorBar.width = 10; const int flags = Qt::AlignHCenter | Qt::TextExpandTabs | Qt::TextWordWrap; d_data->title.setRenderFlags( flags ); d_data->title.setFont( font() ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } /*! Toggle an layout flag \param flag Layout flag \param on true/false \sa testLayoutFlag(), LayoutFlag */ void QwtScaleWidget::setLayoutFlag( LayoutFlag flag, bool on ) { if ( ( ( d_data->layoutFlags & flag ) != 0 ) != on ) { if ( on ) d_data->layoutFlags |= flag; else d_data->layoutFlags &= ~flag; } } /*! Test a layout flag \param flag Layout flag \return true/false \sa setLayoutFlag(), LayoutFlag */ bool QwtScaleWidget::testLayoutFlag( LayoutFlag flag ) const { return ( d_data->layoutFlags & flag ); } /*! Give title new text contents \param title New title \sa title(), setTitle(const QwtText &); */ void QwtScaleWidget::setTitle( const QString &title ) { if ( d_data->title.text() != title ) { d_data->title.setText( title ); layoutScale(); } } /*! Give title new text contents \param title New title \sa title() \warning The title flags are interpreted in direction of the label, AlignTop, AlignBottom can't be set as the title will always be aligned to the scale. */ void QwtScaleWidget::setTitle( const QwtText &title ) { QwtText t = title; const int flags = title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom ); t.setRenderFlags( flags ); if ( t != d_data->title ) { d_data->title = t; layoutScale(); } } /*! Change the alignment \param alignment New alignment \sa alignment() */ void QwtScaleWidget::setAlignment( QwtScaleDraw::Alignment alignment ) { if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->scaleDraw->orientation() == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } if ( d_data->scaleDraw ) d_data->scaleDraw->setAlignment( alignment ); layoutScale(); } /*! \return position \sa setPosition() */ QwtScaleDraw::Alignment QwtScaleWidget::alignment() const { if ( !scaleDraw() ) return QwtScaleDraw::LeftScale; return scaleDraw()->alignment(); } /*! Specify distances of the scale's endpoints from the widget's borders. The actual borders will never be less than minimum border distance. \param dist1 Left or top Distance \param dist2 Right or bottom distance \sa borderDist() */ void QwtScaleWidget::setBorderDist( int dist1, int dist2 ) { if ( dist1 != d_data->borderDist[0] || dist2 != d_data->borderDist[1] ) { d_data->borderDist[0] = dist1; d_data->borderDist[1] = dist2; layoutScale(); } } /*! \brief Specify the margin to the colorBar/base line. \param margin Margin \sa margin() */ void QwtScaleWidget::setMargin( int margin ) { margin = qMax( 0, margin ); if ( margin != d_data->margin ) { d_data->margin = margin; layoutScale(); } } /*! \brief Specify the distance between color bar, scale and title \param spacing Spacing \sa spacing() */ void QwtScaleWidget::setSpacing( int spacing ) { spacing = qMax( 0, spacing ); if ( spacing != d_data->spacing ) { d_data->spacing = spacing; layoutScale(); } } /*! \brief Change the alignment for the labels. \sa QwtScaleDraw::setLabelAlignment(), setLabelRotation() */ void QwtScaleWidget::setLabelAlignment( Qt::Alignment alignment ) { d_data->scaleDraw->setLabelAlignment( alignment ); layoutScale(); } /*! \brief Change the rotation for the labels. See QwtScaleDraw::setLabelRotation(). \param rotation Rotation \sa QwtScaleDraw::setLabelRotation(), setLabelFlags() */ void QwtScaleWidget::setLabelRotation( double rotation ) { d_data->scaleDraw->setLabelRotation( rotation ); layoutScale(); } /*! Set a scale draw sd has to be created with new and will be deleted in ~QwtScaleWidget() or the next call of setScaleDraw(). \param sd ScaleDraw object \sa scaleDraw() */ void QwtScaleWidget::setScaleDraw( QwtScaleDraw *sd ) { if ( sd == NULL || sd == d_data->scaleDraw ) return; if ( d_data->scaleDraw ) sd->setAlignment( d_data->scaleDraw->alignment() ); delete d_data->scaleDraw; d_data->scaleDraw = sd; layoutScale(); } /*! scaleDraw of this scale \sa setScaleDraw(), QwtScaleDraw::setScaleDraw() */ const QwtScaleDraw *QwtScaleWidget::scaleDraw() const { return d_data->scaleDraw; } /*! scaleDraw of this scale \sa QwtScaleDraw::setScaleDraw() */ QwtScaleDraw *QwtScaleWidget::scaleDraw() { return d_data->scaleDraw; } /*! \return title \sa setTitle() */ QwtText QwtScaleWidget::title() const { return d_data->title; } /*! \return start border distance \sa setBorderDist() */ int QwtScaleWidget::startBorderDist() const { return d_data->borderDist[0]; } /*! \return end border distance \sa setBorderDist() */ int QwtScaleWidget::endBorderDist() const { return d_data->borderDist[1]; } /*! \return margin \sa setMargin() */ int QwtScaleWidget::margin() const { return d_data->margin; } /*! \return distance between scale and title \sa setMargin() */ int QwtScaleWidget::spacing() const { return d_data->spacing; } /*! \brief paintEvent */ void QwtScaleWidget::paintEvent( QPaintEvent *event ) { QPainter painter( this ); painter.setClipRegion( event->region() ); draw( &painter ); } /*! \brief draw the scale */ void QwtScaleWidget::draw( QPainter *painter ) const { d_data->scaleDraw->draw( painter, palette() ); if ( d_data->colorBar.isEnabled && d_data->colorBar.width > 0 && d_data->colorBar.interval.isValid() ) { drawColorBar( painter, colorBarRect( rect() ) ); } QRect r = rect(); if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { r.setLeft( r.left() + d_data->borderDist[0] ); r.setWidth( r.width() - d_data->borderDist[1] ); } else { r.setTop( r.top() + d_data->borderDist[0] ); r.setHeight( r.height() - d_data->borderDist[1] ); } if ( !d_data->title.isEmpty() ) drawTitle( painter, d_data->scaleDraw->alignment(), r ); } /*! Calculate the the rectangle for the color bar \param rect Bounding rectangle for all components of the scale \return Rectabgle for the color bar */ QRectF QwtScaleWidget::colorBarRect( const QRectF& rect ) const { QRectF cr = rect; if ( d_data->scaleDraw->orientation() == Qt::Horizontal ) { cr.setLeft( cr.left() + d_data->borderDist[0] ); cr.setWidth( cr.width() - d_data->borderDist[1] + 1 ); } else { cr.setTop( cr.top() + d_data->borderDist[0] ); cr.setHeight( cr.height() - d_data->borderDist[1] + 1 ); } switch ( d_data->scaleDraw->alignment() ) { case QwtScaleDraw::LeftScale: { cr.setLeft( cr.right() - d_data->margin - d_data->colorBar.width ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::RightScale: { cr.setLeft( cr.left() + d_data->margin ); cr.setWidth( d_data->colorBar.width ); break; } case QwtScaleDraw::BottomScale: { cr.setTop( cr.top() + d_data->margin ); cr.setHeight( d_data->colorBar.width ); break; } case QwtScaleDraw::TopScale: { cr.setTop( cr.bottom() - d_data->margin - d_data->colorBar.width ); cr.setHeight( d_data->colorBar.width ); break; } } return cr; } /*! Event handler for resize event \param event Resize event */ void QwtScaleWidget::resizeEvent( QResizeEvent * ) { layoutScale( false ); } /*! Recalculate the scale's geometry and layout based on the current rect and fonts. \param update_geometry Notify the layout system and call update to redraw the scale */ void QwtScaleWidget::layoutScale( bool update_geometry ) { int bd0, bd1; getBorderDistHint( bd0, bd1 ); if ( d_data->borderDist[0] > bd0 ) bd0 = d_data->borderDist[0]; if ( d_data->borderDist[1] > bd1 ) bd1 = d_data->borderDist[1]; int colorBarWidth = 0; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) colorBarWidth = d_data->colorBar.width + d_data->spacing; const QRectF r = rect(); double x, y, length; if ( d_data->scaleDraw->orientation() == Qt::Vertical ) { y = r.top() + bd0; length = r.height() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::LeftScale ) x = r.right() - 1.0 - d_data->margin - colorBarWidth; else x = r.left() + d_data->margin + colorBarWidth; } else { x = r.left() + bd0; length = r.width() - ( bd0 + bd1 ); if ( d_data->scaleDraw->alignment() == QwtScaleDraw::BottomScale ) y = r.top() + d_data->margin + colorBarWidth; else y = r.bottom() - 1.0 - d_data->margin - colorBarWidth; } d_data->scaleDraw->move( x, y ); d_data->scaleDraw->setLength( length ); const int extent = qCeil( d_data->scaleDraw->extent( font() ) ); d_data->titleOffset = d_data->margin + d_data->spacing + colorBarWidth + extent; if ( update_geometry ) { updateGeometry(); update(); } } /*! Draw the color bar of the scale widget \param painter Painter \param rect Bounding rectangle for the color bar \sa setColorBarEnabled() */ void QwtScaleWidget::drawColorBar( QPainter *painter, const QRectF& rect ) const { if ( !d_data->colorBar.interval.isValid() ) return; const QwtScaleDraw* sd = d_data->scaleDraw; QwtPainter::drawColorBar( painter, *d_data->colorBar.colorMap, d_data->colorBar.interval.normalized(), sd->map(), sd->orientation(), rect ); } /*! Rotate and paint a title according to its position into a given rectangle. \param painter Painter \param align Alignment \param rect Bounding rectangle */ void QwtScaleWidget::drawTitle( QPainter *painter, QwtScaleDraw::Alignment align, const QRectF &rect ) const { QRectF r = rect; double angle; int flags = d_data->title.renderFlags() & ~( Qt::AlignTop | Qt::AlignBottom | Qt::AlignVCenter ); switch ( align ) { case QwtScaleDraw::LeftScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left(), r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::RightScale: angle = -90.0; flags |= Qt::AlignTop; r.setRect( r.left() + d_data->titleOffset, r.bottom(), r.height(), r.width() - d_data->titleOffset ); break; case QwtScaleDraw::BottomScale: angle = 0.0; flags |= Qt::AlignBottom; r.setTop( r.top() + d_data->titleOffset ); break; case QwtScaleDraw::TopScale: default: angle = 0.0; flags |= Qt::AlignTop; r.setBottom( r.bottom() - d_data->titleOffset ); break; } if ( d_data->layoutFlags & TitleInverted ) { if ( align == QwtScaleDraw::LeftScale || align == QwtScaleDraw::RightScale ) { angle = -angle; r.setRect( r.x() + r.height(), r.y() - r.width(), r.width(), r.height() ); } } painter->save(); painter->setFont( font() ); painter->setPen( palette().color( QPalette::Text ) ); painter->translate( r.x(), r.y() ); if ( angle != 0.0 ) painter->rotate( angle ); QwtText title = d_data->title; title.setRenderFlags( flags ); title.draw( painter, QRect( 0, 0, r.width(), r.height() ) ); painter->restore(); } /*! \brief Notify a change of the scale This virtual function can be overloaded by derived classes. The default implementation updates the geometry and repaints the widget. */ void QwtScaleWidget::scaleChange() { layoutScale(); } /*! \return a size hint */ QSize QwtScaleWidget::sizeHint() const { return minimumSizeHint(); } /*! \return a minimum size hint */ QSize QwtScaleWidget::minimumSizeHint() const { const Qt::Orientation o = d_data->scaleDraw->orientation(); // Border Distance cannot be less than the scale borderDistHint // Note, the borderDistHint is already included in minHeight/minWidth int length = 0; int mbd1, mbd2; getBorderDistHint( mbd1, mbd2 ); length += qMax( 0, d_data->borderDist[0] - mbd1 ); length += qMax( 0, d_data->borderDist[1] - mbd2 ); length += d_data->scaleDraw->minLength( font() ); int dim = dimForLength( length, font() ); if ( length < dim ) { // compensate for long titles length = dim; dim = dimForLength( length, font() ); } QSize size( length + 2, dim ); if ( o == Qt::Vertical ) size.transpose(); return size; } /*! \brief Find the height of the title for a given width. \param width Width \return height Height */ int QwtScaleWidget::titleHeightForWidth( int width ) const { return d_data->title.heightForWidth( width, font() ); } /*! \brief Find the minimum dimension for a given length. dim is the height, length the width seen in direction of the title. \param length width for horizontal, height for vertical scales \param scaleFont Font of the scale \return height for horizontal, width for vertical scales */ int QwtScaleWidget::dimForLength( int length, const QFont &scaleFont ) const { const int extent = qCeil( d_data->scaleDraw->extent( scaleFont ) ); int dim = d_data->margin + extent + 1; if ( !d_data->title.isEmpty() ) dim += titleHeightForWidth( length ) + d_data->spacing; if ( d_data->colorBar.isEnabled && d_data->colorBar.interval.isValid() ) dim += d_data->colorBar.width + d_data->spacing; return dim; } /*! \brief Calculate a hint for the border distances. This member function calculates the distance of the scale's endpoints from the widget borders which is required for the mark labels to fit into the widget. The maximum of this distance an the minimum border distance is returned. \warning
  • The minimum border distance depends on the font.
\sa setMinBorderDist(), getMinBorderDist(), setBorderDist() */ void QwtScaleWidget::getBorderDistHint( int &start, int &end ) const { d_data->scaleDraw->getBorderDistHint( font(), start, end ); if ( start < d_data->minBorderDist[0] ) start = d_data->minBorderDist[0]; if ( end < d_data->minBorderDist[1] ) end = d_data->minBorderDist[1]; } /*! Set a minimum value for the distances of the scale's endpoints from the widget borders. This is useful to avoid that the scales are "jumping", when the tick labels or their positions change often. \param start Minimum for the start border \param end Minimum for the end border \sa getMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::setMinBorderDist( int start, int end ) { d_data->minBorderDist[0] = start; d_data->minBorderDist[1] = end; } /*! Get the minimum value for the distances of the scale's endpoints from the widget borders. \sa setMinBorderDist(), getBorderDistHint() */ void QwtScaleWidget::getMinBorderDist( int &start, int &end ) const { start = d_data->minBorderDist[0]; end = d_data->minBorderDist[1]; } /*! \brief Assign a scale division The scale division determines where to set the tick marks. \param transformation Transformation, needed to translate between scale and pixal values \param scaleDiv Scale Division \sa For more information about scale divisions, see QwtScaleDiv. */ void QwtScaleWidget::setScaleDiv( QwtScaleTransformation *transformation, const QwtScaleDiv &scaleDiv ) { QwtScaleDraw *sd = d_data->scaleDraw; if ( sd->scaleDiv() != scaleDiv || sd->map().transformation()->type() != transformation->type() ) { sd->setTransformation( transformation ); sd->setScaleDiv( scaleDiv ); layoutScale(); Q_EMIT scaleDivChanged(); } else { /* The transformation doesn't anything different as the previous one. So we better throw it silently away instead of initiating heavy updates */ delete transformation; } } /*! En/disable a color bar associated to the scale \sa isColorBarEnabled(), setColorBarWidth() */ void QwtScaleWidget::setColorBarEnabled( bool on ) { if ( on != d_data->colorBar.isEnabled ) { d_data->colorBar.isEnabled = on; layoutScale(); } } /*! \return true, when the color bar is enabled \sa setColorBarEnabled(), setColorBarWidth() */ bool QwtScaleWidget::isColorBarEnabled() const { return d_data->colorBar.isEnabled; } /*! Set the width of the color bar \param width Width \sa colorBarWidth(), setColorBarEnabled() */ void QwtScaleWidget::setColorBarWidth( int width ) { if ( width != d_data->colorBar.width ) { d_data->colorBar.width = width; if ( isColorBarEnabled() ) layoutScale(); } } /*! \return Width of the color bar \sa setColorBarEnabled(), setColorBarEnabled() */ int QwtScaleWidget::colorBarWidth() const { return d_data->colorBar.width; } /*! \return Value interval for the color bar \sa setColorMap(), colorMap() */ QwtInterval QwtScaleWidget::colorBarInterval() const { return d_data->colorBar.interval; } /*! Set the color map and value interval, that are used for displaying the color bar. \param interval Value interval \param colorMap Color map \sa colorMap(), colorBarInterval() */ void QwtScaleWidget::setColorMap( const QwtInterval &interval, QwtColorMap *colorMap ) { d_data->colorBar.interval = interval; if ( colorMap != d_data->colorBar.colorMap ) { delete d_data->colorBar.colorMap; d_data->colorBar.colorMap = colorMap; } if ( isColorBarEnabled() ) layoutScale(); } /*! \return Color map \sa setColorMap(), colorBarInterval() */ const QwtColorMap *QwtScaleWidget::colorMap() const { return d_data->colorBar.colorMap; } starpu-1.1.5/starpu-top/qwt/qwt_text.cpp0000644000373600000000000003646212571536560015307 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2003 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_text.h" #include "qwt_painter.h" #include "qwt_text_engine.h" #include #include #include #include #include #include #include #include #include class QwtTextEngineDict { public: static QwtTextEngineDict &dict(); void setTextEngine( QwtText::TextFormat, QwtTextEngine * ); const QwtTextEngine *textEngine( QwtText::TextFormat ) const; const QwtTextEngine *textEngine( const QString &, QwtText::TextFormat ) const; private: QwtTextEngineDict(); ~QwtTextEngineDict(); typedef QMap EngineMap; inline const QwtTextEngine *engine( EngineMap::const_iterator &it ) const { return it.value(); } EngineMap d_map; }; QwtTextEngineDict &QwtTextEngineDict::dict() { static QwtTextEngineDict engineDict; return engineDict; } QwtTextEngineDict::QwtTextEngineDict() { d_map.insert( QwtText::PlainText, new QwtPlainTextEngine() ); #ifndef QT_NO_RICHTEXT d_map.insert( QwtText::RichText, new QwtRichTextEngine() ); #endif } QwtTextEngineDict::~QwtTextEngineDict() { for ( EngineMap::const_iterator it = d_map.begin(); it != d_map.end(); ++it ) { const QwtTextEngine *textEngine = engine( it ); delete textEngine; } } const QwtTextEngine *QwtTextEngineDict::textEngine( const QString& text, QwtText::TextFormat format ) const { if ( format == QwtText::AutoText ) { for ( EngineMap::const_iterator it = d_map.begin(); it != d_map.end(); ++it ) { if ( it.key() != QwtText::PlainText ) { const QwtTextEngine *e = engine( it ); if ( e && e->mightRender( text ) ) return e; } } } EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) { const QwtTextEngine *e = engine( it ); if ( e ) return e; } it = d_map.find( QwtText::PlainText ); return engine( it ); } void QwtTextEngineDict::setTextEngine( QwtText::TextFormat format, QwtTextEngine *engine ) { if ( format == QwtText::AutoText ) return; if ( format == QwtText::PlainText && engine == NULL ) return; EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) { const QwtTextEngine *e = this->engine( it ); if ( e ) delete e; d_map.remove( format ); } if ( engine != NULL ) d_map.insert( format, engine ); } const QwtTextEngine *QwtTextEngineDict::textEngine( QwtText::TextFormat format ) const { const QwtTextEngine *e = NULL; EngineMap::const_iterator it = d_map.find( format ); if ( it != d_map.end() ) e = engine( it ); return e; } class QwtText::PrivateData { public: PrivateData(): renderFlags( Qt::AlignCenter ), backgroundPen( Qt::NoPen ), backgroundBrush( Qt::NoBrush ), paintAttributes( 0 ), layoutAttributes( 0 ), textEngine( NULL ) { } int renderFlags; QString text; QFont font; QColor color; QPen backgroundPen; QBrush backgroundBrush; int paintAttributes; int layoutAttributes; const QwtTextEngine *textEngine; }; class QwtText::LayoutCache { public: void invalidate() { textSize = QSizeF(); } QFont font; QSizeF textSize; }; /*! Constructor \param text Text content \param textFormat Text format */ QwtText::QwtText( const QString &text, QwtText::TextFormat textFormat ) { d_data = new PrivateData; d_data->text = text; d_data->textEngine = textEngine( text, textFormat ); d_layoutCache = new LayoutCache; } //! Copy constructor QwtText::QwtText( const QwtText &other ) { d_data = new PrivateData; *d_data = *other.d_data; d_layoutCache = new LayoutCache; *d_layoutCache = *other.d_layoutCache; } //! Destructor QwtText::~QwtText() { delete d_data; delete d_layoutCache; } //! Assignment operator QwtText &QwtText::operator=( const QwtText & other ) { *d_data = *other.d_data; *d_layoutCache = *other.d_layoutCache; return *this; } //! Relational operator bool QwtText::operator==( const QwtText &other ) const { return d_data->renderFlags == other.d_data->renderFlags && d_data->text == other.d_data->text && d_data->font == other.d_data->font && d_data->color == other.d_data->color && d_data->backgroundPen == other.d_data->backgroundPen && d_data->backgroundBrush == other.d_data->backgroundBrush && d_data->paintAttributes == other.d_data->paintAttributes && d_data->textEngine == other.d_data->textEngine; } //! Relational operator bool QwtText::operator!=( const QwtText &other ) const // invalidate { return !( other == *this ); } /*! Assign a new text content \param text Text content \param textFormat Text format \sa text() */ void QwtText::setText( const QString &text, QwtText::TextFormat textFormat ) { d_data->text = text; d_data->textEngine = textEngine( text, textFormat ); d_layoutCache->invalidate(); } /*! Return the text. \sa setText() */ QString QwtText::text() const { return d_data->text; } /*! \brief Change the render flags The default setting is Qt::AlignCenter \param renderFlags Bitwise OR of the flags used like in QPainter::drawText \sa renderFlags(), QwtTextEngine::draw() \note Some renderFlags might have no effect, depending on the text format. */ void QwtText::setRenderFlags( int renderFlags ) { if ( renderFlags != d_data->renderFlags ) { d_data->renderFlags = renderFlags; d_layoutCache->invalidate(); } } /*! \return Render flags \sa setRenderFlags() */ int QwtText::renderFlags() const { return d_data->renderFlags; } /*! Set the font. \param font Font \note Setting the font might have no effect, when the text contains control sequences for setting fonts. */ void QwtText::setFont( const QFont &font ) { d_data->font = font; setPaintAttribute( PaintUsingTextFont ); } //! Return the font. QFont QwtText::font() const { return d_data->font; } /*! Return the font of the text, if it has one. Otherwise return defaultFont. \param defaultFont Default font \sa setFont(), font(), PaintAttributes */ QFont QwtText::usedFont( const QFont &defaultFont ) const { if ( d_data->paintAttributes & PaintUsingTextFont ) return d_data->font; return defaultFont; } /*! Set the pen color used for painting the text. \param color Color \note Setting the color might have no effect, when the text contains control sequences for setting colors. */ void QwtText::setColor( const QColor &color ) { d_data->color = color; setPaintAttribute( PaintUsingTextColor ); } //! Return the pen color, used for painting the text QColor QwtText::color() const { return d_data->color; } /*! Return the color of the text, if it has one. Otherwise return defaultColor. \param defaultColor Default color \sa setColor(), color(), PaintAttributes */ QColor QwtText::usedColor( const QColor &defaultColor ) const { if ( d_data->paintAttributes & PaintUsingTextColor ) return d_data->color; return defaultColor; } /*! Set the background pen \param pen Background pen \sa backgroundPen(), setBackgroundBrush() */ void QwtText::setBackgroundPen( const QPen &pen ) { d_data->backgroundPen = pen; setPaintAttribute( PaintBackground ); } /*! \return Background pen \sa setBackgroundPen(), backgroundBrush() */ QPen QwtText::backgroundPen() const { return d_data->backgroundPen; } /*! Set the background brush \param brush Background brush \sa backgroundBrush(), setBackgroundPen() */ void QwtText::setBackgroundBrush( const QBrush &brush ) { d_data->backgroundBrush = brush; setPaintAttribute( PaintBackground ); } /*! \return Background brush \sa setBackgroundBrush(), backgroundPen() */ QBrush QwtText::backgroundBrush() const { return d_data->backgroundBrush; } /*! Change a paint attribute \param attribute Paint attribute \param on On/Off \note Used by setFont(), setColor(), setBackgroundPen() and setBackgroundBrush() \sa testPaintAttribute() */ void QwtText::setPaintAttribute( PaintAttribute attribute, bool on ) { if ( on ) d_data->paintAttributes |= attribute; else d_data->paintAttributes &= ~attribute; } /*! Test a paint attribute \param attribute Paint attribute \return true, if attribute is enabled \sa setPaintAttribute() */ bool QwtText::testPaintAttribute( PaintAttribute attribute ) const { return d_data->paintAttributes & attribute; } /*! Change a layout attribute \param attribute Layout attribute \param on On/Off \sa testLayoutAttribute() */ void QwtText::setLayoutAttribute( LayoutAttribute attribute, bool on ) { if ( on ) d_data->layoutAttributes |= attribute; else d_data->layoutAttributes &= ~attribute; } /*! Test a layout attribute \param attribute Layout attribute \return true, if attribute is enabled \sa setLayoutAttribute() */ bool QwtText::testLayoutAttribute( LayoutAttribute attribute ) const { return d_data->layoutAttributes | attribute; } /*! Find the height for a given width \param defaultFont Font, used for the calculation if the text has no font \param width Width \return Calculated height */ double QwtText::heightForWidth( double width, const QFont &defaultFont ) const { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( usedFont( defaultFont ), QApplication::desktop() ); double h = 0; if ( d_data->layoutAttributes & MinimumLayout ) { double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); h = d_data->textEngine->heightForWidth( font, d_data->renderFlags, d_data->text, width + left + right ); h -= top + bottom; } else { h = d_data->textEngine->heightForWidth( font, d_data->renderFlags, d_data->text, width ); } return h; } /*! Find the height for a given width \param defaultFont Font, used for the calculation if the text has no font \return Calculated height */ /*! Returns the size, that is needed to render text \param defaultFont Font of the text \return Caluclated size */ QSizeF QwtText::textSize( const QFont &defaultFont ) const { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( usedFont( defaultFont ), QApplication::desktop() ); if ( !d_layoutCache->textSize.isValid() || d_layoutCache->font != font ) { d_layoutCache->textSize = d_data->textEngine->textSize( font, d_data->renderFlags, d_data->text ); d_layoutCache->font = font; } QSizeF sz = d_layoutCache->textSize; if ( d_data->layoutAttributes & MinimumLayout ) { double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); sz -= QSizeF( left + right, top + bottom ); } return sz; } /*! Draw a text into a rectangle \param painter Painter \param rect Rectangle */ void QwtText::draw( QPainter *painter, const QRectF &rect ) const { if ( d_data->paintAttributes & PaintBackground ) { if ( d_data->backgroundPen != Qt::NoPen || d_data->backgroundBrush != Qt::NoBrush ) { painter->save(); painter->setPen( d_data->backgroundPen ); painter->setBrush( d_data->backgroundBrush ); QwtPainter::drawRect( painter, rect ); painter->restore(); } } painter->save(); if ( d_data->paintAttributes & PaintUsingTextFont ) { painter->setFont( d_data->font ); } if ( d_data->paintAttributes & PaintUsingTextColor ) { if ( d_data->color.isValid() ) painter->setPen( d_data->color ); } QRectF expandedRect = rect; if ( d_data->layoutAttributes & MinimumLayout ) { // We want to calculate in screen metrics. So // we need a font that uses screen metrics const QFont font( painter->font(), QApplication::desktop() ); double left, right, top, bottom; d_data->textEngine->textMargins( font, d_data->text, left, right, top, bottom ); expandedRect.setTop( rect.top() - top ); expandedRect.setBottom( rect.bottom() + bottom ); expandedRect.setLeft( rect.left() - left ); expandedRect.setRight( rect.right() + right ); } d_data->textEngine->draw( painter, expandedRect, d_data->renderFlags, d_data->text ); painter->restore(); } /*! Find the text engine for a text format In case of QwtText::AutoText the first text engine (beside QwtPlainTextEngine) is returned, where QwtTextEngine::mightRender returns true. If there is none QwtPlainTextEngine is returnd. If no text engine is registered for the format QwtPlainTextEngine is returnd. \param text Text, needed in case of AutoText \param format Text format */ const QwtTextEngine *QwtText::textEngine( const QString &text, QwtText::TextFormat format ) { return QwtTextEngineDict::dict().textEngine( text, format ); } /*! Assign/Replace a text engine for a text format With setTextEngine it is possible to extend Qwt with other types of text formats. For QwtText::PlainText it is not allowed to assign a engine == NULL. \param format Text format \param engine Text engine \sa QwtMathMLTextEngine \warning Using QwtText::AutoText does nothing. */ void QwtText::setTextEngine( QwtText::TextFormat format, QwtTextEngine *engine ) { QwtTextEngineDict::dict().setTextEngine( format, engine ); } /*! \brief Find the text engine for a text format textEngine can be used to find out if a text format is supported. \param format Text format \return The text engine, or NULL if no engine is available. */ const QwtTextEngine *QwtText::textEngine( QwtText::TextFormat format ) { return QwtTextEngineDict::dict().textEngine( format ); } starpu-1.1.5/starpu-top/qwt/qwt_thermo.h0000644000373600000000000001211612571536557015262 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_THERMO_H #define QWT_THERMO_H #include "qwt_global.h" #include "qwt_abstract_scale.h" #include #include #include #include class QwtScaleDraw; /*! \brief The Thermometer Widget QwtThermo is a widget which displays a value in an interval. It supports: - a horizontal or vertical layout; - a range; - a scale; - an alarm level. \image html sysinfo.png By default, the scale and range run over the same interval of values. QwtAbstractScale::setScale() changes the interval of the scale and allows easy conversion between physical units. The example shows how to make the scale indicate in degrees Fahrenheit and to set the value in degrees Kelvin: \code #include #include double Kelvin2Fahrenheit(double kelvin) { // see http://en.wikipedia.org/wiki/Kelvin return 1.8*kelvin - 459.67; } int main(int argc, char **argv) { const double minKelvin = 0.0; const double maxKelvin = 500.0; QApplication a(argc, argv); QwtThermo t; t.setRange(minKelvin, maxKelvin); t.setScale(Kelvin2Fahrenheit(minKelvin), Kelvin2Fahrenheit(maxKelvin)); // set the value in Kelvin but the scale displays in Fahrenheit // 273.15 Kelvin = 0 Celsius = 32 Fahrenheit t.setValue(273.15); a.setMainWidget(&t); t.show(); return a.exec(); } \endcode \todo Improve the support for a logarithmic range and/or scale. */ class QWT_EXPORT QwtThermo: public QWidget, public QwtAbstractScale { Q_OBJECT Q_ENUMS( ScalePos ) Q_PROPERTY( QBrush alarmBrush READ alarmBrush WRITE setAlarmBrush ) Q_PROPERTY( QColor alarmColor READ alarmColor WRITE setAlarmColor ) Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled ) Q_PROPERTY( double alarmLevel READ alarmLevel WRITE setAlarmLevel ) Q_PROPERTY( ScalePos scalePosition READ scalePosition WRITE setScalePosition ) Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth ) Q_PROPERTY( QBrush fillBrush READ fillBrush WRITE setFillBrush ) Q_PROPERTY( QColor fillColor READ fillColor WRITE setFillColor ) Q_PROPERTY( double maxValue READ maxValue WRITE setMaxValue ) Q_PROPERTY( double minValue READ minValue WRITE setMinValue ) Q_PROPERTY( int pipeWidth READ pipeWidth WRITE setPipeWidth ) Q_PROPERTY( double value READ value WRITE setValue ) public: /*! Scale position. QwtThermo tries to enforce valid combinations of its orientation and scale position: - Qt::Horizonal combines with NoScale, TopScale and BottomScale - Qt::Vertical combines with NoScale, LeftScale and RightScale \sa setOrientation(), setScalePosition() */ enum ScalePos { NoScale, LeftScale, RightScale, TopScale, BottomScale }; explicit QwtThermo( QWidget *parent = NULL ); virtual ~QwtThermo(); void setOrientation( Qt::Orientation o, ScalePos s ); void setScalePosition( ScalePos s ); ScalePos scalePosition() const; void setBorderWidth( int w ); int borderWidth() const; void setFillBrush( const QBrush &b ); const QBrush &fillBrush() const; void setFillColor( const QColor &c ); const QColor &fillColor() const; void setAlarmBrush( const QBrush &b ); const QBrush &alarmBrush() const; void setAlarmColor( const QColor &c ); const QColor &alarmColor() const; void setAlarmLevel( double v ); double alarmLevel() const; void setAlarmEnabled( bool tf ); bool alarmEnabled() const; void setPipeWidth( int w ); int pipeWidth() const; void setMaxValue( double v ); double maxValue() const; void setMinValue( double v ); double minValue() const; double value() const; void setRange( double vmin, double vmax, bool lg = false ); void setMargin( int m ); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; public Q_SLOTS: virtual void setValue( double val ); protected: void draw( QPainter *p, const QRect& update_rect ); void drawThermo( QPainter *p ); void layoutThermo( bool update = true ); virtual void scaleChange(); virtual void fontChange( const QFont &oldFont ); virtual void paintEvent( QPaintEvent *e ); virtual void resizeEvent( QResizeEvent *e ); QwtScaleDraw *scaleDraw(); private: void initThermo(); int transform( double v ) const; class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_round_scale_draw.cpp0000644000373600000000000002037712571536560017634 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_round_scale_draw.h" #include "qwt_painter.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include #include #include #include class QwtRoundScaleDraw::PrivateData { public: PrivateData(): center( 50, 50 ), radius( 50 ), startAngle( -135 * 16 ), endAngle( 135 * 16 ) { } QPointF center; double radius; double startAngle; double endAngle; }; /*! \brief Constructor The range of the scale is initialized to [0, 100], The center is set to (50, 50) with a radius of 50. The angle range is set to [-135, 135]. */ QwtRoundScaleDraw::QwtRoundScaleDraw() { d_data = new QwtRoundScaleDraw::PrivateData; setRadius( 50 ); scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } //! Destructor QwtRoundScaleDraw::~QwtRoundScaleDraw() { delete d_data; } /*! Change of radius the scale Radius is the radius of the backbone without ticks and labels. \param radius New Radius \sa moveCenter() */ void QwtRoundScaleDraw::setRadius( int radius ) { d_data->radius = radius; } /*! Get the radius Radius is the radius of the backbone without ticks and labels. \sa setRadius(), extent() */ int QwtRoundScaleDraw::radius() const { return d_data->radius; } /*! Move the center of the scale draw, leaving the radius unchanged \param center New center \sa setRadius() */ void QwtRoundScaleDraw::moveCenter( const QPointF ¢er ) { d_data->center = center; } //! Get the center of the scale QPointF QwtRoundScaleDraw::center() const { return d_data->center; } /*! \brief Adjust the baseline circle segment for round scales. The baseline will be drawn from min(angle1,angle2) to max(angle1, angle2). The default setting is [ -135, 135 ]. An angle of 0 degrees corresponds to the 12 o'clock position, and positive angles count in a clockwise direction. \param angle1 \param angle2 boundaries of the angle interval in degrees. \warning
  • The angle range is limited to [-360, 360] degrees. Angles exceeding this range will be clipped.
  • For angles more than 359 degrees above or below min(angle1, angle2), scale marks will not be drawn.
  • If you need a counterclockwise scale, use QwtScaleDiv::setRange
*/ void QwtRoundScaleDraw::setAngleRange( double angle1, double angle2 ) { angle1 = qwtLim( angle1, -360.0, 360.0 ); angle2 = qwtLim( angle2, -360.0, 360.0 ); d_data->startAngle = angle1 * 16.0; d_data->endAngle = angle2 * 16.0; if ( d_data->startAngle == d_data->endAngle ) { d_data->startAngle -= 1; d_data->endAngle += 1; } scaleMap().setPaintInterval( d_data->startAngle, d_data->endAngle ); } /*! Draws the label for a major scale tick \param painter Painter \param value Value \sa drawTick(), drawBackbone() */ void QwtRoundScaleDraw::drawLabel( QPainter *painter, double value ) const { const QwtText label = tickLabel( painter->font(), value ); if ( label.isEmpty() ) return; const double tval = map().transform( value ); if ( ( tval > d_data->startAngle + 359 * 16 ) || ( tval < d_data->startAngle - 359 * 16 ) ) { return; } double radius = d_data->radius; if ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) { radius += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) radius += majTickLength(); const QSizeF sz = label.textSize( painter->font() ); const double arc = tval / 16.0 / 360.0 * 2 * M_PI; const double x = d_data->center.x() + ( radius + sz.width() / 2.0 ) * qSin( arc ); const double y = d_data->center.y() - ( radius + sz.height() / 2.0 ) * cos( arc ); const QRectF r( x - sz.width() / 2, y - sz.height() / 2, sz.width(), sz.height() ); label.draw( painter, r ); } /*! Draw a tick \param painter Painter \param value Value of the tick \param len Lenght of the tick \sa drawBackbone(), drawLabel() */ void QwtRoundScaleDraw::drawTick( QPainter *painter, double value, double len ) const { if ( len <= 0 ) return; const double tval = map().transform( value ); const double cx = d_data->center.x(); const double cy = d_data->center.y(); const double radius = d_data->radius; if ( ( tval <= d_data->startAngle + 359 * 16 ) || ( tval >= d_data->startAngle - 359 * 16 ) ) { const double arc = double( tval ) / 16.0 * M_PI / 180.0; const double sinArc = qSin( arc ); const double cosArc = qCos( arc ); const double x1 = cx + radius * sinArc; const double x2 = cx + ( radius + len ) * sinArc; const double y1 = cy - radius * cosArc; const double y2 = cy - ( radius + len ) * cosArc; QwtPainter::drawLine( painter, x1, y1, x2, y2 ); } } /*! Draws the baseline of the scale \param painter Painter \sa drawTick(), drawLabel() */ void QwtRoundScaleDraw::drawBackbone( QPainter *painter ) const { const double a1 = qMin( map().p1(), map().p2() ) - 90 * 16; const double a2 = qMax( map().p1(), map().p2() ) - 90 * 16; const double radius = d_data->radius; const double x = d_data->center.x() - radius; const double y = d_data->center.y() - radius; painter->drawArc( x, y, 2 * radius, 2 * radius, -a2, a2 - a1 + 1 ); // counterclockwise } /*! Calculate the extent of the scale The extent is the distcance between the baseline to the outermost pixel of the scale draw. radius() + extent() is an upper limit for the radius of the bounding circle. \param font Font used for painting the labels \sa setMinimumExtent(), minimumExtent() \warning The implemented algo is not too smart and calculates only an upper limit, that might be a few pixels too large */ double QwtRoundScaleDraw::extent( const QFont &font ) const { double d = 0.0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { const QwtScaleDiv &sd = scaleDiv(); const QList &ticks = sd.ticks( QwtScaleDiv::MajorTick ); for ( uint i = 0; i < ( uint )ticks.count(); i++ ) { const double value = ticks[i]; if ( !sd.contains( value ) ) continue; const QwtText label = tickLabel( font, value ); if ( label.isEmpty() ) continue; const double tval = map().transform( value ); if ( ( tval < d_data->startAngle + 360 * 16 ) && ( tval > d_data->startAngle - 360 * 16 ) ) { const double arc = tval / 16.0 / 360.0 * 2 * M_PI; const QSizeF sz = label.textSize( font ); const double off = qMax( sz.width(), sz.height() ); double x = off * qSin( arc ); double y = off * qCos( arc ); const double dist = qSqrt( x * x + y * y ); if ( dist > d ) d = dist; } } } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += majTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero d += pw; } if ( hasComponent( QwtAbstractScaleDraw::Labels ) && ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) ) { d += spacing(); } d = qMax( d, minimumExtent() ); return d; } starpu-1.1.5/starpu-top/qwt/qwt_symbol.h0000644000373600000000000000722612571536557015277 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SYMBOL_H #define QWT_SYMBOL_H #include "qwt_global.h" #include class QPainter; class QRect; class QSize; class QBrush; class QPen; class QColor; class QPointF; //! A class for drawing symbols class QWT_EXPORT QwtSymbol { public: /*! Symbol Style - NoSymbol\n No Style. The symbol cannot be drawn. - Ellipse\n Ellipse or circle - Rect\n Rectangle - Diamond\n Diamond - Triangle\n Triangle pointing upwards - DTriangle\n Triangle pointing downwards - UTriangle\n Triangle pointing upwards - LTriangle\n Triangle pointing left - RTriangle\n Triangle pointing right - Cross\n Cross (+) - XCross\n Diagonal cross (X) - HLine\n Horizontal line - VLine\n Vertical line - Star1\n X combined with + - Star2\n Six-pointed star - Hexagon\n Hexagon - UserSymbol\n Styles >= UserSymbol are reserved for derived classes of QwtSymbol that overload drawSymbols() with additional application specific symbol types. \sa setStyle(), style() */ enum Style { NoSymbol = -1, Ellipse, Rect, Diamond, Triangle, DTriangle, UTriangle, LTriangle, RTriangle, Cross, XCross, HLine, VLine, Star1, Star2, Hexagon, UserSymbol = 1000 }; public: QwtSymbol( Style = NoSymbol ); QwtSymbol( Style, const QBrush &, const QPen &, const QSize & ); QwtSymbol( const QwtSymbol & ); virtual ~QwtSymbol(); QwtSymbol &operator=( const QwtSymbol & ); bool operator==( const QwtSymbol & ) const; bool operator!=( const QwtSymbol & ) const; void setSize( const QSize & ); void setSize( int width, int height = -1 ); const QSize& size() const; virtual void setColor( const QColor & ); void setBrush( const QBrush& b ); const QBrush& brush() const; void setPen( const QPen & ); const QPen& pen() const; void setStyle( Style ); Style style() const; void drawSymbol( QPainter *, const QPointF & ) const; void drawSymbols( QPainter *, const QPolygonF & ) const; virtual QSize boundingSize() const; protected: virtual void drawSymbols( QPainter *, const QPointF *, int numPoints ) const; private: class PrivateData; PrivateData *d_data; }; /*! \brief Draw the symbol at a specified position \param painter Painter \param pos Position of the symbol in screen coordinates */ inline void QwtSymbol::drawSymbol( QPainter *painter, const QPointF &pos ) const { drawSymbols( painter, &pos, 1 ); } /*! \brief Draw symbols at the specified points \param painter Painter \param points Positions of the symbols in screen coordinates */ inline void QwtSymbol::drawSymbols( QPainter *painter, const QPolygonF &points ) const { drawSymbols( painter, points.data(), points.size() ); } #endif starpu-1.1.5/starpu-top/qwt/qwt_legend.h0000644000373600000000000000501712571536557015224 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_H #define QWT_LEGEND_H #include "qwt_global.h" #include #include class QScrollBar; class QwtLegendItemManager; /*! \brief The legend widget The QwtLegend widget is a tabular arrangement of legend items. Legend items might be any type of widget, but in general they will be a QwtLegendItem. \sa QwtLegendItem, QwtLegendItemManager QwtPlot */ class QWT_EXPORT QwtLegend : public QFrame { Q_OBJECT public: /*! \brief Interaction mode for the legend items - ReadOnlyItem\n The legend item is not interactive, like a label - ClickableItem\n The legend item is clickable, like a push button - CheckableItem\n The legend item is checkable, like a checkable button Default is ReadOnlyItem. \sa setItemMode(), itemMode(), QwtLegendItem::IdentifierMode QwtLegendItem::clicked(), QwtLegendItem::checked(), QwtPlot::legendClicked(), QwtPlot::legendChecked() */ enum LegendItemMode { ReadOnlyItem, ClickableItem, CheckableItem }; explicit QwtLegend( QWidget *parent = NULL ); virtual ~QwtLegend(); void setItemMode( LegendItemMode ); LegendItemMode itemMode() const; QWidget *contentsWidget(); const QWidget *contentsWidget() const; void insert( const QwtLegendItemManager *, QWidget * ); void remove( const QwtLegendItemManager * ); QWidget *find( const QwtLegendItemManager * ) const; QwtLegendItemManager *find( const QWidget * ) const; virtual QList legendItems() const; void clear(); bool isEmpty() const; uint itemCount() const; virtual bool eventFilter( QObject *, QEvent * ); virtual QSize sizeHint() const; virtual int heightForWidth( int w ) const; QScrollBar *horizontalScrollBar() const; QScrollBar *verticalScrollBar() const; protected: virtual void resizeEvent( QResizeEvent * ); virtual void layoutContents(); private: class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_global.h0000644000373600000000000000234212571536557015224 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_GLOBAL_H #define QWT_GLOBAL_H #include // QWT_VERSION is (major << 16) + (minor << 8) + patch. #define QWT_VERSION 0x060000 #define QWT_VERSION_STR "6.0.0-svn" #if defined(Q_WS_WIN) || defined(Q_WS_S60) #if defined(_MSC_VER) /* MSVC Compiler */ /* template-class specialization 'identifier' is already instantiated */ #pragma warning(disable: 4660) #endif // _MSC_VER #ifdef QWT_DLL #if defined(QWT_MAKEDLL) // create a Qwt DLL library #define QWT_EXPORT __declspec(dllexport) #define QWT_TEMPLATEDLL #else // use a Qwt DLL library #define QWT_EXPORT __declspec(dllimport) #endif #endif // QWT_DLL #endif // Q_WS_WIN || Q_WS_S60 #ifndef QWT_EXPORT #define QWT_EXPORT #endif // #define QWT_NO_COMPAT 1 // disable withdrawn functionality #endif starpu-1.1.5/starpu-top/qwt/qwt_thermo.cpp0000644000373600000000000005640212571536557015623 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_thermo.h" #include "qwt_math.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include #include #include #include #include #include #include class QwtThermo::PrivateData { public: PrivateData(): fillBrush( Qt::black ), alarmBrush( Qt::white ), orientation( Qt::Vertical ), scalePos( QwtThermo::LeftScale ), borderWidth( 2 ), scaleDist( 3 ), thermoWidth( 10 ), minValue( 0.0 ), maxValue( 1.0 ), value( 0.0 ), alarmLevel( 0.0 ), alarmEnabled( false ) { map.setScaleInterval( minValue, maxValue ); } QwtScaleMap map; QRect thermoRect; QBrush fillBrush; QBrush alarmBrush; Qt::Orientation orientation; ScalePos scalePos; int borderWidth; int scaleDist; int thermoWidth; double minValue; double maxValue; double value; double alarmLevel; bool alarmEnabled; }; /*! Constructor \param parent Parent widget */ QwtThermo::QwtThermo( QWidget *parent ): QWidget( parent ) { initThermo(); } void QwtThermo::initThermo() { d_data = new PrivateData; setRange( d_data->minValue, d_data->maxValue, false ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); if ( d_data->orientation == Qt::Vertical ) policy.transpose(); setSizePolicy( policy ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } //! Destructor QwtThermo::~QwtThermo() { delete d_data; } /*! Set the maximum value. \param max Maximum value \sa maxValue(), setMinValue() */ void QwtThermo::setMaxValue( double max ) { setRange( d_data->minValue, max ); } //! Return the maximum value. double QwtThermo::maxValue() const { return d_data->maxValue; } /*! Set the minimum value. \param min Minimum value \sa minValue(), setMaxValue() */ void QwtThermo::setMinValue( double min ) { setRange( min, d_data->maxValue ); } //! Return the minimum value. double QwtThermo::minValue() const { return d_data->minValue; } /*! Set the current value. \param value New Value \sa value() */ void QwtThermo::setValue( double value ) { if ( d_data->value != value ) { d_data->value = value; update(); } } //! Return the value. double QwtThermo::value() const { return d_data->value; } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtThermo or the next call of setScaleDraw(). */ void QwtThermo::setScaleDraw( QwtScaleDraw *scaleDraw ) { setAbstractScaleDraw( scaleDraw ); } /*! \return the scale draw of the thermo \sa setScaleDraw() */ const QwtScaleDraw *QwtThermo::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the thermo \sa setScaleDraw() */ QwtScaleDraw *QwtThermo::scaleDraw() { return static_cast( abstractScaleDraw() ); } /*! Qt paint event. event Paint event */ void QwtThermo::paintEvent( QPaintEvent *event ) { // Use double-buffering const QRect &ur = event->rect(); if ( ur.isValid() ) { QPainter painter( this ); draw( &painter, ur ); } } /*! Draw the whole QwtThermo. \param painter Painter \param rect Update rectangle */ void QwtThermo::draw( QPainter *painter, const QRect& rect ) { if ( !d_data->thermoRect.contains( rect ) ) { if ( d_data->scalePos != NoScale ) scaleDraw()->draw( painter, palette() ); qDrawShadePanel( painter, d_data->thermoRect.x() - d_data->borderWidth, d_data->thermoRect.y() - d_data->borderWidth, d_data->thermoRect.width() + 2 * d_data->borderWidth, d_data->thermoRect.height() + 2 * d_data->borderWidth, palette(), true, d_data->borderWidth, 0 ); } drawThermo( painter ); } //! Qt resize event handler void QwtThermo::resizeEvent( QResizeEvent * ) { layoutThermo( false ); } /*! Recalculate the QwtThermo geometry and layout based on the QwtThermo::rect() and the fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtThermo::layoutThermo( bool update_geometry ) { QRect r = rect(); int mbd = 0; if ( d_data->scalePos != NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); mbd = qMax( d1, d2 ); } if ( d_data->orientation == Qt::Horizontal ) { switch ( d_data->scalePos ) { case TopScale: { d_data->thermoRect.setRect( r.x() + mbd + d_data->borderWidth, r.y() + r.height() - d_data->thermoWidth - 2*d_data->borderWidth, r.width() - 2*( d_data->borderWidth + mbd ), d_data->thermoWidth ); scaleDraw()->setAlignment( QwtScaleDraw::TopScale ); scaleDraw()->move( d_data->thermoRect.x(), d_data->thermoRect.y() - d_data->borderWidth - d_data->scaleDist ); scaleDraw()->setLength( d_data->thermoRect.width() ); break; } case BottomScale: case NoScale: // like Bottom but without scale default: // inconsistent orientation and scale position // Mapping between values and pixels requires // initialization of the scale geometry { d_data->thermoRect.setRect( r.x() + mbd + d_data->borderWidth, r.y() + d_data->borderWidth, r.width() - 2*( d_data->borderWidth + mbd ), d_data->thermoWidth ); scaleDraw()->setAlignment( QwtScaleDraw::BottomScale ); scaleDraw()->move( d_data->thermoRect.x(), d_data->thermoRect.y() + d_data->thermoRect.height() + d_data->borderWidth + d_data->scaleDist ); scaleDraw()->setLength( d_data->thermoRect.width() ); break; } } d_data->map.setPaintInterval( d_data->thermoRect.x(), d_data->thermoRect.x() + d_data->thermoRect.width() - 1 ); } else // Qt::Vertical { switch ( d_data->scalePos ) { case RightScale: { d_data->thermoRect.setRect( r.x() + d_data->borderWidth, r.y() + mbd + d_data->borderWidth, d_data->thermoWidth, r.height() - 2*( d_data->borderWidth + mbd ) ); scaleDraw()->setAlignment( QwtScaleDraw::RightScale ); scaleDraw()->move( d_data->thermoRect.x() + d_data->thermoRect.width() + d_data->borderWidth + d_data->scaleDist, d_data->thermoRect.y() ); scaleDraw()->setLength( d_data->thermoRect.height() ); break; } case LeftScale: case NoScale: // like Left but without scale default: // inconsistent orientation and scale position // Mapping between values and pixels requires // initialization of the scale geometry { d_data->thermoRect.setRect( r.x() + r.width() - 2*d_data->borderWidth - d_data->thermoWidth, r.y() + mbd + d_data->borderWidth, d_data->thermoWidth, r.height() - 2*( d_data->borderWidth + mbd ) ); scaleDraw()->setAlignment( QwtScaleDraw::LeftScale ); scaleDraw()->move( d_data->thermoRect.x() - d_data->scaleDist - d_data->borderWidth, d_data->thermoRect.y() ); scaleDraw()->setLength( d_data->thermoRect.height() ); break; } } d_data->map.setPaintInterval( d_data->thermoRect.y() + d_data->thermoRect.height() - 1, d_data->thermoRect.y() ); } if ( update_geometry ) { updateGeometry(); update(); } } /*! \brief Set the thermometer orientation and the scale position. The scale position NoScale disables the scale. \param o orientation. Possible values are Qt::Horizontal and Qt::Vertical. The default value is Qt::Vertical. \param s Position of the scale. The default value is NoScale. A valid combination of scale position and orientation is enforced: - a horizontal thermometer can have the scale positions TopScale, BottomScale or NoScale; - a vertical thermometer can have the scale positions LeftScale, RightScale or NoScale; - an invalid scale position will default to NoScale. \sa setScalePosition() */ void QwtThermo::setOrientation( Qt::Orientation o, ScalePos s ) { if ( o == d_data->orientation && s == d_data->scalePos ) return; switch ( o ) { case Qt::Horizontal: { if ( ( s == NoScale ) || ( s == BottomScale ) || ( s == TopScale ) ) d_data->scalePos = s; else d_data->scalePos = NoScale; break; } case Qt::Vertical: { if ( ( s == NoScale ) || ( s == LeftScale ) || ( s == RightScale ) ) d_data->scalePos = s; else d_data->scalePos = NoScale; break; } } if ( o != d_data->orientation ) { if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } } d_data->orientation = o; layoutThermo(); } /*! \brief Change the scale position (and thermometer orientation). \param scalePos Position of the scale. A valid combination of scale position and orientation is enforced: - if the new scale position is LeftScale or RightScale, the scale orientation will become Qt::Vertical; - if the new scale position is BottomScale or TopScale, the scale orientation will become Qt::Horizontal; - if the new scale position is NoScale, the scale orientation will not change. \sa setOrientation(), scalePosition() */ void QwtThermo::setScalePosition( ScalePos scalePos ) { if ( ( scalePos == BottomScale ) || ( scalePos == TopScale ) ) setOrientation( Qt::Horizontal, scalePos ); else if ( ( scalePos == LeftScale ) || ( scalePos == RightScale ) ) setOrientation( Qt::Vertical, scalePos ); else setOrientation( d_data->orientation, NoScale ); } /*! Return the scale position. \sa setScalePosition() */ QwtThermo::ScalePos QwtThermo::scalePosition() const { return d_data->scalePos; } //! Notify a font change. void QwtThermo::fontChange( const QFont &f ) { QWidget::fontChange( f ); layoutThermo(); } //! Notify a scale change. void QwtThermo::scaleChange() { update(); layoutThermo(); } /*! Redraw the liquid in thermometer pipe. \param painter Painter */ void QwtThermo::drawThermo( QPainter *painter ) { int alarm = 0, taval = 0; QRect fRect; QRect aRect; QRect bRect; int inverted = ( d_data->maxValue < d_data->minValue ); // // Determine if value exceeds alarm threshold. // Note: The alarm value is allowed to lie // outside the interval (minValue, maxValue). // if ( d_data->alarmEnabled ) { if ( inverted ) { alarm = ( ( d_data->alarmLevel >= d_data->maxValue ) && ( d_data->alarmLevel <= d_data->minValue ) && ( d_data->value >= d_data->alarmLevel ) ); } else { alarm = ( ( d_data->alarmLevel >= d_data->minValue ) && ( d_data->alarmLevel <= d_data->maxValue ) && ( d_data->value >= d_data->alarmLevel ) ); } } // // transform values // int tval = transform( d_data->value ); if ( alarm ) taval = transform( d_data->alarmLevel ); // // calculate recangles // if ( d_data->orientation == Qt::Horizontal ) { if ( inverted ) { bRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), tval - d_data->thermoRect.x(), d_data->thermoRect.height() ); if ( alarm ) { aRect.setRect( tval, d_data->thermoRect.y(), taval - tval + 1, d_data->thermoRect.height() ); fRect.setRect( taval + 1, d_data->thermoRect.y(), d_data->thermoRect.x() + d_data->thermoRect.width() - ( taval + 1 ), d_data->thermoRect.height() ); } else { fRect.setRect( tval, d_data->thermoRect.y(), d_data->thermoRect.x() + d_data->thermoRect.width() - tval, d_data->thermoRect.height() ); } } else { bRect.setRect( tval + 1, d_data->thermoRect.y(), d_data->thermoRect.width() - ( tval + 1 - d_data->thermoRect.x() ), d_data->thermoRect.height() ); if ( alarm ) { aRect.setRect( taval, d_data->thermoRect.y(), tval - taval + 1, d_data->thermoRect.height() ); fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), taval - d_data->thermoRect.x(), d_data->thermoRect.height() ); } else { fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), tval - d_data->thermoRect.x() + 1, d_data->thermoRect.height() ); } } } else // Qt::Vertical { if ( tval < d_data->thermoRect.y() ) tval = d_data->thermoRect.y(); else { if ( tval > d_data->thermoRect.y() + d_data->thermoRect.height() ) tval = d_data->thermoRect.y() + d_data->thermoRect.height(); } if ( inverted ) { bRect.setRect( d_data->thermoRect.x(), tval + 1, d_data->thermoRect.width(), d_data->thermoRect.height() - ( tval + 1 - d_data->thermoRect.y() ) ); if ( alarm ) { aRect.setRect( d_data->thermoRect.x(), taval, d_data->thermoRect.width(), tval - taval + 1 ); fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), d_data->thermoRect.width(), taval - d_data->thermoRect.y() ); } else { fRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), d_data->thermoRect.width(), tval - d_data->thermoRect.y() + 1 ); } } else { bRect.setRect( d_data->thermoRect.x(), d_data->thermoRect.y(), d_data->thermoRect.width(), tval - d_data->thermoRect.y() ); if ( alarm ) { aRect.setRect( d_data->thermoRect.x(), tval, d_data->thermoRect.width(), taval - tval + 1 ); fRect.setRect( d_data->thermoRect.x(), taval + 1, d_data->thermoRect.width(), d_data->thermoRect.y() + d_data->thermoRect.height() - ( taval + 1 ) ); } else { fRect.setRect( d_data->thermoRect.x(), tval, d_data->thermoRect.width(), d_data->thermoRect.y() + d_data->thermoRect.height() - tval ); } } } // // paint thermometer // const QColor bgColor = palette().color( QPalette::Window ); painter->fillRect( bRect, bgColor ); if ( alarm ) painter->fillRect( aRect, d_data->alarmBrush ); painter->fillRect( fRect, d_data->fillBrush ); } /*! Set the border width of the pipe. \param width Border width \sa borderWidth() */ void QwtThermo::setBorderWidth( int width ) { if ( ( width >= 0 ) && ( width < ( qMin( d_data->thermoRect.width(), d_data->thermoRect.height() ) + d_data->borderWidth ) / 2 - 1 ) ) { d_data->borderWidth = width; layoutThermo(); } } /*! Return the border width of the thermometer pipe. \sa setBorderWidth() */ int QwtThermo::borderWidth() const { return d_data->borderWidth; } /*! \brief Set the range \param vmin value corresponding lower or left end of the thermometer \param vmax value corresponding to the upper or right end of the thermometer \param logarithmic logarithmic mapping, true or false */ void QwtThermo::setRange( double vmin, double vmax, bool logarithmic ) { d_data->minValue = vmin; d_data->maxValue = vmax; if ( logarithmic ) setScaleEngine( new QwtLog10ScaleEngine ); else setScaleEngine( new QwtLinearScaleEngine ); /* There are two different maps, one for the scale, the other for the values. This is confusing and will be changed in the future. TODO ... */ d_data->map.setTransformation( scaleEngine()->transformation() ); d_data->map.setScaleInterval( d_data->minValue, d_data->maxValue ); if ( autoScale() ) rescale( d_data->minValue, d_data->maxValue ); layoutThermo(); } /*! \brief Change the brush of the liquid. \param brush New brush. The default brush is solid black. \sa fillBrush() */ void QwtThermo::setFillBrush( const QBrush& brush ) { d_data->fillBrush = brush; update(); } /*! Return the liquid brush. \sa setFillBrush() */ const QBrush& QwtThermo::fillBrush() const { return d_data->fillBrush; } /*! \brief Change the color of the liquid. \param c New color. The default color is black. \sa fillColor() */ void QwtThermo::setFillColor( const QColor &c ) { d_data->fillBrush.setColor( c ); update(); } /*! Return the liquid color. \sa setFillColor() */ const QColor &QwtThermo::fillColor() const { return d_data->fillBrush.color(); } /*! \brief Specify the liquid brush above the alarm threshold \param brush New brush. The default is solid white. \sa alarmBrush() */ void QwtThermo::setAlarmBrush( const QBrush& brush ) { d_data->alarmBrush = brush; update(); } /*! Return the liquid brush above the alarm threshold. \sa setAlarmBrush() */ const QBrush& QwtThermo::alarmBrush() const { return d_data->alarmBrush; } /*! \brief Specify the liquid color above the alarm threshold \param c New color. The default is white. */ void QwtThermo::setAlarmColor( const QColor &c ) { d_data->alarmBrush.setColor( c ); update(); } //! Return the liquid color above the alarm threshold. const QColor &QwtThermo::alarmColor() const { return d_data->alarmBrush.color(); } /*! Specify the alarm threshold. \param level Alarm threshold \sa alarmLevel() */ void QwtThermo::setAlarmLevel( double level ) { d_data->alarmLevel = level; d_data->alarmEnabled = 1; update(); } /*! Return the alarm threshold. \sa setAlarmLevel() */ double QwtThermo::alarmLevel() const { return d_data->alarmLevel; } /*! Change the width of the pipe. \param width Width of the pipe \sa pipeWidth() */ void QwtThermo::setPipeWidth( int width ) { if ( width > 0 ) { d_data->thermoWidth = width; layoutThermo(); } } /*! Return the width of the pipe. \sa setPipeWidth() */ int QwtThermo::pipeWidth() const { return d_data->thermoWidth; } /*! \brief Specify the distance between the pipe's endpoints and the widget's border The margin is used to leave some space for the scale labels. If a large font is used, it is advisable to adjust the margins. \param m New Margin. The default values are 10 for horizontal orientation and 20 for vertical orientation. \warning The margin has no effect if the scale is disabled. \warning This function is a NOOP because margins are determined automatically. */ void QwtThermo::setMargin( int ) { } /*! \brief Enable or disable the alarm threshold \param tf true (disabled) or false (enabled) */ void QwtThermo::setAlarmEnabled( bool tf ) { d_data->alarmEnabled = tf; update(); } //! Return if the alarm threshold is enabled or disabled. bool QwtThermo::alarmEnabled() const { return d_data->alarmEnabled; } /*! \return the minimum size hint \sa minimumSizeHint() */ QSize QwtThermo::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value depends on the font and the scale. \sa sizeHint() */ QSize QwtThermo::minimumSizeHint() const { int w = 0, h = 0; if ( d_data->scalePos != NoScale ) { const int sdExtent = qCeil( scaleDraw()->extent( font() ) ); const int sdLength = scaleDraw()->minLength( font() ); w = sdLength; h = d_data->thermoWidth + sdExtent + d_data->borderWidth + d_data->scaleDist; } else // no scale { w = 200; h = d_data->thermoWidth; } if ( d_data->orientation == Qt::Vertical ) qSwap( w, h ); w += 2 * d_data->borderWidth; h += 2 * d_data->borderWidth; return QSize( w, h ); } int QwtThermo::transform( double value ) const { const double min = qMin( d_data->map.s1(), d_data->map.s2() ); const double max = qMax( d_data->map.s1(), d_data->map.s2() ); if ( value > max ) value = max; if ( value < min ) value = min; return qRound( d_data->map.transform( value ) ); } starpu-1.1.5/starpu-top/qwt/qwt_slider.cpp0000644000373600000000000005176712571536560015612 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_slider.h" #include "qwt_painter.h" #include "qwt_scale_draw.h" #include "qwt_scale_map.h" #include #include #include #include #include class QwtSlider::PrivateData { public: QRect sliderRect; int thumbLength; int thumbWidth; int borderWidth; int scaleDist; int xMargin; int yMargin; QwtSlider::ScalePos scalePos; QwtSlider::BGSTYLE bgStyle; /* Scale and values might have different maps. This is confusing and I can't see strong arguments for such a feature. TODO ... */ QwtScaleMap map; // linear map mutable QSize sizeHintCache; }; /*! \brief Constructor \param parent parent widget \param orientation Orientation of the slider. Can be Qt::Horizontal or Qt::Vertical. Defaults to Qt::Horizontal. \param scalePos Position of the scale. Defaults to QwtSlider::NoScale. \param bgStyle Background style. QwtSlider::BgTrough draws the slider button in a trough, QwtSlider::BgSlot draws a slot underneath the button. An or-combination of both may also be used. The default is QwtSlider::BgTrough. QwtSlider enforces valid combinations of its orientation and scale position. If the combination is invalid, the scale position will be set to NoScale. Valid combinations are: - Qt::Horizonal with NoScale, TopScale, or BottomScale; - Qt::Vertical with NoScale, LeftScale, or RightScale. */ QwtSlider::QwtSlider( QWidget *parent, Qt::Orientation orientation, ScalePos scalePos, BGSTYLE bgStyle ): QwtAbstractSlider( orientation, parent ) { initSlider( orientation, scalePos, bgStyle ); } void QwtSlider::initSlider( Qt::Orientation orientation, ScalePos scalePos, BGSTYLE bgStyle ) { if ( orientation == Qt::Vertical ) setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding ); else setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); d_data = new QwtSlider::PrivateData; d_data->borderWidth = 2; d_data->scaleDist = 4; d_data->scalePos = scalePos; d_data->xMargin = 0; d_data->yMargin = 0; d_data->bgStyle = bgStyle; if ( bgStyle == BgSlot ) { d_data->thumbLength = 16; d_data->thumbWidth = 30; } else { d_data->thumbLength = 31; d_data->thumbWidth = 16; } d_data->sliderRect.setRect( 0, 0, 8, 8 ); QwtScaleDraw::Alignment align; if ( orientation == Qt::Vertical ) { // enforce a valid combination of scale position and orientation if ( ( d_data->scalePos == BottomScale ) || ( d_data->scalePos == TopScale ) ) d_data->scalePos = NoScale; // adopt the policy of layoutSlider (NoScale lays out like Left) if ( d_data->scalePos == RightScale ) align = QwtScaleDraw::RightScale; else align = QwtScaleDraw::LeftScale; } else { // enforce a valid combination of scale position and orientation if ( ( d_data->scalePos == LeftScale ) || ( d_data->scalePos == RightScale ) ) d_data->scalePos = NoScale; // adopt the policy of layoutSlider (NoScale lays out like Bottom) if ( d_data->scalePos == TopScale ) align = QwtScaleDraw::TopScale; else align = QwtScaleDraw::BottomScale; } scaleDraw()->setAlignment( align ); scaleDraw()->setLength( 100 ); setRange( 0.0, 100.0, 1.0 ); setValue( 0.0 ); } QwtSlider::~QwtSlider() { delete d_data; } /*! \brief Set the orientation. \param o Orientation. Allowed values are Qt::Horizontal and Qt::Vertical. If the new orientation and the old scale position are an invalid combination, the scale position will be set to QwtSlider::NoScale. \sa QwtAbstractSlider::orientation() */ void QwtSlider::setOrientation( Qt::Orientation o ) { if ( o == orientation() ) return; if ( o == Qt::Horizontal ) { if ( ( d_data->scalePos == LeftScale ) || ( d_data->scalePos == RightScale ) ) d_data->scalePos = NoScale; } else // if (o == Qt::Vertical) { if ( ( d_data->scalePos == BottomScale ) || ( d_data->scalePos == TopScale ) ) d_data->scalePos = NoScale; } if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) ) { QSizePolicy sp = sizePolicy(); sp.transpose(); setSizePolicy( sp ); setAttribute( Qt::WA_WState_OwnSizePolicy, false ); } QwtAbstractSlider::setOrientation( o ); layoutSlider(); } /*! \brief Change the scale position (and slider orientation). \param s Position of the scale. A valid combination of scale position and orientation is enforced: - if the new scale position is Left or Right, the scale orientation will become Qt::Vertical; - if the new scale position is Bottom or Top the scale orientation will become Qt::Horizontal; - if the new scale position is QwtSlider::NoScale, the scale orientation will not change. */ void QwtSlider::setScalePosition( ScalePos s ) { if ( d_data->scalePos == s ) return; d_data->scalePos = s; switch ( d_data->scalePos ) { case BottomScale: { setOrientation( Qt::Horizontal ); scaleDraw()->setAlignment( QwtScaleDraw::BottomScale ); break; } case TopScale: { setOrientation( Qt::Horizontal ); scaleDraw()->setAlignment( QwtScaleDraw::TopScale ); break; } case LeftScale: { setOrientation( Qt::Vertical ); scaleDraw()->setAlignment( QwtScaleDraw::LeftScale ); break; } case RightScale: { setOrientation( Qt::Vertical ); scaleDraw()->setAlignment( QwtScaleDraw::RightScale ); break; } default: { // nothing } } layoutSlider(); } //! Return the scale position. QwtSlider::ScalePos QwtSlider::scalePosition() const { return d_data->scalePos; } /*! \brief Change the slider's border width \param bd border width */ void QwtSlider::setBorderWidth( int bd ) { if ( bd < 0 ) bd = 0; if ( bd != d_data->borderWidth ) { d_data->borderWidth = bd; layoutSlider(); } } /*! \brief Set the slider's thumb length \param thumbLength new length */ void QwtSlider::setThumbLength( int thumbLength ) { if ( thumbLength < 8 ) thumbLength = 8; if ( thumbLength != d_data->thumbLength ) { d_data->thumbLength = thumbLength; layoutSlider(); } } /*! \brief Change the width of the thumb \param w new width */ void QwtSlider::setThumbWidth( int w ) { if ( w < 4 ) w = 4; if ( d_data->thumbWidth != w ) { d_data->thumbWidth = w; layoutSlider(); } } /*! \brief Set a scale draw For changing the labels of the scales, it is necessary to derive from QwtScaleDraw and overload QwtScaleDraw::label(). \param scaleDraw ScaleDraw object, that has to be created with new and will be deleted in ~QwtSlider or the next call of setScaleDraw(). */ void QwtSlider::setScaleDraw( QwtScaleDraw *scaleDraw ) { const QwtScaleDraw *previousScaleDraw = this->scaleDraw(); if ( scaleDraw == NULL || scaleDraw == previousScaleDraw ) return; if ( previousScaleDraw ) scaleDraw->setAlignment( previousScaleDraw->alignment() ); setAbstractScaleDraw( scaleDraw ); layoutSlider(); } /*! \return the scale draw of the slider \sa setScaleDraw() */ const QwtScaleDraw *QwtSlider::scaleDraw() const { return static_cast( abstractScaleDraw() ); } /*! \return the scale draw of the slider \sa setScaleDraw() */ QwtScaleDraw *QwtSlider::scaleDraw() { return static_cast( abstractScaleDraw() ); } //! Notify changed scale void QwtSlider::scaleChange() { layoutSlider(); } //! Notify change in font void QwtSlider::fontChange( const QFont &f ) { QwtAbstractSlider::fontChange( f ); layoutSlider(); } /*! Draw the slider into the specified rectangle. \param painter Painter \param r Rectangle */ void QwtSlider::drawSlider( QPainter *painter, const QRect &r ) { QRect cr( r ); if ( d_data->bgStyle & BgTrough ) { qDrawShadePanel( painter, r.x(), r.y(), r.width(), r.height(), palette(), true, d_data->borderWidth, 0 ); cr.setRect( r.x() + d_data->borderWidth, r.y() + d_data->borderWidth, r.width() - 2 * d_data->borderWidth, r.height() - 2 * d_data->borderWidth ); painter->fillRect( cr.x(), cr.y(), cr.width(), cr.height(), palette().brush( QPalette::Mid ) ); } if ( d_data->bgStyle & BgSlot ) { int ws = 4; int ds = d_data->thumbLength / 2 - 4; if ( ds < 1 ) ds = 1; QRect rSlot; if ( orientation() == Qt::Horizontal ) { if ( cr.height() & 1 ) ws++; rSlot = QRect( cr.x() + ds, cr.y() + ( cr.height() - ws ) / 2, cr.width() - 2 * ds, ws ); } else { if ( cr.width() & 1 ) ws++; rSlot = QRect( cr.x() + ( cr.width() - ws ) / 2, cr.y() + ds, ws, cr.height() - 2 * ds ); } painter->fillRect( rSlot.x(), rSlot.y(), rSlot.width(), rSlot.height(), palette().brush( QPalette::Dark ) ); qDrawShadePanel( painter, rSlot.x(), rSlot.y(), rSlot.width(), rSlot.height(), palette(), true, 1 , 0 ); } if ( isValid() ) drawThumb( painter, cr, xyPosition( value() ) ); } /*! Draw the thumb at a position \param painter Painter \param sliderRect Bounding rectangle of the slider \param pos Position of the slider thumb */ void QwtSlider::drawThumb( QPainter *painter, const QRect &sliderRect, int pos ) { pos++; // shade line points one pixel below if ( orientation() == Qt::Horizontal ) { qDrawShadePanel( painter, pos - d_data->thumbLength / 2, sliderRect.y(), d_data->thumbLength, sliderRect.height(), palette(), false, d_data->borderWidth, &palette().brush( QPalette::Button ) ); qDrawShadeLine( painter, pos, sliderRect.y(), pos, sliderRect.y() + sliderRect.height() - 2, palette(), true, 1 ); } else // Vertical { qDrawShadePanel( painter, sliderRect.x(), pos - d_data->thumbLength / 2, sliderRect.width(), d_data->thumbLength, palette(), false, d_data->borderWidth, &palette().brush( QPalette::Button ) ); qDrawShadeLine( painter, sliderRect.x(), pos, sliderRect.x() + sliderRect.width() - 2, pos, palette(), true, 1 ); } } /*! Find the x/y position for a given value v \param value Value */ int QwtSlider::xyPosition( double value ) const { return qRound( d_data->map.transform( value ) ); } /*! Determine the value corresponding to a specified mouse location. \param pos Mouse position */ double QwtSlider::getValue( const QPoint &pos ) { return d_data->map.invTransform( orientation() == Qt::Horizontal ? pos.x() : pos.y() ); } /*! \brief Determine scrolling mode and direction \param p point \param scrollMode Scrolling mode \param direction Direction */ void QwtSlider::getScrollMode( const QPoint &p, int &scrollMode, int &direction ) { if ( !d_data->sliderRect.contains( p ) ) { scrollMode = ScrNone; direction = 0; return; } const int pos = ( orientation() == Qt::Horizontal ) ? p.x() : p.y(); const int markerPos = xyPosition( value() ); if ( ( pos > markerPos - d_data->thumbLength / 2 ) && ( pos < markerPos + d_data->thumbLength / 2 ) ) { scrollMode = ScrMouse; direction = 0; return; } scrollMode = ScrPage; direction = ( pos > markerPos ) ? 1 : -1; if ( scaleDraw()->map().p1() > scaleDraw()->map().p2() ) direction = -direction; } /*! Qt paint event \param event Paint event */ void QwtSlider::paintEvent( QPaintEvent *event ) { const QRect &ur = event->rect(); if ( ur.isValid() ) { QPainter painter( this ); draw( &painter, ur ); } } //! Draw the QwtSlider void QwtSlider::draw( QPainter *painter, const QRect& ) { if ( d_data->scalePos != NoScale ) scaleDraw()->draw( painter, palette() ); drawSlider( painter, d_data->sliderRect ); if ( hasFocus() ) QwtPainter::drawFocusRect( painter, this, d_data->sliderRect ); } //! Qt resize event void QwtSlider::resizeEvent( QResizeEvent * ) { layoutSlider( false ); } /*! Recalculate the slider's geometry and layout based on the current rect and fonts. \param update_geometry notify the layout system and call update to redraw the scale */ void QwtSlider::layoutSlider( bool update_geometry ) { int sliderWidth = d_data->thumbWidth; int sld1 = d_data->thumbLength / 2 - 1; int sld2 = d_data->thumbLength / 2 + d_data->thumbLength % 2; if ( d_data->bgStyle & BgTrough ) { sliderWidth += 2 * d_data->borderWidth; sld1 += d_data->borderWidth; sld2 += d_data->borderWidth; } int scd = 0; if ( d_data->scalePos != NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); scd = qMax( d1, d2 ); } int slo = scd - sld1; if ( slo < 0 ) slo = 0; int x, y, length; const QRect r = rect(); if ( orientation() == Qt::Horizontal ) { switch ( d_data->scalePos ) { case TopScale: { d_data->sliderRect.setRect( r.x() + d_data->xMargin + slo, r.y() + r.height() - d_data->yMargin - sliderWidth, r.width() - 2 * d_data->xMargin - 2 * slo, sliderWidth ); x = d_data->sliderRect.x() + sld1; y = d_data->sliderRect.y() - d_data->scaleDist; break; } case BottomScale: { d_data->sliderRect.setRect( r.x() + d_data->xMargin + slo, r.y() + d_data->yMargin, r.width() - 2 * d_data->xMargin - 2 * slo, sliderWidth ); x = d_data->sliderRect.x() + sld1; y = d_data->sliderRect.y() + d_data->sliderRect.height() + d_data->scaleDist; break; } case NoScale: // like Bottom, but no scale. See QwtSlider(). default: // inconsistent orientation and scale position { d_data->sliderRect.setRect( r.x() + d_data->xMargin + slo, r.y() + d_data->yMargin, r.width() - 2 * d_data->xMargin - 2 * slo, sliderWidth ); x = d_data->sliderRect.x() + sld1; y = 0; break; } } length = d_data->sliderRect.width() - ( sld1 + sld2 ); } else // if (orientation() == Qt::Vertical { switch ( d_data->scalePos ) { case RightScale: d_data->sliderRect.setRect( r.x() + d_data->xMargin, r.y() + d_data->yMargin + slo, sliderWidth, r.height() - 2 * d_data->yMargin - 2 * slo ); x = d_data->sliderRect.x() + d_data->sliderRect.width() + d_data->scaleDist; y = d_data->sliderRect.y() + sld1; break; case LeftScale: d_data->sliderRect.setRect( r.x() + r.width() - sliderWidth - d_data->xMargin, r.y() + d_data->yMargin + slo, sliderWidth, r.height() - 2 * d_data->yMargin - 2 * slo ); x = d_data->sliderRect.x() - d_data->scaleDist; y = d_data->sliderRect.y() + sld1; break; case NoScale: // like Left, but no scale. See QwtSlider(). default: // inconsistent orientation and scale position d_data->sliderRect.setRect( r.x() + r.width() - sliderWidth - d_data->xMargin, r.y() + d_data->yMargin + slo, sliderWidth, r.height() - 2 * d_data->yMargin - 2 * slo ); x = 0; y = d_data->sliderRect.y() + sld1; break; } length = d_data->sliderRect.height() - ( sld1 + sld2 ); } scaleDraw()->move( x, y ); scaleDraw()->setLength( length ); d_data->map.setPaintInterval( scaleDraw()->map().p1(), scaleDraw()->map().p2() ); if ( update_geometry ) { d_data->sizeHintCache = QSize(); // invalidate updateGeometry(); update(); } } //! Notify change of value void QwtSlider::valueChange() { QwtAbstractSlider::valueChange(); update(); } //! Notify change of range void QwtSlider::rangeChange() { d_data->map.setScaleInterval( minValue(), maxValue() ); if ( autoScale() ) rescale( minValue(), maxValue() ); QwtAbstractSlider::rangeChange(); layoutSlider(); } /*! \brief Set distances between the widget's border and internals. \param xMargin Horizontal margin \param yMargin Vertical margin */ void QwtSlider::setMargins( int xMargin, int yMargin ) { if ( xMargin < 0 ) xMargin = 0; if ( yMargin < 0 ) yMargin = 0; if ( xMargin != d_data->xMargin || yMargin != d_data->yMargin ) { d_data->xMargin = xMargin; d_data->yMargin = yMargin; layoutSlider(); } } /*! Set the background style. */ void QwtSlider::setBgStyle( BGSTYLE st ) { d_data->bgStyle = st; layoutSlider(); } /*! \return the background style. */ QwtSlider::BGSTYLE QwtSlider::bgStyle() const { return d_data->bgStyle; } /*! \return the thumb length. */ int QwtSlider::thumbLength() const { return d_data->thumbLength; } /*! \return the thumb width. */ int QwtSlider::thumbWidth() const { return d_data->thumbWidth; } /*! \return the border width. */ int QwtSlider::borderWidth() const { return d_data->borderWidth; } /*! \return QwtSlider::minimumSizeHint() */ QSize QwtSlider::sizeHint() const { return minimumSizeHint(); } /*! \brief Return a minimum size hint \warning The return value of QwtSlider::minimumSizeHint() depends on the font and the scale. */ QSize QwtSlider::minimumSizeHint() const { if ( !d_data->sizeHintCache.isEmpty() ) return d_data->sizeHintCache; int sliderWidth = d_data->thumbWidth; if ( d_data->bgStyle & BgTrough ) sliderWidth += 2 * d_data->borderWidth; int w = 0, h = 0; if ( d_data->scalePos != NoScale ) { int d1, d2; scaleDraw()->getBorderDistHint( font(), d1, d2 ); int msMbd = qMax( d1, d2 ); int mbd = d_data->thumbLength / 2; if ( d_data->bgStyle & BgTrough ) mbd += d_data->borderWidth; if ( mbd < msMbd ) mbd = msMbd; const int sdExtent = qCeil( scaleDraw()->extent( font() ) ); const int sdLength = scaleDraw()->minLength( font() ); h = sliderWidth + sdExtent + d_data->scaleDist; w = sdLength - 2 * msMbd + 2 * mbd; } else // no scale { w = 200; h = sliderWidth; } if ( orientation() == Qt::Vertical ) qSwap( w, h ); w += 2 * d_data->xMargin; h += 2 * d_data->yMargin; d_data->sizeHintCache = QSize( w, h ); return d_data->sizeHintCache; } starpu-1.1.5/starpu-top/qwt/qwt_dial.h0000644000373600000000000001411012571536560014663 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DIAL_H #define QWT_DIAL_H 1 #include "qwt_global.h" #include "qwt_abstract_slider.h" #include "qwt_round_scale_draw.h" #include #include class QwtDialNeedle; class QwtDial; /*! \brief A special scale draw made for QwtDial \sa QwtDial, QwtCompass */ class QWT_EXPORT QwtDialScaleDraw: public QwtRoundScaleDraw { public: explicit QwtDialScaleDraw( QwtDial * ); virtual QwtText label( double value ) const; void setPenWidth( double ); double penWidth() const; private: QwtDial *d_parent; double d_penWidth; }; /*! \brief QwtDial class provides a rounded range control. QwtDial is intended as base class for dial widgets like speedometers, compass widgets, clocks ... \image html dials2.png A dial contains a scale and a needle indicating the current value of the dial. Depending on Mode one of them is fixed and the other is rotating. If not isReadOnly() the dial can be rotated by dragging the mouse or using keyboard inputs (see keyPressEvent()). A dial might be wrapping, what means a rotation below/above one limit continues on the other limit (f.e compass). The scale might cover any arc of the dial, its values are related to the origin() of the dial. Qwt is missing a set of good looking needles (QwtDialNeedle). Contributions are very welcome. \sa QwtCompass, QwtAnalogClock, QwtDialNeedle \note The examples/dials example shows different types of dials. */ class QWT_EXPORT QwtDial: public QwtAbstractSlider { Q_OBJECT Q_ENUMS( Shadow ) Q_ENUMS( Mode ) Q_ENUMS( Direction ) Q_PROPERTY( bool visibleBackground READ hasVisibleBackground WRITE showBackground ) Q_PROPERTY( int lineWidth READ lineWidth WRITE setLineWidth ) Q_PROPERTY( Shadow frameShadow READ frameShadow WRITE setFrameShadow ) Q_PROPERTY( Mode mode READ mode WRITE setMode ) Q_PROPERTY( double origin READ origin WRITE setOrigin ) Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping ) Q_PROPERTY( Direction direction READ direction WRITE setDirection ) friend class QwtDialScaleDraw; public: /*! \brief Frame shadow Unfortunately it is not possible to use QFrame::Shadow as a property of a widget that is not derived from QFrame. The following enum is made for the designer only. It is safe to use QFrame::Shadow instead. */ enum Shadow { Plain = QFrame::Plain, Raised = QFrame::Raised, Sunken = QFrame::Sunken }; //! see QwtDial::setScaleOptions enum ScaleOptions { ScaleBackbone = 1, ScaleTicks = 2, ScaleLabel = 4 }; /*! In case of RotateNeedle the needle is rotating, in case of RotateScale, the needle points to origin() and the scale is rotating. */ enum Mode { RotateNeedle, RotateScale }; /*! Direction of the dial */ enum Direction { Clockwise, CounterClockwise }; explicit QwtDial( QWidget *parent = NULL ); virtual ~QwtDial(); void setFrameShadow( Shadow ); Shadow frameShadow() const; bool hasVisibleBackground() const; void showBackground( bool ); void setLineWidth( int ); int lineWidth() const; void setMode( Mode ); Mode mode() const; virtual void setWrapping( bool ); bool wrapping() const; virtual void setScale( int maxMajIntv, int maxMinIntv, double step = 0.0 ); void setScaleArc( double min, double max ); void setScaleOptions( int ); void setScaleTicks( int minLen, int medLen, int majLen, int penWidth = 1 ); double minScaleArc() const; double maxScaleArc() const; virtual void setOrigin( double ); double origin() const; void setDirection( Direction ); Direction direction() const; virtual void setNeedle( QwtDialNeedle * ); const QwtDialNeedle *needle() const; QwtDialNeedle *needle(); QRect boundingRect() const; QRect contentsRect() const; virtual QRect scaleContentsRect() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void setScaleDraw( QwtDialScaleDraw * ); QwtDialScaleDraw *scaleDraw(); const QwtDialScaleDraw *scaleDraw() const; protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); virtual void keyPressEvent( QKeyEvent * ); virtual void updateMask(); virtual void drawFrame( QPainter *p ); virtual void drawContents( QPainter * ) const; virtual void drawFocusIndicator( QPainter * ) const; virtual void drawScale( QPainter *, const QPoint ¢er, int radius, double origin, double arcMin, double arcMax ) const; /*! Draw the contents inside the scale Paints nothing. \param painter Painter \param center Center of the contents circle \param radius Radius of the contents circle */ virtual void drawScaleContents( QPainter *painter, const QPoint ¢er, int radius ) const; virtual void drawNeedle( QPainter *, const QPoint &, int radius, double direction, QPalette::ColorGroup ) const; virtual QwtText scaleLabel( double ) const; void updateScale(); virtual void rangeChange(); virtual void valueChange(); virtual double getValue( const QPoint & ); virtual void getScrollMode( const QPoint &, int &scrollMode, int &direction ); private: void initDial(); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_point_3d.h0000644000373600000000000000777712571536560015516 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ /*! \file */ #ifndef QWT_POINT_3D_H #define QWT_POINT_3D_H 1 #include "qwt_global.h" #include #ifndef QT_NO_DEBUG_STREAM #include #endif /*! \brief QwtPoint3D class defines a 3D point in double coordinates */ class QWT_EXPORT QwtPoint3D { public: QwtPoint3D(); QwtPoint3D( double x, double y, double z ); QwtPoint3D( const QwtPoint3D & ); QwtPoint3D( const QPointF & ); bool isNull() const; double x() const; double y() const; double z() const; double &rx(); double &ry(); double &rz(); void setX( double x ); void setY( double y ); void setZ( double y ); QPointF toPoint() const; bool operator==( const QwtPoint3D & ) const; bool operator!=( const QwtPoint3D & ) const; private: double d_x; double d_y; double d_z; }; #ifndef QT_NO_DEBUG_STREAM QWT_EXPORT QDebug operator<<( QDebug, const QwtPoint3D & ); #endif /*! Constructs a null point. \sa isNull() */ inline QwtPoint3D::QwtPoint3D(): d_x( 0.0 ), d_y( 0.0 ), d_z( 0.0 ) { } //! Constructs a point with coordinates specified by x, y and z. inline QwtPoint3D::QwtPoint3D( double x, double y, double z = 0.0 ): d_x( x ), d_y( y ), d_z( z ) { } /*! Copy constructor. Constructs a point using the values of the point specified. */ inline QwtPoint3D::QwtPoint3D( const QwtPoint3D &other ): d_x( other.d_x ), d_y( other.d_y ), d_z( other.d_z ) { } /*! Constructs a point with x and y coordinates from a 2D point, and a z coordinate of 0. */ inline QwtPoint3D::QwtPoint3D( const QPointF &other ): d_x( other.x() ), d_y( other.y() ), d_z( 0.0 ) { } /*! Returns true if the point is null; otherwise returns false. A point is considered to be null if x, y and z-coordinates are equal to zero. */ inline bool QwtPoint3D::isNull() const { return d_x == 0.0 && d_y == 0.0 && d_z == 0; } //! Returns the x-coordinate of the point. inline double QwtPoint3D::x() const { return d_x; } //! Returns the y-coordinate of the point. inline double QwtPoint3D::y() const { return d_y; } //! Returns the z-coordinate of the point. inline double QwtPoint3D::z() const { return d_z; } //! Returns a reference to the x-coordinate of the point. inline double &QwtPoint3D::rx() { return d_x; } //! Returns a reference to the y-coordinate of the point. inline double &QwtPoint3D::ry() { return d_y; } //! Returns a reference to the z-coordinate of the point. inline double &QwtPoint3D::rz() { return d_z; } //! Sets the x-coordinate of the point to the value specified by x. inline void QwtPoint3D::setX( double x ) { d_x = x; } //! Sets the y-coordinate of the point to the value specified by y. inline void QwtPoint3D::setY( double y ) { d_y = y; } //! Sets the z-coordinate of the point to the value specified by z. inline void QwtPoint3D::setZ( double z ) { d_z = z; } /*! Rounds 2D point, where the z coordinate is dropped. */ inline QPointF QwtPoint3D::toPoint() const { return QPointF( d_x, d_y ); } //! Returns true if this point and other are equal; otherwise returns false. inline bool QwtPoint3D::operator==( const QwtPoint3D &other ) const { return ( d_x == other.d_x ) && ( d_y == other.d_y ) && ( d_z == other.d_z ); } //! Returns true if this rect and other are different; otherwise returns false. inline bool QwtPoint3D::operator!=( const QwtPoint3D &other ) const { return !operator==( other ); } #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_item.cpp0000644000373600000000000002717512571536557016326 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_plot_item.h" #include "qwt_text.h" #include "qwt_plot.h" #include "qwt_legend.h" #include "qwt_legend_item.h" #include class QwtPlotItem::PrivateData { public: PrivateData(): plot( NULL ), isVisible( true ), attributes( 0 ), renderHints( 0 ), z( 0.0 ), xAxis( QwtPlot::xBottom ), yAxis( QwtPlot::yLeft ) { } mutable QwtPlot *plot; bool isVisible; int attributes; int renderHints; double z; int xAxis; int yAxis; QwtText title; }; /*! Constructor \param title Title of the item */ QwtPlotItem::QwtPlotItem( const QwtText &title ) { d_data = new PrivateData; d_data->title = title; } //! Destroy the QwtPlotItem QwtPlotItem::~QwtPlotItem() { attach( NULL ); delete d_data; } /*! \brief Attach the item to a plot. This method will attach a QwtPlotItem to the QwtPlot argument. It will first detach the QwtPlotItem from any plot from a previous call to attach (if necessary). If a NULL argument is passed, it will detach from any QwtPlot it was attached to. \param plot Plot widget \sa detach() */ void QwtPlotItem::attach( QwtPlot *plot ) { if ( plot == d_data->plot ) return; // remove the item from the previous plot if ( d_data->plot ) { if ( d_data->plot->legend() ) d_data->plot->legend()->remove( this ); d_data->plot->attachItem( this, false ); if ( d_data->plot->autoReplot() ) d_data->plot->update(); } d_data->plot = plot; if ( d_data->plot ) { // insert the item into the current plot d_data->plot->attachItem( this, true ); itemChanged(); } } /*! Return rtti for the specific class represented. QwtPlotItem is simply a virtual interface class, and base classes will implement this method with specific rtti values so a user can differentiate them. The rtti value is useful for environments, where the runtime type information is disabled and it is not possible to do a dynamic_cast<...>. \return rtti value \sa RttiValues */ int QwtPlotItem::rtti() const { return Rtti_PlotItem; } //! Return attached plot QwtPlot *QwtPlotItem::plot() const { return d_data->plot; } /*! Plot items are painted in increasing z-order. \return setZ(), QwtPlotDict::itemList() */ double QwtPlotItem::z() const { return d_data->z; } /*! \brief Set the z value Plot items are painted in increasing z-order. \param z Z-value \sa z(), QwtPlotDict::itemList() */ void QwtPlotItem::setZ( double z ) { if ( d_data->z != z ) { d_data->z = z; if ( d_data->plot ) { // update the z order d_data->plot->attachItem( this, false ); d_data->plot->attachItem( this, true ); } itemChanged(); } } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QString &title ) { setTitle( QwtText( title ) ); } /*! Set a new title \param title Title \sa title() */ void QwtPlotItem::setTitle( const QwtText &title ) { if ( d_data->title != title ) { d_data->title = title; itemChanged(); } } /*! \return Title of the item \sa setTitle() */ const QwtText &QwtPlotItem::title() const { return d_data->title; } /*! Toggle an item attribute \param attribute Attribute type \param on true/false \sa testItemAttribute(), ItemAttribute */ void QwtPlotItem::setItemAttribute( ItemAttribute attribute, bool on ) { if ( bool( d_data->attributes & attribute ) != on ) { if ( on ) d_data->attributes |= attribute; else d_data->attributes &= ~attribute; itemChanged(); } } /*! Test an item attribute \param attribute Attribute type \return true/false \sa setItemAttribute(), ItemAttribute */ bool QwtPlotItem::testItemAttribute( ItemAttribute attribute ) const { return d_data->attributes & attribute; } /*! Toggle an render hint \param hint Render hint \param on true/false \sa testRenderHint(), RenderHint */ void QwtPlotItem::setRenderHint( RenderHint hint, bool on ) { if ( ( ( d_data->renderHints & hint ) != 0 ) != on ) { if ( on ) d_data->renderHints |= hint; else d_data->renderHints &= ~hint; itemChanged(); } } /*! Test a render hint \param hint Render hint \return true/false \sa setRenderHint(), RenderHint */ bool QwtPlotItem::testRenderHint( RenderHint hint ) const { return ( d_data->renderHints & hint ); } //! Show the item void QwtPlotItem::show() { setVisible( true ); } //! Hide the item void QwtPlotItem::hide() { setVisible( false ); } /*! Show/Hide the item \param on Show if true, otherwise hide \sa isVisible(), show(), hide() */ void QwtPlotItem::setVisible( bool on ) { if ( on != d_data->isVisible ) { d_data->isVisible = on; itemChanged(); } } /*! \return true if visible \sa setVisible(), show(), hide() */ bool QwtPlotItem::isVisible() const { return d_data->isVisible; } /*! Update the legend and call QwtPlot::autoRefresh for the parent plot. \sa updateLegend() */ void QwtPlotItem::itemChanged() { if ( d_data->plot ) { if ( d_data->plot->legend() ) updateLegend( d_data->plot->legend() ); d_data->plot->autoRefresh(); } } /*! Set X and Y axis The item will painted according to the coordinates its Axes. \param xAxis X Axis \param yAxis Y Axis \sa setXAxis(), setYAxis(), xAxis(), yAxis() */ void QwtPlotItem::setAxes( int xAxis, int yAxis ) { if ( xAxis == QwtPlot::xBottom || xAxis == QwtPlot::xTop ) d_data->xAxis = xAxis; if ( yAxis == QwtPlot::yLeft || yAxis == QwtPlot::yRight ) d_data->yAxis = yAxis; itemChanged(); } /*! Set the X axis The item will painted according to the coordinates its Axes. \param axis X Axis \sa setAxes(), setYAxis(), xAxis() */ void QwtPlotItem::setXAxis( int axis ) { if ( axis == QwtPlot::xBottom || axis == QwtPlot::xTop ) { d_data->xAxis = axis; itemChanged(); } } /*! Set the Y axis The item will painted according to the coordinates its Axes. \param axis Y Axis \sa setAxes(), setXAxis(), yAxis() */ void QwtPlotItem::setYAxis( int axis ) { if ( axis == QwtPlot::yLeft || axis == QwtPlot::yRight ) { d_data->yAxis = axis; itemChanged(); } } //! Return xAxis int QwtPlotItem::xAxis() const { return d_data->xAxis; } //! Return yAxis int QwtPlotItem::yAxis() const { return d_data->yAxis; } /*! \return An invalid bounding rect: QRectF(1.0, 1.0, -2.0, -2.0) */ QRectF QwtPlotItem::boundingRect() const { return QRectF( 1.0, 1.0, -2.0, -2.0 ); // invalid } /*! \brief Allocate the widget that represents the item on the legend The default implementation returns a QwtLegendItem(), but an item could be represented by any type of widget, by overloading legendItem() and updateLegend(). \return QwtLegendItem() \sa updateLegend() QwtLegend() */ QWidget *QwtPlotItem::legendItem() const { QwtLegendItem *item = new QwtLegendItem; if ( d_data->plot ) { QObject::connect( item, SIGNAL( clicked() ), d_data->plot, SLOT( legendItemClicked() ) ); QObject::connect( item, SIGNAL( checked( bool ) ), d_data->plot, SLOT( legendItemChecked( bool ) ) ); } return item; } /*! \brief Update the widget that represents the item on the legend updateLegend() is called from itemChanged() to adopt the widget representing the item on the legend to its new configuration. The default implementation updates a QwtLegendItem(), but an item could be represented by any type of widget, by overloading legendItem() and updateLegend(). \param legend Legend \sa legendItem(), itemChanged(), QwtLegend() */ void QwtPlotItem::updateLegend( QwtLegend *legend ) const { if ( legend == NULL ) return; QWidget *lgdItem = legend->find( this ); if ( testItemAttribute( QwtPlotItem::Legend ) ) { if ( lgdItem == NULL ) { lgdItem = legendItem(); if ( lgdItem ) legend->insert( this, lgdItem ); } if ( lgdItem && lgdItem->inherits( "QwtLegendItem" ) ) { QwtLegendItem* label = ( QwtLegendItem* )lgdItem; if ( label ) { // paint the identifier const QSize sz = label->identifierSize(); QPixmap identifier( sz.width(), sz.height() ); identifier.fill( Qt::transparent ); QPainter painter( &identifier ); painter.setRenderHint( QPainter::Antialiasing, testRenderHint( QwtPlotItem::RenderAntialiased ) ); drawLegendIdentifier( &painter, QRect( 0, 0, sz.width(), sz.height() ) ); painter.end(); const bool doUpdate = label->updatesEnabled(); if ( doUpdate ) label->setUpdatesEnabled( false ); label->setText( title() ); label->setIdentifier( identifier ); label->setItemMode( legend->itemMode() ); if ( doUpdate ) label->setUpdatesEnabled( true ); label->update(); } } } else { if ( lgdItem ) { lgdItem->hide(); lgdItem->deleteLater(); } } } /*! \brief Update the item to changes of the axes scale division Update the item, when the axes of plot have changed. The default implementation does nothing, but items that depend on the scale division (like QwtPlotGrid()) have to reimplement updateScaleDiv() \param xScaleDiv Scale division of the x-axis \param yScaleDiv Scale division of the y-axis \sa QwtPlot::updateAxes() */ void QwtPlotItem::updateScaleDiv( const QwtScaleDiv &, const QwtScaleDiv & ) { } /*! \brief Calculate the bounding scale rect of 2 maps \param xMap X map \param yMap X map \return Bounding scale rect of the scale maps, normalized */ QRectF QwtPlotItem::scaleRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { return QRectF( xMap.s1(), yMap.s1(), xMap.sDist(), yMap.sDist() ); } /*! \brief Calculate the bounding paint rect of 2 maps \param xMap X map \param yMap X map \return Bounding paint rect of the scale maps, normalized */ QRectF QwtPlotItem::paintRect( const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const { const QRectF rect( xMap.p1(), yMap.p1(), xMap.pDist(), yMap.pDist() ); return rect; } starpu-1.1.5/starpu-top/qwt/qwt_legend_itemmanager.h0000644000373600000000000000310612571536557017572 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_LEGEND_ITEM_MANAGER_H #define QWT_LEGEND_ITEM_MANAGER_H #include "qwt_global.h" class QwtLegend; class QWidget; class QRectF; class QPainter; /*! \brief Abstract API to bind plot items to the legend */ class QWT_EXPORT QwtLegendItemManager { public: //! Constructor QwtLegendItemManager() { } //! Destructor virtual ~QwtLegendItemManager() { } /*! Update the widget that represents the item on the legend \param legend Legend \sa legendItem() */ virtual void updateLegend( QwtLegend *legend ) const = 0; /*! Allocate the widget that represents the item on the legend \return Allocated widget \sa updateLegend() QwtLegend() */ virtual QWidget *legendItem() const = 0; /*! QwtLegendItem can display an icon-identifier followed by a text. The icon helps to identify a plot item on the plot canvas and depends on the type of information, that is displayed. The default implementation paints nothing. */ virtual void drawLegendIdentifier( QPainter *, const QRectF & ) const { } }; #endif starpu-1.1.5/starpu-top/qwt/qwt_scale_map.cpp0000644000373600000000000001654312571536560016245 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_scale_map.h" #include #include #include #include #if QT_VERSION < 0x040601 #define qExp(x) ::exp(x) #endif QT_STATIC_CONST_IMPL double QwtScaleMap::LogMin = 1.0e-150; QT_STATIC_CONST_IMPL double QwtScaleMap::LogMax = 1.0e150; //! Constructor for a linear transformation QwtScaleTransformation::QwtScaleTransformation( Type type ): d_type( type ) { } //! Destructor QwtScaleTransformation::~QwtScaleTransformation() { } //! Create a clone of the transformation QwtScaleTransformation *QwtScaleTransformation::copy() const { return new QwtScaleTransformation( d_type ); } /*! \brief Transform a value between 2 linear intervals \param s value related to the interval [s1, s2] \param s1 first border of scale interval \param s2 second border of scale interval \param p1 first border of target interval \param p2 second border of target interval \return
linear mapping:
p1 + (p2 - p1) / (s2 - s1) * (s - s1)
log10 mapping:
p1 + (p2 - p1) / log(s2 / s1) * log(s / s1)
*/ double QwtScaleTransformation::xForm( double s, double s1, double s2, double p1, double p2 ) const { if ( d_type == Log10 ) return p1 + ( p2 - p1 ) / log( s2 / s1 ) * log( s / s1 ); else return p1 + ( p2 - p1 ) / ( s2 - s1 ) * ( s - s1 ); } /*! \brief Transform a value from a linear to a logarithmic interval \param p value related to the linear interval [p1, p2] \param p1 first border of linear interval \param p2 second border of linear interval \param s1 first border of logarithmic interval \param s2 second border of logarithmic interval \return
exp((p - p1) / (p2 - p1) * log(s2 / s1)) * s1;
*/ double QwtScaleTransformation::invXForm( double p, double p1, double p2, double s1, double s2 ) const { if ( d_type == Log10 ) return qExp( ( p - p1 ) / ( p2 - p1 ) * log( s2 / s1 ) ) * s1; else return s1 + ( s2 - s1 ) / ( p2 - p1 ) * ( p - p1 ); } /*! \brief Constructor The scale and paint device intervals are both set to [0,1]. */ QwtScaleMap::QwtScaleMap(): d_s1( 0.0 ), d_s2( 1.0 ), d_p1( 0.0 ), d_p2( 1.0 ), d_cnv( 1.0 ) { d_transformation = new QwtScaleTransformation( QwtScaleTransformation::Linear ); } //! Copy constructor QwtScaleMap::QwtScaleMap( const QwtScaleMap& other ): d_s1( other.d_s1 ), d_s2( other.d_s2 ), d_p1( other.d_p1 ), d_p2( other.d_p2 ), d_cnv( other.d_cnv ) { d_transformation = other.d_transformation->copy(); } /*! Destructor */ QwtScaleMap::~QwtScaleMap() { delete d_transformation; } //! Assignment operator QwtScaleMap &QwtScaleMap::operator=( const QwtScaleMap & other ) { d_s1 = other.d_s1; d_s2 = other.d_s2; d_p1 = other.d_p1; d_p2 = other.d_p2; d_cnv = other.d_cnv; delete d_transformation; d_transformation = other.d_transformation->copy(); return *this; } /*! Initialize the map with a transformation */ void QwtScaleMap::setTransformation( QwtScaleTransformation *transformation ) { if ( transformation == NULL ) return; if ( transformation != d_transformation ) { delete d_transformation; d_transformation = transformation; } setScaleInterval( d_s1, d_s2 ); } //! Get the transformation const QwtScaleTransformation *QwtScaleMap::transformation() const { return d_transformation; } /*! \brief Specify the borders of the scale interval \param s1 first border \param s2 second border \warning logarithmic scales might be aligned to [LogMin, LogMax] */ void QwtScaleMap::setScaleInterval( double s1, double s2 ) { if ( d_transformation->type() == QwtScaleTransformation::Log10 ) { if ( s1 < LogMin ) s1 = LogMin; else if ( s1 > LogMax ) s1 = LogMax; if ( s2 < LogMin ) s2 = LogMin; else if ( s2 > LogMax ) s2 = LogMax; } d_s1 = s1; d_s2 = s2; if ( d_transformation->type() != QwtScaleTransformation::Other ) newFactor(); } /*! \brief Specify the borders of the paint device interval \param p1 first border \param p2 second border */ void QwtScaleMap::setPaintInterval( double p1, double p2 ) { d_p1 = p1; d_p2 = p2; if ( d_transformation->type() != QwtScaleTransformation::Other ) newFactor(); } /*! \brief Re-calculate the conversion factor. */ void QwtScaleMap::newFactor() { d_cnv = 0.0; switch ( d_transformation->type() ) { case QwtScaleTransformation::Linear: if ( d_s2 != d_s1 ) d_cnv = ( d_p2 - d_p1 ) / ( d_s2 - d_s1 ); break; case QwtScaleTransformation::Log10: if ( d_s1 != 0 ) d_cnv = ( d_p2 - d_p1 ) / log( d_s2 / d_s1 ); break; default:; } } /*! Transform a rectangle \param xMap X map \param yMap Y map \param rect Rectangle in scale coordinates \return Rectangle in paint coordinates \sa invTransform() */ QRectF QwtScaleMap::transform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { double x1 = xMap.transform( rect.left() ); double x2 = xMap.transform( rect.right() ); double y1 = yMap.transform( rect.top() ); double y2 = yMap.transform( rect.bottom() ); if ( x2 < x1 ) qSwap( x1, x2 ); if ( y2 < y1 ) qSwap( y1, y2 ); if ( qwtFuzzyCompare( x1, 0.0, x2 - x1 ) == 0 ) x1 = 0.0; if ( qwtFuzzyCompare( x2, 0.0, x2 - x1 ) == 0 ) x2 = 0.0; if ( qwtFuzzyCompare( y1, 0.0, y2 - y1 ) == 0 ) y1 = 0.0; if ( qwtFuzzyCompare( y2, 0.0, y2 - y1 ) == 0 ) y2 = 0.0; return QRectF( x1, y1, x2 - x1 + 1, y2 - y1 + 1 ); } /*! Transform a rectangle from paint to scale coordinates \param xMap X map \param yMap Y map \param rect Rectangle in paint coordinates \return Rectangle in scale coordinates \sa transform() */ QRectF QwtScaleMap::invTransform( const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &rect ) { const double x1 = xMap.invTransform( rect.left() ); const double x2 = xMap.invTransform( rect.right() - 1 ); const double y1 = yMap.invTransform( rect.top() ); const double y2 = yMap.invTransform( rect.bottom() - 1 ); const QRectF r( x1, y1, x2 - x1, y2 - y1 ); return r.normalized(); } #ifndef QT_NO_DEBUG_STREAM QDebug operator<<( QDebug debug, const QwtScaleMap &map ) { debug.nospace() << "QwtScaleMap(" << static_cast( map.transformation()->type() ) << ", s:" << map.s1() << "->" << map.s2() << ", p:" << map.p1() << "->" << map.p2() << ")"; return debug.space(); } #endif starpu-1.1.5/starpu-top/qwt/qwt_abstract_scale.cpp0000644000373600000000000001611112571536557017270 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_abstract_scale.h" #include "qwt_scale_engine.h" #include "qwt_scale_draw.h" #include "qwt_scale_div.h" #include "qwt_scale_map.h" #include "qwt_interval.h" class QwtAbstractScale::PrivateData { public: PrivateData(): maxMajor( 5 ), maxMinor( 3 ), stepSize( 0.0 ), autoScale( true ) { scaleEngine = new QwtLinearScaleEngine; scaleDraw = new QwtScaleDraw(); } ~PrivateData() { delete scaleEngine; delete scaleDraw; } QwtScaleEngine *scaleEngine; QwtAbstractScaleDraw *scaleDraw; int maxMajor; int maxMinor; double stepSize; bool autoScale; }; /*! Constructor Creates a default QwtScaleDraw and a QwtLinearScaleEngine. Autoscaling is enabled, and the stepSize is initialized by 0.0. */ QwtAbstractScale::QwtAbstractScale() { d_data = new PrivateData; rescale( 0.0, 100.0 ); } //! Destructor QwtAbstractScale::~QwtAbstractScale() { delete d_data; } /*! \brief Specify a scale. Disable autoscaling and define a scale by an interval and a step size \param vmin lower limit of the scale interval \param vmax upper limit of the scale interval \param stepSize major step size \sa setAutoScale() */ void QwtAbstractScale::setScale( double vmin, double vmax, double stepSize ) { d_data->autoScale = false; d_data->stepSize = stepSize; rescale( vmin, vmax, stepSize ); } /*! \brief Specify a scale. Disable autoscaling and define a scale by an interval and a step size \param interval Interval \param stepSize major step size \sa setAutoScale() */ void QwtAbstractScale::setScale( const QwtInterval &interval, double stepSize ) { setScale( interval.minValue(), interval.maxValue(), stepSize ); } /*! \brief Specify a scale. Disable autoscaling and define a scale by a scale division \param scaleDiv Scale division \sa setAutoScale() */ void QwtAbstractScale::setScale( const QwtScaleDiv &scaleDiv ) { d_data->autoScale = false; if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } /*! Recalculate the scale division and update the scale draw. \param vmin Lower limit of the scale interval \param vmax Upper limit of the scale interval \param stepSize Major step size \sa scaleChange() */ void QwtAbstractScale::rescale( double vmin, double vmax, double stepSize ) { const QwtScaleDiv scaleDiv = d_data->scaleEngine->divideScale( vmin, vmax, d_data->maxMajor, d_data->maxMinor, stepSize ); if ( scaleDiv != d_data->scaleDraw->scaleDiv() ) { d_data->scaleDraw->setTransformation( d_data->scaleEngine->transformation() ); d_data->scaleDraw->setScaleDiv( scaleDiv ); scaleChange(); } } /*! \brief Advise the widget to control the scale range internally. Autoscaling is on by default. \sa setScale(), autoScale() */ void QwtAbstractScale::setAutoScale() { if ( !d_data->autoScale ) { d_data->autoScale = true; scaleChange(); } } /*! \return \c true if autoscaling is enabled */ bool QwtAbstractScale::autoScale() const { return d_data->autoScale; } /*! \brief Set the maximum number of major tick intervals. The scale's major ticks are calculated automatically such that the number of major intervals does not exceed ticks. The default value is 5. \param ticks maximal number of major ticks. \sa QwtAbstractScaleDraw */ void QwtAbstractScale::setScaleMaxMajor( int ticks ) { if ( ticks != d_data->maxMajor ) { d_data->maxMajor = ticks; updateScaleDraw(); } } /*! \brief Set the maximum number of minor tick intervals The scale's minor ticks are calculated automatically such that the number of minor intervals does not exceed ticks. The default value is 3. \param ticks \sa QwtAbstractScaleDraw */ void QwtAbstractScale::setScaleMaxMinor( int ticks ) { if ( ticks != d_data->maxMinor ) { d_data->maxMinor = ticks; updateScaleDraw(); } } /*! \return Max. number of minor tick intervals The default value is 3. */ int QwtAbstractScale::scaleMaxMinor() const { return d_data->maxMinor; } /*! \return Max. number of major tick intervals The default value is 5. */ int QwtAbstractScale::scaleMaxMajor() const { return d_data->maxMajor; } /*! \brief Set a scale draw scaleDraw has to be created with new and will be deleted in ~QwtAbstractScale or the next call of setAbstractScaleDraw. */ void QwtAbstractScale::setAbstractScaleDraw( QwtAbstractScaleDraw *scaleDraw ) { if ( scaleDraw == NULL || scaleDraw == d_data->scaleDraw ) return; if ( d_data->scaleDraw != NULL ) scaleDraw->setScaleDiv( d_data->scaleDraw->scaleDiv() ); delete d_data->scaleDraw; d_data->scaleDraw = scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() { return d_data->scaleDraw; } /*! \return Scale draw \sa setAbstractScaleDraw() */ const QwtAbstractScaleDraw *QwtAbstractScale::abstractScaleDraw() const { return d_data->scaleDraw; } void QwtAbstractScale::updateScaleDraw() { rescale( d_data->scaleDraw->scaleDiv().lowerBound(), d_data->scaleDraw->scaleDiv().upperBound(), d_data->stepSize ); } /*! \brief Set a scale engine The scale engine is responsible for calculating the scale division, and in case of auto scaling how to align the scale. scaleEngine has to be created with new and will be deleted in ~QwtAbstractScale or the next call of setScaleEngine. */ void QwtAbstractScale::setScaleEngine( QwtScaleEngine *scaleEngine ) { if ( scaleEngine != NULL && scaleEngine != d_data->scaleEngine ) { delete d_data->scaleEngine; d_data->scaleEngine = scaleEngine; } } /*! \return Scale engine \sa setScaleEngine() */ const QwtScaleEngine *QwtAbstractScale::scaleEngine() const { return d_data->scaleEngine; } /*! \return Scale engine \sa setScaleEngine() */ QwtScaleEngine *QwtAbstractScale::scaleEngine() { return d_data->scaleEngine; } /*! \brief Notify changed scale Dummy empty implementation, intended to be overloaded by derived classes */ void QwtAbstractScale::scaleChange() { } /*! \return abstractScaleDraw()->scaleMap() */ const QwtScaleMap &QwtAbstractScale::scaleMap() const { return d_data->scaleDraw->scaleMap(); } starpu-1.1.5/starpu-top/qwt/qwt_plot.h0000644000373600000000000001760212571536557014747 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_H #define QWT_PLOT_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_plot_dict.h" #include "qwt_scale_map.h" #include class QwtPlotLayout; class QwtLegend; class QwtScaleWidget; class QwtScaleEngine; class QwtScaleDiv; class QwtScaleDraw; class QwtTextLabel; class QwtPlotCanvas; /*! \brief A 2-D plotting widget QwtPlot is a widget for plotting two-dimensional graphs. An unlimited number of plot items can be displayed on its canvas. Plot items might be curves (QwtPlotCurve), markers (QwtPlotMarker), the grid (QwtPlotGrid), or anything else derived from QwtPlotItem. A plot can have up to four axes, with each plot item attached to an x- and a y axis. The scales at the axes can be explicitely set (QwtScaleDiv), or are calculated from the plot items, using algorithms (QwtScaleEngine) which can be configured separately for each axis. \image html plot.png \par Example The following example shows (schematically) the most simple way to use QwtPlot. By default, only the left and bottom axes are visible and their scales are computed automatically. \verbatim #include #include QwtPlot *myPlot = new QwtPlot("Two Curves", parent); // add curves QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1"); QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2"); // copy the data into the curves curve1->setData(...); curve2->setData(...); curve1->attach(myPlot); curve2->attach(myPlot); // finally, refresh the plot myPlot->replot(); \endverbatim */ class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict { Q_OBJECT Q_PROPERTY( QString propertiesDocument READ grabProperties WRITE applyProperties ) public: /*! Axis index - yLeft\n - yRight\n - xBottom\n - xTop\n */ enum Axis { yLeft, yRight, xBottom, xTop, axisCnt }; /*! Position of the legend, relative to the canvas. - LeftLegend\n The legend will be left from the yLeft axis. - RightLegend\n The legend will be right from the yLeft axis. - BottomLegend\n The legend will be right below the xBottom axis. - TopLegend\n The legend will be between xTop axis and the title. - ExternalLegend\n External means that only the content of the legend will be handled by QwtPlot, but not its geometry. This might be interesting if an application wants to have a legend in an external window ( or on the canvas ). \note In case of ExternalLegend, the legend is not handled by QwtPlotRenderer \sa insertLegend() */ enum LegendPosition { LeftLegend, RightLegend, BottomLegend, TopLegend, ExternalLegend }; explicit QwtPlot( QWidget * = NULL ); explicit QwtPlot( const QwtText &title, QWidget *p = NULL ); virtual ~QwtPlot(); void applyProperties( const QString & ); QString grabProperties() const; void setAutoReplot( bool tf = true ); bool autoReplot() const; // Layout QwtPlotLayout *plotLayout(); const QwtPlotLayout *plotLayout() const; void setMargin( int margin ); int margin() const; // Title void setTitle( const QString & ); void setTitle( const QwtText &t ); QwtText title() const; QwtTextLabel *titleLabel(); const QwtTextLabel *titleLabel() const; // Canvas QwtPlotCanvas *canvas(); const QwtPlotCanvas *canvas() const; void setCanvasBackground ( const QColor &c ); const QColor& canvasBackground() const; void setCanvasLineWidth( int w ); int canvasLineWidth() const; virtual QwtScaleMap canvasMap( int axisId ) const; double invTransform( int axisId, int pos ) const; double transform( int axisId, double value ) const; // Axes QwtScaleEngine *axisScaleEngine( int axisId ); const QwtScaleEngine *axisScaleEngine( int axisId ) const; void setAxisScaleEngine( int axisId, QwtScaleEngine * ); void setAxisAutoScale( int axisId ); bool axisAutoScale( int axisId ) const; void enableAxis( int axisId, bool tf = true ); bool axisEnabled( int axisId ) const; void setAxisFont( int axisId, const QFont &f ); QFont axisFont( int axisId ) const; void setAxisScale( int axisId, double min, double max, double step = 0 ); void setAxisScaleDiv( int axisId, const QwtScaleDiv & ); void setAxisScaleDraw( int axisId, QwtScaleDraw * ); double axisStepSize( int axisId ) const; const QwtScaleDiv *axisScaleDiv( int axisId ) const; QwtScaleDiv *axisScaleDiv( int axisId ); const QwtScaleDraw *axisScaleDraw( int axisId ) const; QwtScaleDraw *axisScaleDraw( int axisId ); const QwtScaleWidget *axisWidget( int axisId ) const; QwtScaleWidget *axisWidget( int axisId ); void setAxisLabelAlignment( int axisId, Qt::Alignment ); void setAxisLabelRotation( int axisId, double rotation ); void setAxisTitle( int axisId, const QString & ); void setAxisTitle( int axisId, const QwtText & ); QwtText axisTitle( int axisId ) const; void setAxisMaxMinor( int axisId, int maxMinor ); int axisMaxMinor( int axisId ) const; void setAxisMaxMajor( int axisId, int maxMajor ); int axisMaxMajor( int axisId ) const; // Legend void insertLegend( QwtLegend *, LegendPosition = QwtPlot::RightLegend, double ratio = -1.0 ); QwtLegend *legend(); const QwtLegend *legend() const; // Misc virtual void polish(); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; virtual void updateLayout(); virtual void drawCanvas( QPainter * ); void updateAxes(); virtual bool event( QEvent * ); virtual void drawItems( QPainter *, const QRectF &, const QwtScaleMap maps[axisCnt] ) const; Q_SIGNALS: /*! A signal which is emitted when the user has clicked on a legend item, which is in QwtLegend::ClickableItem mode. \param plotItem Corresponding plot item of the selected legend item \note clicks are disabled as default \sa QwtLegend::setItemMode(), QwtLegend::itemMode() */ void legendClicked( QwtPlotItem *plotItem ); /*! A signal which is emitted when the user has clicked on a legend item, which is in QwtLegend::CheckableItem mode \param plotItem Corresponding plot item of the selected legend item \param on True when the legen item is checked \note clicks are disabled as default \sa QwtLegend::setItemMode(), QwtLegend::itemMode() */ void legendChecked( QwtPlotItem *plotItem, bool on ); public Q_SLOTS: virtual void replot(); void autoRefresh(); protected Q_SLOTS: virtual void legendItemClicked(); virtual void legendItemChecked( bool ); protected: static bool axisValid( int axisId ); virtual void updateTabOrder(); virtual void resizeEvent( QResizeEvent *e ); private: void initAxesData(); void deleteAxesData(); void updateScaleDiv(); void initPlot( const QwtText &title ); class AxisData; AxisData *d_axisData[axisCnt]; class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_double_range.cpp0000644000373600000000000002262112571536557016747 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_double_range.h" #include "qwt_math.h" #if QT_VERSION < 0x040601 #define qFabs(x) ::fabs(x) #endif static double MinRelStep = 1.0e-10; static double DefaultRelStep = 1.0e-2; static double MinEps = 1.0e-10; /*! The range is initialized to [0.0, 100.0], the step size to 1.0, and the value to 0.0. */ QwtDoubleRange::QwtDoubleRange(): d_minValue( 0.0 ), d_maxValue( 0.0 ), d_step( 1.0 ), d_pageSize( 1 ), d_isValid( false ), d_value( 0.0 ), d_exactValue( 0.0 ), d_exactPrevValue( 0.0 ), d_prevValue( 0.0 ), d_periodic( false ) { } //! Destroys the QwtDoubleRange QwtDoubleRange::~QwtDoubleRange() { } //! Set the value to be valid/invalid void QwtDoubleRange::setValid( bool isValid ) { if ( isValid != d_isValid ) { d_isValid = isValid; valueChange(); } } //! Indicates if the value is valid bool QwtDoubleRange::isValid() const { return d_isValid; } /*! \brief No docs Description \param x ??? \param align \todo Documentation */ void QwtDoubleRange::setNewValue( double x, bool align ) { double vmin, vmax; d_prevValue = d_value; vmin = qMin( d_minValue, d_maxValue ); vmax = qMax( d_minValue, d_maxValue ); // // Range check // if ( x < vmin ) { if ( ( d_periodic ) && ( vmin != vmax ) ) d_value = x + qCeil( ( vmin - x ) / ( vmax - vmin ) ) * ( vmax - vmin ); else d_value = vmin; } else if ( x > vmax ) { if ( ( d_periodic ) && ( vmin != vmax ) ) d_value = x - qCeil( ( x - vmax ) / ( vmax - vmin ) ) * ( vmax - vmin ); else d_value = vmax; } else d_value = x; d_exactPrevValue = d_exactValue; d_exactValue = d_value; // align to grid if ( align ) { if ( d_step != 0.0 ) { d_value = d_minValue + qRound( ( d_value - d_minValue ) / d_step ) * d_step; } else d_value = d_minValue; // correct rounding error at the border if ( qFabs( d_value - d_maxValue ) < MinEps * qAbs( d_step ) ) d_value = d_maxValue; // correct rounding error if value = 0 if ( qFabs( d_value ) < MinEps * qAbs( d_step ) ) d_value = 0.0; } if ( !d_isValid || d_prevValue != d_value ) { d_isValid = true; valueChange(); } } /*! \brief Adjust the value to the closest point in the step raster. \param x value \warning The value is clipped when it lies outside the range. When the range is QwtDoubleRange::periodic, it will be mapped to a point in the interval such that \verbatim new value := x + n * (max. value - min. value)\endverbatim with an integer number n. */ void QwtDoubleRange::fitValue( double x ) { setNewValue( x, true ); } /*! \brief Set a new value without adjusting to the step raster \param x new value \warning The value is clipped when it lies outside the range. When the range is QwtDoubleRange::periodic, it will be mapped to a point in the interval such that \verbatim new value := x + n * (max. value - min. value)\endverbatim with an integer number n. */ void QwtDoubleRange::setValue( double x ) { setNewValue( x, false ); } /*! \brief Specify range and step size \param vmin lower boundary of the interval \param vmax higher boundary of the interval \param vstep step width \param pageSize page size in steps \warning \li A change of the range changes the value if it lies outside the new range. The current value will *not* be adjusted to the new step raster. \li vmax < vmin is allowed. \li If the step size is left out or set to zero, it will be set to 1/100 of the interval length. \li If the step size has an absurd value, it will be corrected to a better one. */ void QwtDoubleRange::setRange( double vmin, double vmax, double vstep, int pageSize ) { bool rchg = ( ( d_maxValue != vmax ) || ( d_minValue != vmin ) ); if ( rchg ) { d_minValue = vmin; d_maxValue = vmax; } // // look if the step width has an acceptable // value or otherwise change it. // setStep( vstep ); // // limit page size // d_pageSize = qwtLim( pageSize, 0, int( qAbs( ( d_maxValue - d_minValue ) / d_step ) ) ); // If the value lies out of the range, it // will be changed. Note that it will not be adjusted to // the new step width. setNewValue( d_value, false ); // call notifier after the step width has been // adjusted. if ( rchg ) rangeChange(); } /*! \brief Change the step raster \param vstep new step width \warning The value will \e not be adjusted to the new step raster. */ void QwtDoubleRange::setStep( double vstep ) { double intv = d_maxValue - d_minValue; double newStep; if ( vstep == 0.0 ) newStep = intv * DefaultRelStep; else { if ( ( intv > 0.0 && vstep < 0.0 ) || ( intv < 0.0 && vstep > 0.0 ) ) newStep = -vstep; else newStep = vstep; if ( qFabs( newStep ) < qFabs( MinRelStep * intv ) ) newStep = MinRelStep * intv; } if ( newStep != d_step ) { d_step = newStep; stepChange(); } } /*! \brief Make the range periodic When the range is periodic, the value will be set to a point inside the interval such that \verbatim point = value + n * width \endverbatim if the user tries to set a new value which is outside the range. If the range is nonperiodic (the default), values outside the range will be clipped. \param tf true for a periodic range */ void QwtDoubleRange::setPeriodic( bool tf ) { d_periodic = tf; } /*! \brief Increment the value by a specified number of steps \param nSteps Number of steps to increment \warning As a result of this operation, the new value will always be adjusted to the step raster. */ void QwtDoubleRange::incValue( int nSteps ) { if ( isValid() ) setNewValue( d_value + double( nSteps ) * d_step, true ); } /*! \brief Increment the value by a specified number of pages \param nPages Number of pages to increment. A negative number decrements the value. \warning The Page size is specified in the constructor. */ void QwtDoubleRange::incPages( int nPages ) { if ( isValid() ) setNewValue( d_value + double( nPages ) * double( d_pageSize ) * d_step, true ); } /*! \brief Notify a change of value This virtual function is called whenever the value changes. The default implementation does nothing. */ void QwtDoubleRange::valueChange() { } /*! \brief Notify a change of the range This virtual function is called whenever the range changes. The default implementation does nothing. */ void QwtDoubleRange::rangeChange() { } /*! \brief Notify a change of the step size This virtual function is called whenever the step size changes. The default implementation does nothing. */ void QwtDoubleRange::stepChange() { } /*! \return the step size \sa setStep(), setRange() */ double QwtDoubleRange::step() const { return qAbs( d_step ); } /*! \brief Returns the value of the second border of the range maxValue returns the value which has been specified as the second parameter in QwtDoubleRange::setRange. \sa setRange() */ double QwtDoubleRange::maxValue() const { return d_maxValue; } /*! \brief Returns the value at the first border of the range minValue returns the value which has been specified as the first parameter in setRange(). \sa setRange() */ double QwtDoubleRange::minValue() const { return d_minValue; } /*! \brief Returns true if the range is periodic \sa setPeriodic() */ bool QwtDoubleRange::periodic() const { return d_periodic; } //! Returns the page size in steps. int QwtDoubleRange::pageSize() const { return d_pageSize; } //! Returns the current value. double QwtDoubleRange::value() const { return d_value; } /*! \brief Returns the exact value The exact value is the value which QwtDoubleRange::value would return if the value were not adjusted to the step raster. It differs from the current value only if QwtDoubleRange::fitValue or QwtDoubleRange::incValue have been used before. This function is intended for internal use in derived classes. */ double QwtDoubleRange::exactValue() const { return d_exactValue; } //! Returns the exact previous value double QwtDoubleRange::exactPrevValue() const { return d_exactPrevValue; } //! Returns the previous value double QwtDoubleRange::prevValue() const { return d_prevValue; } starpu-1.1.5/starpu-top/qwt/qwt_scale_engine.h0000644000373600000000000001426212571536560016376 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_ENGINE_H #define QWT_SCALE_ENGINE_H #include "qwt_global.h" #include "qwt_scale_div.h" #include "qwt_interval.h" class QwtScaleTransformation; /*! \brief Arithmetic including a tolerance */ class QWT_EXPORT QwtScaleArithmetic { public: static double ceilEps( double value, double intervalSize ); static double floorEps( double value, double intervalSize ); static double divideEps( double interval, double steps ); static double ceil125( double x ); static double floor125( double x ); }; /*! \brief Base class for scale engines. A scale engine trys to find "reasonable" ranges and step sizes for scales. The layout of the scale can be varied with setAttribute(). Qwt offers implementations for logarithmic (log10) and linear scales. Contributions for other types of scale engines (date/time, log2 ... ) are welcome. */ class QWT_EXPORT QwtScaleEngine { public: /*! - IncludeReference\n Build a scale which includes the reference() value. - Symmetric\n Build a scale which is symmetric to the reference() value. - Floating\n The endpoints of the scale are supposed to be equal the outmost included values plus the specified margins (see setMargins()). If this attribute is *not* set, the endpoints of the scale will be integer multiples of the step size. - Inverted\n Turn the scale upside down. \sa setAttribute(), testAttribute(), reference(), lowerMargin(), upperMargin() */ enum Attribute { NoAttribute = 0, IncludeReference = 1, Symmetric = 2, Floating = 4, Inverted = 8 }; explicit QwtScaleEngine(); virtual ~QwtScaleEngine(); void setAttribute( Attribute, bool on = true ); bool testAttribute( Attribute ) const; void setAttributes( int ); int attributes() const; void setReference( double reference ); double reference() const; void setMargins( double lower, double upper ); double lowerMargin() const; double upperMargin() const; /*! Align and divide an interval \param maxNumSteps Max. number of steps \param x1 First limit of the interval (In/Out) \param x2 Second limit of the interval (In/Out) \param stepSize Step size (Return value) */ virtual void autoScale( int maxNumSteps, double &x1, double &x2, double &stepSize ) const = 0; /*! \brief Calculate a scale division \param x1 First interval limit \param x2 Second interval limit \param maxMajSteps Maximum for the number of major steps \param maxMinSteps Maximum number of minor steps \param stepSize Step size. If stepSize == 0.0, the scaleEngine calculates one. */ virtual QwtScaleDiv divideScale( double x1, double x2, int maxMajSteps, int maxMinSteps, double stepSize = 0.0 ) const = 0; //! \return a transformation virtual QwtScaleTransformation *transformation() const = 0; protected: bool contains( const QwtInterval &, double val ) const; QList strip( const QList&, const QwtInterval & ) const; double divideInterval( double interval, int numSteps ) const; QwtInterval buildInterval( double v ) const; private: class PrivateData; PrivateData *d_data; }; /*! \brief A scale engine for linear scales The step size will fit into the pattern \f$\left\{ 1,2,5\right\} \cdot 10^{n}\f$, where n is an integer. */ class QWT_EXPORT QwtLinearScaleEngine: public QwtScaleEngine { public: virtual void autoScale( int maxSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0 ) const; virtual QwtScaleTransformation *transformation() const; protected: QwtInterval align( const QwtInterval&, double stepSize ) const; void buildTicks( const QwtInterval &, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const; QList buildMajorTicks( const QwtInterval &interval, double stepSize ) const; void buildMinorTicks( const QList& majorTicks, int maxMinMark, double step, QList &, QList & ) const; }; /*! \brief A scale engine for logarithmic (base 10) scales The step size is measured in *decades* and the major step size will be adjusted to fit the pattern \f$\left\{ 1,2,3,5\right\} \cdot 10^{n}\f$, where n is a natural number including zero. \warning the step size as well as the margins are measured in *decades*. */ class QWT_EXPORT QwtLog10ScaleEngine: public QwtScaleEngine { public: virtual void autoScale( int maxSteps, double &x1, double &x2, double &stepSize ) const; virtual QwtScaleDiv divideScale( double x1, double x2, int numMajorSteps, int numMinorSteps, double stepSize = 0.0 ) const; virtual QwtScaleTransformation *transformation() const; protected: QwtInterval log10( const QwtInterval& ) const; QwtInterval pow10( const QwtInterval& ) const; QwtInterval align( const QwtInterval&, double stepSize ) const; void buildTicks( const QwtInterval &, double stepSize, int maxMinSteps, QList ticks[QwtScaleDiv::NTickTypes] ) const; QList buildMajorTicks( const QwtInterval &interval, double stepSize ) const; QList buildMinorTicks( const QList& majorTicks, int maxMinMark, double step ) const; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_plot_item.h0000644000373600000000000001222212571536557015756 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_PLOT_ITEM_H #define QWT_PLOT_ITEM_H #include "qwt_global.h" #include "qwt_legend_itemmanager.h" #include "qwt_text.h" #include class QString; class QPainter; class QWidget; class QwtPlot; class QwtLegend; class QwtScaleMap; class QwtScaleDiv; /*! \brief Base class for items on the plot canvas A plot item is "something", that can be painted on the plot canvas, or only affects the scales of the plot widget. They can be categorized as: - Representator\n A "Representator" is an item that represents some sort of data on the plot canvas. The different representator classes are organized according to the characteristics of the data: - QwtPlotMarker Represents a point or a horizontal/vertical coordinate - QwtPlotCurve Represents a series of points - QwtPlotSpectrogram ( QwtPlotRasterItem ) Represents raster data - ... - Decorators\n A "Decorator" is an item, that displays additional information, that is not related to any data: - QwtPlotGrid - QwtPlotScaleItem - QwtPlotSvgItem - ... Depending on the QwtPlotItem::ItemAttribute flags, an item is included into autoscaling or has an entry on the legnd. Before misusing the existing item classes it might be better to implement a new type of plot item ( don't implement a watermark as spectrogram ). Deriving a new type of QwtPlotItem primarily means to implement the YourPlotItem::draw() method. \sa The cpuplot example shows the implementation of additional plot items. */ class QWT_EXPORT QwtPlotItem: public QwtLegendItemManager { public: /*! \brief Runtime type information RttiValues is used to cast plot items, without having to enable runtime type information of the compiler. */ enum RttiValues { Rtti_PlotItem = 0, Rtti_PlotGrid, Rtti_PlotScale, Rtti_PlotMarker, Rtti_PlotCurve, Rtti_PlotSpectroCurve, Rtti_PlotIntervalCurve, Rtti_PlotHistogram, Rtti_PlotSpectrogram, Rtti_PlotSVG, Rtti_PlotUserItem = 1000 }; /*! Plot Item Attributes - Legend\n The item is represented on the legend. - AutoScale \n The boundingRect() of the item is included in the autoscaling calculation. \sa setItemAttribute(), testItemAttribute() */ enum ItemAttribute { Legend = 1, AutoScale = 2 }; //! Render hints enum RenderHint { RenderAntialiased = 1 }; explicit QwtPlotItem( const QwtText &title = QwtText() ); virtual ~QwtPlotItem(); void attach( QwtPlot *plot ); /*! \brief This method detaches a QwtPlotItem from any QwtPlot it has been associated with. detach() is equivalent to calling attach( NULL ) \sa attach( QwtPlot* plot ) */ void detach() { attach( NULL ); } QwtPlot *plot() const; void setTitle( const QString &title ); void setTitle( const QwtText &title ); const QwtText &title() const; virtual int rtti() const; void setItemAttribute( ItemAttribute, bool on = true ); bool testItemAttribute( ItemAttribute ) const; void setRenderHint( RenderHint, bool on = true ); bool testRenderHint( RenderHint ) const; double z() const; void setZ( double z ); void show(); void hide(); virtual void setVisible( bool ); bool isVisible () const; void setAxes( int xAxis, int yAxis ); void setXAxis( int axis ); int xAxis() const; void setYAxis( int axis ); int yAxis() const; virtual void itemChanged(); /*! \brief Draw the item \param painter Painter \param xMap Maps x-values into pixel coordinates. \param yMap Maps y-values into pixel coordinates. \param canvasRect Contents rect of the canvas in painter coordinates */ virtual void draw( QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect ) const = 0; virtual QRectF boundingRect() const; virtual void updateLegend( QwtLegend * ) const; virtual void updateScaleDiv( const QwtScaleDiv&, const QwtScaleDiv& ); virtual QWidget *legendItem() const; QRectF scaleRect( const QwtScaleMap &, const QwtScaleMap & ) const; QRectF paintRect( const QwtScaleMap &, const QwtScaleMap & ) const; private: // Disabled copy constructor and operator= QwtPlotItem( const QwtPlotItem & ); QwtPlotItem &operator=( const QwtPlotItem & ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_math.cpp0000644000373600000000000000211312571536557015244 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_math.h" /*! \brief Find the smallest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMin( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMin( rv, array[i] ); return rv; } /*! \brief Find the largest value in an array \param array Pointer to an array \param size Array size */ double qwtGetMax( const double *array, int size ) { if ( size <= 0 ) return 0.0; double rv = array[0]; for ( int i = 1; i < size; i++ ) rv = qMax( rv, array[i] ); return rv; } starpu-1.1.5/starpu-top/qwt/qwt_double_range.h0000644000373600000000000000450512571536560016407 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_DOUBLE_RANGE_H #define QWT_DOUBLE_RANGE_H #include "qwt_global.h" /*! \brief A class which controls a value within an interval This class is useful as a base class or a member for sliders. It represents an interval of type double within which a value can be moved. The value can be either an arbitrary point inside the interval (see QwtDoubleRange::setValue), or it can be fitted into a step raster (see QwtDoubleRange::fitValue and QwtDoubleRange::incValue). As a special case, a QwtDoubleRange can be periodic, which means that a value outside the interval will be mapped to a value inside the interval when QwtDoubleRange::setValue(), QwtDoubleRange::fitValue(), QwtDoubleRange::incValue() or QwtDoubleRange::incPages() are called. */ class QWT_EXPORT QwtDoubleRange { public: QwtDoubleRange(); virtual ~QwtDoubleRange(); void setRange( double vmin, double vmax, double vstep = 0.0, int pagesize = 1 ); void setValid( bool ); bool isValid() const; virtual void setValue( double ); double value() const; void setPeriodic( bool tf ); bool periodic() const; void setStep( double ); double step() const; double maxValue() const; double minValue() const; int pageSize() const; virtual void incValue( int ); virtual void incPages( int ); virtual void fitValue( double ); protected: double exactValue() const; double exactPrevValue() const; double prevValue() const; virtual void valueChange(); virtual void stepChange(); virtual void rangeChange(); private: void setNewValue( double x, bool align = false ); double d_minValue; double d_maxValue; double d_step; int d_pageSize; bool d_isValid; double d_value; double d_exactValue; double d_exactPrevValue; double d_prevValue; bool d_periodic; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_scale_widget.h0000644000373600000000000000671112571536560016414 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #ifndef QWT_SCALE_WIDGET_H #define QWT_SCALE_WIDGET_H #include "qwt_global.h" #include "qwt_text.h" #include "qwt_scale_draw.h" #include #include #include #include class QPainter; class QwtScaleTransformation; class QwtScaleDiv; class QwtColorMap; /*! \brief A Widget which contains a scale This Widget can be used to decorate composite widgets with a scale. */ class QWT_EXPORT QwtScaleWidget : public QWidget { Q_OBJECT public: /*! Layout flags of the title - TitleInverted\n The title of vertical scales is painted from top to bottom. Otherwise it is painted from bottom to top. */ enum LayoutFlag { TitleInverted = 1 }; explicit QwtScaleWidget( QWidget *parent = NULL ); explicit QwtScaleWidget( QwtScaleDraw::Alignment, QWidget *parent = NULL ); virtual ~QwtScaleWidget(); Q_SIGNALS: //! Signal emitted, whenever the scale divison changes void scaleDivChanged(); public: void setTitle( const QString &title ); void setTitle( const QwtText &title ); QwtText title() const; void setLayoutFlag( LayoutFlag, bool on ); bool testLayoutFlag( LayoutFlag ) const; void setBorderDist( int start, int end ); int startBorderDist() const; int endBorderDist() const; void getBorderDistHint( int &start, int &end ) const; void getMinBorderDist( int &start, int &end ) const; void setMinBorderDist( int start, int end ); void setMargin( int ); int margin() const; void setSpacing( int td ); int spacing() const; void setScaleDiv( QwtScaleTransformation *, const QwtScaleDiv &sd ); void setScaleDraw( QwtScaleDraw * ); const QwtScaleDraw *scaleDraw() const; QwtScaleDraw *scaleDraw(); void setLabelAlignment( Qt::Alignment ); void setLabelRotation( double rotation ); void setColorBarEnabled( bool ); bool isColorBarEnabled() const; void setColorBarWidth( int ); int colorBarWidth() const; void setColorMap( const QwtInterval &, QwtColorMap * ); QwtInterval colorBarInterval() const; const QwtColorMap *colorMap() const; virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; int titleHeightForWidth( int width ) const; int dimForLength( int length, const QFont &scaleFont ) const; void drawColorBar( QPainter *painter, const QRectF & ) const; void drawTitle( QPainter *painter, QwtScaleDraw::Alignment, const QRectF &rect ) const; void setAlignment( QwtScaleDraw::Alignment ); QwtScaleDraw::Alignment alignment() const; QRectF colorBarRect( const QRectF& ) const; protected: virtual void paintEvent( QPaintEvent * ); virtual void resizeEvent( QResizeEvent * ); void draw( QPainter *p ) const; void scaleChange(); void layoutScale( bool update = true ); private: void initScale( QwtScaleDraw::Alignment ); class PrivateData; PrivateData *d_data; }; #endif starpu-1.1.5/starpu-top/qwt/qwt_dyngrid_layout.cpp0000644000373600000000000003371412571536557017363 00000000000000/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** * Qwt Widget Library * Copyright (C) 1997 Josef Wilgen * Copyright (C) 2002 Uwe Rathmann * * This library is free software; you can redistribute it and/or * modify it under the terms of the Qwt License, Version 1.0 *****************************************************************************/ #include "qwt_dyngrid_layout.h" #include "qwt_math.h" #include #include class QwtDynGridLayout::PrivateData { public: PrivateData(): isDirty( true ) { } void updateLayoutCache(); mutable QList itemList; uint maxCols; uint numRows; uint numCols; Qt::Orientations expanding; bool isDirty; QVector itemSizeHints; }; void QwtDynGridLayout::PrivateData::updateLayoutCache() { itemSizeHints.resize( itemList.count() ); int index = 0; for ( QList::iterator it = itemList.begin(); it != itemList.end(); ++it, index++ ) { itemSizeHints[ index ] = ( *it )->sizeHint(); } isDirty = false; } /*! \param parent Parent widget \param margin Margin \param spacing Spacing */ QwtDynGridLayout::QwtDynGridLayout( QWidget *parent, int margin, int spacing ): QLayout( parent ) { init(); setSpacing( spacing ); setMargin( margin ); } /*! \param spacing Spacing */ QwtDynGridLayout::QwtDynGridLayout( int spacing ) { init(); setSpacing( spacing ); } /*! Initialize the layout with default values. */ void QwtDynGridLayout::init() { d_data = new QwtDynGridLayout::PrivateData; d_data->maxCols = d_data->numRows = d_data->numCols = 0; d_data->expanding = 0; } //! Destructor QwtDynGridLayout::~QwtDynGridLayout() { for ( int i = 0; i < d_data->itemList.size(); i++ ) delete d_data->itemList[i]; delete d_data; } //! Invalidate all internal caches void QwtDynGridLayout::invalidate() { d_data->isDirty = true; QLayout::invalidate(); } /*! Limit the number of columns. \param maxCols upper limit, 0 means unlimited \sa maxCols() */ void QwtDynGridLayout::setMaxCols( uint maxCols ) { d_data->maxCols = maxCols; } /*! Return the upper limit for the number of columns. 0 means unlimited, what is the default. \sa setMaxCols() */ uint QwtDynGridLayout::maxCols() const { return d_data->maxCols; } //! Adds item to the next free position. void QwtDynGridLayout::addItem( QLayoutItem *item ) { d_data->itemList.append( item ); invalidate(); } /*! \return true if this layout is empty. */ bool QwtDynGridLayout::isEmpty() const { return d_data->itemList.isEmpty(); } /*! \return number of layout items */ uint QwtDynGridLayout::itemCount() const { return d_data->itemList.count(); } /*! Find the item at a spcific index \param index Index \sa takeAt() */ QLayoutItem *QwtDynGridLayout::itemAt( int index ) const { if ( index < 0 || index >= d_data->itemList.count() ) return NULL; return d_data->itemList.at( index ); } /*! Find the item at a spcific index and remove it from the layout \param index Index \sa itemAt() */ QLayoutItem *QwtDynGridLayout::takeAt( int index ) { if ( index < 0 || index >= d_data->itemList.count() ) return NULL; d_data->isDirty = true; return d_data->itemList.takeAt( index ); } //! \return Number of items in the layout int QwtDynGridLayout::count() const { return d_data->itemList.count(); } /*! Set whether this layout can make use of more space than sizeHint(). A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only one dimension, while Qt::Vertical | Qt::Horizontal means that it wants to grow in both dimensions. The default value is 0. \param expanding Or'd orientations \sa expandingDirections() */ void QwtDynGridLayout::setExpandingDirections( Qt::Orientations expanding ) { d_data->expanding = expanding; } /*! Returns whether this layout can make use of more space than sizeHint(). A value of Qt::Vertical or Qt::Horizontal means that it wants to grow in only one dimension, while Qt::Vertical | Qt::Horizontal means that it wants to grow in both dimensions. \sa setExpandingDirections() */ Qt::Orientations QwtDynGridLayout::expandingDirections() const { return d_data->expanding; } /*! Reorganizes columns and rows and resizes managed widgets within the rectangle rect. \param rect Layout geometry */ void QwtDynGridLayout::setGeometry( const QRect &rect ) { QLayout::setGeometry( rect ); if ( isEmpty() ) return; d_data->numCols = columnsForWidth( rect.width() ); d_data->numRows = itemCount() / d_data->numCols; if ( itemCount() % d_data->numCols ) d_data->numRows++; QList itemGeometries = layoutItems( rect, d_data->numCols ); int index = 0; for ( QList::iterator it = d_data->itemList.begin(); it != d_data->itemList.end(); ++it ) { QWidget *w = ( *it )->widget(); if ( w ) { w->setGeometry( itemGeometries[index] ); index++; } } } /*! Calculate the number of columns for a given width. It tries to use as many columns as possible (limited by maxCols()) \param width Available width for all columns \sa maxCols(), setMaxCols() */ uint QwtDynGridLayout::columnsForWidth( int width ) const { if ( isEmpty() ) return 0; const int maxCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount(); if ( maxRowWidth( maxCols ) <= width ) return maxCols; for ( int numCols = 2; numCols <= maxCols; numCols++ ) { const int rowWidth = maxRowWidth( numCols ); if ( rowWidth > width ) return numCols - 1; } return 1; // At least 1 column } /*! Calculate the width of a layout for a given number of columns. \param numCols Given number of columns \param itemWidth Array of the width hints for all items */ int QwtDynGridLayout::maxRowWidth( int numCols ) const { int col; QVector colWidth( numCols ); for ( col = 0; col < ( int )numCols; col++ ) colWidth[col] = 0; if ( d_data->isDirty ) d_data->updateLayoutCache(); for ( uint index = 0; index < ( uint )d_data->itemSizeHints.count(); index++ ) { col = index % numCols; colWidth[col] = qMax( colWidth[col], d_data->itemSizeHints[int( index )].width() ); } int rowWidth = 2 * margin() + ( numCols - 1 ) * spacing(); for ( col = 0; col < ( int )numCols; col++ ) rowWidth += colWidth[col]; return rowWidth; } /*! \return the maximum width of all layout items */ int QwtDynGridLayout::maxItemWidth() const { if ( isEmpty() ) return 0; if ( d_data->isDirty ) d_data->updateLayoutCache(); int w = 0; for ( uint i = 0; i < ( uint )d_data->itemSizeHints.count(); i++ ) { const int itemW = d_data->itemSizeHints[int( i )].width(); if ( itemW > w ) w = itemW; } return w; } /*! Calculate the geometries of the layout items for a layout with numCols columns and a given rect. \param rect Rect where to place the items \param numCols Number of columns \return item geometries */ QList QwtDynGridLayout::layoutItems( const QRect &rect, uint numCols ) const { QList itemGeometries; if ( numCols == 0 || isEmpty() ) return itemGeometries; uint numRows = itemCount() / numCols; if ( numRows % itemCount() ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numCols ); layoutGrid( numCols, rowHeight, colWidth ); bool expandH, expandV; expandH = expandingDirections() & Qt::Horizontal; expandV = expandingDirections() & Qt::Vertical; if ( expandH || expandV ) stretchGrid( rect, numCols, rowHeight, colWidth ); const int maxCols = d_data->maxCols; d_data->maxCols = numCols; const QRect alignedRect = alignmentRect( rect ); d_data->maxCols = maxCols; const int xOffset = expandH ? 0 : alignedRect.x(); const int yOffset = expandV ? 0 : alignedRect.y(); QVector colX( numCols ); QVector rowY( numRows ); const int xySpace = spacing(); rowY[0] = yOffset + margin(); for ( int r = 1; r < ( int )numRows; r++ ) rowY[r] = rowY[r-1] + rowHeight[r-1] + xySpace; colX[0] = xOffset + margin(); for ( int c = 1; c < ( int )numCols; c++ ) colX[c] = colX[c-1] + colWidth[c-1] + xySpace; const int itemCount = d_data->itemList.size(); for ( int i = 0; i < itemCount; i++ ) { const int row = i / numCols; const int col = i % numCols; QRect itemGeometry( colX[col], rowY[row], colWidth[col], rowHeight[row] ); itemGeometries.append( itemGeometry ); } return itemGeometries; } /*! Calculate the dimensions for the columns and rows for a grid of numCols columns. \param numCols Number of columns. \param rowHeight Array where to fill in the calculated row heights. \param colWidth Array where to fill in the calculated column widths. */ void QwtDynGridLayout::layoutGrid( uint numCols, QVector& rowHeight, QVector& colWidth ) const { if ( numCols <= 0 ) return; if ( d_data->isDirty ) d_data->updateLayoutCache(); for ( uint index = 0; index < ( uint )d_data->itemSizeHints.count(); index++ ) { const int row = index / numCols; const int col = index % numCols; const QSize &size = d_data->itemSizeHints[int( index )]; rowHeight[row] = ( col == 0 ) ? size.height() : qMax( rowHeight[row], size.height() ); colWidth[col] = ( row == 0 ) ? size.width() : qMax( colWidth[col], size.width() ); } } /*! \return true: QwtDynGridLayout implements heightForWidth. \sa heightForWidth() */ bool QwtDynGridLayout::hasHeightForWidth() const { return true; } /*! \return The preferred height for this layout, given the width w. \sa hasHeightForWidth() */ int QwtDynGridLayout::heightForWidth( int width ) const { if ( isEmpty() ) return 0; const uint numCols = columnsForWidth( width ); uint numRows = itemCount() / numCols; if ( itemCount() % numCols ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numCols ); layoutGrid( numCols, rowHeight, colWidth ); int h = 2 * margin() + ( numRows - 1 ) * spacing(); for ( int row = 0; row < ( int )numRows; row++ ) h += rowHeight[row]; return h; } /*! Stretch columns in case of expanding() & QSizePolicy::Horizontal and rows in case of expanding() & QSizePolicy::Vertical to fill the entire rect. Rows and columns are stretched with the same factor. \sa setExpanding(), expanding() */ void QwtDynGridLayout::stretchGrid( const QRect &rect, uint numCols, QVector& rowHeight, QVector& colWidth ) const { if ( numCols == 0 || isEmpty() ) return; bool expandH, expandV; expandH = expandingDirections() & Qt::Horizontal; expandV = expandingDirections() & Qt::Vertical; if ( expandH ) { int xDelta = rect.width() - 2 * margin() - ( numCols - 1 ) * spacing(); for ( int col = 0; col < ( int )numCols; col++ ) xDelta -= colWidth[col]; if ( xDelta > 0 ) { for ( int col = 0; col < ( int )numCols; col++ ) { const int space = xDelta / ( numCols - col ); colWidth[col] += space; xDelta -= space; } } } if ( expandV ) { uint numRows = itemCount() / numCols; if ( itemCount() % numCols ) numRows++; int yDelta = rect.height() - 2 * margin() - ( numRows - 1 ) * spacing(); for ( int row = 0; row < ( int )numRows; row++ ) yDelta -= rowHeight[row]; if ( yDelta > 0 ) { for ( int row = 0; row < ( int )numRows; row++ ) { const int space = yDelta / ( numRows - row ); rowHeight[row] += space; yDelta -= space; } } } } /*! Return the size hint. If maxCols() > 0 it is the size for a grid with maxCols() columns, otherwise it is the size for a grid with only one row. \sa maxCols(), setMaxCols() */ QSize QwtDynGridLayout::sizeHint() const { if ( isEmpty() ) return QSize(); const uint numCols = ( d_data->maxCols > 0 ) ? d_data->maxCols : itemCount(); uint numRows = itemCount() / numCols; if ( itemCount() % numCols ) numRows++; QVector rowHeight( numRows ); QVector colWidth( numCols ); layoutGrid( numCols, rowHeight, colWidth ); int h = 2 * margin() + ( numRows - 1 ) * spacing(); for ( int row = 0; row < ( int )numRows; row++ ) h += rowHeight[row]; int w = 2 * margin() + ( numCols - 1 ) * spacing(); for ( int col = 0; col < ( int )numCols; col++ ) w += colWidth[col]; return QSize( w, h ); } /*! \return Number of rows of the current layout. \sa numCols() \warning The number of rows might change whenever the geometry changes */ uint QwtDynGridLayout::numRows() const { return d_data->numRows; } /*! \return Number of columns of the current layout. \sa numRows() \warning The number of columns might change whenever the geometry changes */ uint QwtDynGridLayout::numCols() const { return d_data->numCols; } starpu-1.1.5/starpu-top/preferencesdialog.ui0000644000373600000000000002157012571536555016127 00000000000000 PreferencesDialog 0 0 387 490 0 0 Preferences :/images/preferences.png:/images/preferences.png true 250 0 0 Connection Server settings Port IP Address 127.0.0.1 true 1024 65535 2011 SSH true false Command Line ssh -L Display Widgets true 0 0 100 51 true 0 0 16777215 16777215 Data widgets false false true 0 0 130 51 Interactive widgets Load a session setup General Display mode Enable antialiasing true starpu-1.1.5/starpu-top/aboutdialog.h0000644000373600000000000000221212571536560014536 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include namespace Ui { class AboutDialog; } class AboutDialog : public QDialog { Q_OBJECT public: explicit AboutDialog(QWidget *parent = 0); ~AboutDialog(); private: Ui::AboutDialog *ui; }; #endif // ABOUTDIALOG_H starpu-1.1.5/starpu-top/debugconsole.h0000644000373600000000000000274312571536557014734 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DEBUGCONSOLE_H #define DEBUGCONSOLE_H #include namespace Ui { class DebugConsole; } class DebugConsole : public QWidget { Q_OBJECT public: explicit DebugConsole(QWidget *parent); ~DebugConsole(); // Display debug message void appendDebugLogMessage(QString debugMessage); void appendDebugLockMessage(QString lockMessage); // Clear console void clearConsole(); private: // GUI components Ui::DebugConsole *ui; private slots: // Perform a debug step (unlock) void step(); signals: // Step performed void stepped(); }; #endif // DEBUGCONSOLE_H starpu-1.1.5/starpu-top/debugconsole.ui0000644000373600000000000000167312571536560015115 00000000000000 DebugConsole 0 0 710 50 500 50 Form true Step starpu-1.1.5/starpu-top/preferencesdialog.h0000644000373600000000000000643212571536557015743 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef PREFERENCESDIALOG_H #define PREFERENCESDIALOG_H class MainWindow; class ConfigurationManager; class SessionSetupManager; #include #include #include #include "starpu_top_types.h" namespace Ui { class PreferencesDialog; } class PreferencesDialog: public QDialog { /* The preferences panel of the application. Each type of preferences is in a different tab. */ Q_OBJECT public: explicit PreferencesDialog(MainWindow *mainWindow, ConfigurationManager *configurationManager, SessionSetupManager *sessionSetupManger, int activeTab = 0); ~PreferencesDialog(); protected: // Events void changeEvent(QEvent *e); void closeEvent(QCloseEvent *ce); private: // GUI components Ui::PreferencesDialog *ui; QList _dataWidgetListComboBoxes; QList _interactiveWidgetListComboBoxes; // Components MainWindow *_mainWindow; ConfigurationManager *_configurationManager; SessionSetupManager *_sessionSetupManager; // Metadata const QHash *_dataWidgetNames; const QHash > *_dataWidgetPossibilities; const QHash *_interactiveWidgetNames; const QHash > *_interactiveWidgetPossibilities; // Util methods int indexOfDataWidget(QComboBox* dataWidgetList, DataWidgetType widget); int indexOfInteractiveWidget(QComboBox* interactiveWidgetList, InteractiveWidgetType widget); private slots: // Other methods void displayWidgetPreferences(); void displaySessionSetupsList(); void updateDisplayModeIndex(int index); void updateDataWidgetType(int index); void updateInteractiveWidgetType(int index); void loadSessionSetup(QString fileName); void loadDefaultDataWidgets(); void loadDefaultInteractiveWidgets(); void sessionDescriptionsSetupLoaded( QList dataDescriptionsSetup, QList paramDescriptionsSetup); void sessionMainWindowSetupLoaded(MainWindowSetup mainWindowSetup); }; // Model structs for the widget choice comboboxes Q_DECLARE_METATYPE( DataWidgetListItemData) Q_DECLARE_METATYPE(InteractiveWidgetListItemData) #endif // PREFERENCESDIALOG_H starpu-1.1.5/starpu-top/configurationmanager.h0000644000373600000000000000343312571536557016462 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CONFIGURATIONMANAGER_H #define CONFIGURATIONMANAGER_H #include static const QString CONFIG_FILE_DIR = "."; static const QString CONFIG_FILE_NAME = "starpu_top.cfg"; class ConfigurationManager { /* Contains and manages all the application settings of the current instance, and remembers them for use in the next instances */ public: ConfigurationManager(); ~ConfigurationManager(); // Getters QString serverHost() const; int serverPort() const; bool ssh() const; QString commandLine() const; bool antialiasing() const; // Setters void setServerHost(QString serverIP); void setServerPort(int serverPort); void setSSH(bool enabled); void setCommandLine(QString commandLine); void setAntialiasing(bool enabled); // Other methods void syncConfiguration(); private: // Data QSettings *_applicationSettings; }; #endif // CONFIGURATIONMANAGER_H starpu-1.1.5/starpu-top/TODO.txt0000644000373600000000000000040512571536560013403 00000000000000FONCTIONS : - cleanup dans le destructeur final (~MainWindow) - mettre en place l'interface DescriptionProvider BUGS : - parfois un QLIST ASSERT (index out of range) lors de la restauration de session (a priori assez difficile reproduire)? TESTS : starpu-1.1.5/starpu-top/StarPU-Top-qwt-embed.pri.in0000644000373600000000000000611312571536557017027 00000000000000SRCDIR=@srcdir@ SOURCES += \ $$SRCDIR/qwt/qwt_thermo.cpp \ $$SRCDIR/qwt/qwt_math.cpp \ $$SRCDIR/qwt/qwt_scale_engine.cpp \ $$SRCDIR/qwt/qwt_scale_draw.cpp \ $$SRCDIR/qwt/qwt_scale_map.cpp \ $$SRCDIR/qwt/qwt_scale_div.cpp \ $$SRCDIR/qwt/qwt_painter.cpp \ $$SRCDIR/qwt/qwt_abstract_scale.cpp \ $$SRCDIR/qwt/qwt_abstract_scale_draw.cpp \ $$SRCDIR/qwt/qwt_interval.cpp \ $$SRCDIR/qwt/qwt_text.cpp \ $$SRCDIR/qwt/qwt_text_engine.cpp \ $$SRCDIR/qwt/qwt_clipper.cpp \ $$SRCDIR/qwt/qwt_color_map.cpp \ $$SRCDIR/qwt/qwt_plot.cpp \ $$SRCDIR/qwt/qwt_plot_dict.cpp \ $$SRCDIR/qwt/qwt_plot_layout.cpp \ $$SRCDIR/qwt/qwt_scale_widget.cpp \ $$SRCDIR/qwt/qwt_text_label.cpp \ $$SRCDIR/qwt/qwt_legend.cpp \ $$SRCDIR/qwt/qwt_dyngrid_layout.cpp \ $$SRCDIR/qwt/qwt_plot_canvas.cpp \ $$SRCDIR/qwt/qwt_plot_item.cpp \ $$SRCDIR/qwt/qwt_legend_item.cpp \ $$SRCDIR/qwt/qwt_symbol.cpp \ $$SRCDIR/qwt/qwt_plot_axis.cpp \ $$SRCDIR/qwt/qwt_plot_xml.cpp \ $$SRCDIR/qwt/qwt_knob.cpp \ $$SRCDIR/qwt/qwt_abstract_slider.cpp \ $$SRCDIR/qwt/qwt_round_scale_draw.cpp \ $$SRCDIR/qwt/qwt_double_range.cpp \ $$SRCDIR/qwt/qwt_wheel.cpp \ $$SRCDIR/qwt/qwt_slider.cpp \ $$SRCDIR/qwt/qwt_plot_curve.cpp \ $$SRCDIR/qwt/qwt_plot_seriesitem.cpp \ $$SRCDIR/qwt/qwt_series_data.cpp \ $$SRCDIR/qwt/qwt_point_polar.cpp \ $$SRCDIR/qwt/qwt_curve_fitter.cpp \ $$SRCDIR/qwt/qwt_spline.cpp \ $$SRCDIR/qwt/qwt_dial.cpp \ $$SRCDIR/qwt/qwt_dial_needle.cpp HEADERS += \ $$SRCDIR/qwt/qwt_thermo.h \ $$SRCDIR/qwt/qwt_math.h \ $$SRCDIR/qwt/qwt_scale_engine.h \ $$SRCDIR/qwt/qwt_scale_draw.h \ $$SRCDIR/qwt/qwt_scale_map.h \ $$SRCDIR/qwt/qwt_scale_div.h \ $$SRCDIR/qwt/qwt_painter.h \ $$SRCDIR/qwt/qwt_global.h \ $$SRCDIR/qwt/qwt_abstract_scale.h \ $$SRCDIR/qwt/qwt_abstract_scale_draw.h \ $$SRCDIR/qwt/qwt_interval.h \ $$SRCDIR/qwt/qwt_text.h \ $$SRCDIR/qwt/qwt_text_engine.h \ $$SRCDIR/qwt/qwt_clipper.h \ $$SRCDIR/qwt/qwt_color_map.h \ $$SRCDIR/qwt/qwt_plot.h \ $$SRCDIR/qwt/qwt_plot_dict.h \ $$SRCDIR/qwt/qwt_plot_layout.h \ $$SRCDIR/qwt/qwt_scale_widget.h \ $$SRCDIR/qwt/qwt_text_label.h \ $$SRCDIR/qwt/qwt_legend.h \ $$SRCDIR/qwt/qwt_dyngrid_layout.h \ $$SRCDIR/qwt/qwt_plot_canvas.h \ $$SRCDIR/qwt/qwt_plot_item.h \ $$SRCDIR/qwt/qwt_legend_itemmanager.h \ $$SRCDIR/qwt/qwt_legend_item.h \ $$SRCDIR/qwt/qwt_symbol.h \ $$SRCDIR/qwt/qwt_knob.h \ $$SRCDIR/qwt/qwt_abstract_slider.h \ $$SRCDIR/qwt/qwt_round_scale_draw.h \ $$SRCDIR/qwt/qwt_double_range.h \ $$SRCDIR/qwt/qwt_wheel.h \ $$SRCDIR/qwt/qwt_slider.h \ $$SRCDIR/qwt/qwt_plot_curve.h \ $$SRCDIR/qwt/qwt_plot_seriesitem.h \ $$SRCDIR/qwt/qwt_series_data.h \ $$SRCDIR/qwt/qwt_point_polar.h \ $$SRCDIR/qwt/qwt_curve_fitter.h \ $$SRCDIR/qwt/qwt_spline.h \ $$SRCDIR/qwt/qwt_dial.h \ $$SRCDIR/qwt/qwt_dial_needle.h INCLUDEPATH += $$SRCDIR/qwt starpu-1.1.5/starpu-top/communicationthread.cpp0000644000373600000000000002565512571536560016654 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy Copyright (C) 2011 Université de Bordeaux This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "communicationthread.h" #include "configurationmanager.h" #include "mainwindow.h" #include "communicationmanager.h" #include "starpu_top_types.h" const int MAX_CONNECTION_ATTEMPTS = 10; CommunicationThread::CommunicationThread( MainWindow *mainWindow, ConfigurationManager *configurationManager) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "CommunicationThread's' constructor", "Singleton pattern violated - " "CommunicationThread instanciated more than once"); _mainWindow = mainWindow; _configurationManager = configurationManager; _communicationManager = 0; _SSHProcess = NULL; instanciated = true; QObject::connect(this, SIGNAL(progress(QString)), _mainWindow, SLOT(updateStatusBarMessage(QString))); QObject::connect(this, SIGNAL(disconnected()), _mainWindow, SLOT(disconnected())); QObject::connect(this, SIGNAL(abort(QString)), _mainWindow, SLOT(connectionAborted(QString))); qDebug() << "CommunicationThread : initializing"; } CommunicationThread::~CommunicationThread() { qDebug() << "CommunicationThread : terminating"; delete _communicationManager; } void CommunicationThread::createNewCommunicationManager(void) { emit progress(tr("Connecting...")); if (_communicationManager == 0) delete(_communicationManager ); _communicationManager = new CommunicationManager(this); // Type registering is necessary for Qt "Queued Connections" // as we are going to send signals to a different thread qRegisterMetaType ( "QAbstractSocket::SocketError"); // Connection events QObject::connect(_communicationManager, SIGNAL(protoConnected()), _mainWindow, SLOT(connectionSucceeded())); QObject::connect(_communicationManager, SIGNAL(protoConnected()), this, SLOT(connectionSucceeded())); QObject::connect(_communicationManager, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(connectionError(QAbstractSocket::SocketError))); QObject::connect(_communicationManager, SIGNAL(disconnected()), this, SLOT(connectionDisconnected())); // Change communication state QObject::connect(_communicationManager, SIGNAL(protocolError(QString)), _mainWindow, SLOT(protocolErrorCaught(QString))); QObject::connect(_communicationManager, SIGNAL(sessionTimeSynchronized(qlonglong)), _mainWindow, SLOT(synchronizeSessionTime(qlonglong))); QObject::connect(_communicationManager, SIGNAL(serverInitCompleted(QString, QList*, QList*, QList*)), _mainWindow, SLOT(initClient( QString, QList*, QList*, QList*))); // Output data QObject::connect(_mainWindow, SIGNAL(clientLaunched()), _communicationManager, SLOT(sendGoMessage())); QObject::connect(_mainWindow, SIGNAL(dataEnabled(int)), _communicationManager, SLOT(sendDataEnableMessage(int))); QObject::connect(_mainWindow, SIGNAL(dataDisabled(int)), _communicationManager, SLOT(sendDataDisableMessage(int))); QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,bool)), _communicationManager, SLOT(sendParamSetMessage(int,bool))); QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,int)), _communicationManager, SLOT(sendParamSetMessage(int,int))); QObject::connect(_mainWindow, SIGNAL(paramValueUpdated(int,double)), _communicationManager, SLOT(sendParamSetMessage(int,double))); QObject::connect(_mainWindow, SIGNAL(debugEnabled(bool)), _communicationManager, SLOT(sendDebugEnabledMessage(bool))); QObject::connect(_mainWindow, SIGNAL(debugStepped()), _communicationManager, SLOT(sendStepMessage())); // Input data QObject::connect(_communicationManager, SIGNAL(notifyDebugEnabled(bool)), _mainWindow, SLOT(setDebug(bool))); QObject::connect(_communicationManager, SIGNAL(notifyDebugMessage(QString)), _mainWindow, SLOT(setDebugMessage(QString))); QObject::connect(_communicationManager, SIGNAL(notifyDebugLock(QString)), _mainWindow, SLOT(setDebugLock(QString))); QObject ::connect(_communicationManager, SIGNAL(notifyParamUpdate(int,bool,qlonglong)), _mainWindow, SLOT(updateInteractiveWidget(int,bool,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyParamUpdate(int,int,qlonglong)), _mainWindow, SLOT(updateInteractiveWidget(int,int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyParamUpdate(int,double,qlonglong)), _mainWindow, SLOT(updateInteractiveWidget(int,double,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyTaskPrevUpdate(int,int,qlonglong,qlonglong,qlonglong)), _mainWindow, SLOT(updateTaskPrev(int,int,qlonglong,qlonglong,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyTaskStartUpdate(int,int,qlonglong)), _mainWindow, SLOT(updateTaskStart(int,int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyTaskEndUpdate(int,qlonglong)), _mainWindow, SLOT(updateTaskEnd(int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyDataUpdate(int,bool,qlonglong)), _mainWindow, SLOT(updateDataWidget(int,bool,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyDataUpdate(int,int,qlonglong)), _mainWindow, SLOT(updateDataWidget(int,int,qlonglong))); QObject::connect(_communicationManager, SIGNAL(notifyDataUpdate(int,double,qlonglong)), _mainWindow, SLOT(updateDataWidget(int,double,qlonglong))); _communicationManager->connectToHost(_configurationManager->serverHost(), _configurationManager->serverPort()); } void CommunicationThread::run() { if(_configurationManager->ssh()) { _connectionAttemptsCount = 0; QString commandLine; #ifdef WIN32 commandLine.append("cmd /c start "); #else commandLine.append("xterm -e "); #endif commandLine.append(_configurationManager->commandLine()); qDebug() << "CommunicationThread : executing SSH command line : " << commandLine; _SSHProcess = new QProcess(); _SSHProcess->start(commandLine); } createNewCommunicationManager(); exec(); } void CommunicationThread::connectionError(QAbstractSocket::SocketError error) { qDebug() << "CommunicationThread : connection error occured" << error; switch (error) { case QAbstractSocket::ConnectionRefusedError: if (_configurationManager->ssh()) { if (_connectionAttemptsCount++ <= MAX_CONNECTION_ATTEMPTS) { qDebug() << "refused, retrying"; emit progress(tr("Connecting refused, retrying (") + QString::number(_connectionAttemptsCount)+(")...")); this->sleep(1); _communicationManager->connectToHost(_configurationManager->serverHost(), _configurationManager->serverPort()); break; } } qDebug() << "Too many retries, giving up"; emit abort(tr("Connection refused by server (port : ") + QString::number( _configurationManager->serverPort()) + tr(") !")); delete _SSHProcess; exit(1); break; case QAbstractSocket::RemoteHostClosedError: if (_connectionAttemptsCount == INT_MAX) { _communicationManager->abort(); } else { if (_configurationManager->ssh()) { if (_connectionAttemptsCount++ <= MAX_CONNECTION_ATTEMPTS) { qDebug() << "closed, retrying"; emit progress(tr("Connecting closed, retrying (") + QString::number(_connectionAttemptsCount)+(")...")); _communicationManager->abort(); break; } } qDebug() << "Too many retries, giving up"; emit abort(tr("Server closed the connection !")); } delete _SSHProcess; exit(1); break; case QAbstractSocket::HostNotFoundError: emit abort(tr("Server not found (host name : ") + _configurationManager->serverHost() + tr(") !")); delete _SSHProcess; exit(1); break; default: emit abort(tr("Connection to server is broken !")); delete _SSHProcess; exit(1); } } void CommunicationThread::connectionSucceeded() { /* Connected at application level, do not try to reconnect on closure */ _connectionAttemptsCount = INT_MAX; } void CommunicationThread::connectionDisconnected() { if (_connectionAttemptsCount == INT_MAX) { /* Only raise to mainWindow if we had connected */ emit disconnected(); } else { /* Just closing for a retry, do retry */ qDebug() << "and retrying"; this->sleep(1); createNewCommunicationManager(); } } starpu-1.1.5/starpu-top/config.h.in0000644000373600000000000000177212571536557014136 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TOP_CONFIG_H__ #define __STARPU_TOP_CONFIG_H__ /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the version of this package. */ #undef PACKAGE_VERSION #endif /* __STARPU_TOP_CONFIG_H__ */ starpu-1.1.5/starpu-top/taskmanager.h0000644000373600000000000000370512571536560014551 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef TASKMANAGER_H #define TASKMANAGER_H #include "starpu_top_types.h" #include #include #include class TaskManager { /* Manages the tasks received from the server in a memory SQLITE database. */ public: TaskManager(); ~TaskManager(); void initialize(); bool connectDatabase(); // Add new tasks void addTaskPrev(int taskId, int deviceId, qlonglong timestampStart, qlonglong timestampEnd); void addTaskStart(int taskId, int deviceId, qlonglong timestampStart); void addTaskEnd(int taskId, qlonglong timestampEnd); // Getters QList tasks(qlonglong timestampStart, qlonglong timestampEnd); QList prevTasks(qlonglong timestampStart, qlonglong timestampEnd); private: // Metadata // Database QSqlDatabase _database; // Queries QSqlQuery _insertTaskPrevQuery; QSqlQuery _insertTaskStartQuery; QSqlQuery _updateTaskEndQuery; QSqlQuery _selectTasksQuery; QSqlQuery _selectPrevTasksQuery; }; #endif // TASKMANAGER_H starpu-1.1.5/starpu-top/ganttwidget.cpp0000644000373600000000000006375612571536557015152 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "ganttwidget.h" #include "mainwindow.h" #include "taskmanager.h" #include #include #include #include const int MAX_CPU_NUM = 6; const int MAX_GPU_NUM = 3; const int MARGIN = 5; const int DEFAULT_TIME_TOTAL = 20000; const int HEIGHT_TIME_AXIS = 20; const int WIDTH_GLOBAL_PU = 50; // Width of the big CPU rect const int WIDTH_PROGRAM = 50; const int WIDTH_PU = 70; const int GRAD_NUM = 5; // Number of gradations between each label const int WIDTH_PRESENT_LINE = 1; const int SIGNIF_NUM = 100; const int FIRST_THRESHOLD = 25; const int SECOND_THRESHOLD = 75; const int SHIFT_LEFT_TIME_AXIS = 3; const int SHIFT_TOP_TIME_AXIS = 3; const QColor GANTT_BACKGROUND_COLOR = Qt::gray; const QFont::StyleHint GANTT_TEXT_FONT = QFont::Times; const QColor GANTT_TEXT_COLOR = Qt::white; const QColor GANTT_PU_COLOR = Qt::blue; const QColor GANTT_TIMELINE_COLOR = Qt::blue; const QColor GANTT_PRESENTLINE_COLOR = Qt::black; const QColor GANTT_IDLE_COLOR = Qt::red; const QColor GANTT_WORKING_COLOR = Qt::green; const QColor GANTT_PREV_COLOR = Qt::yellow; GanttWidget::GanttWidget(MainWindow *mainWindow, TaskManager *taskManager) : QGLWidget(QGLFormat(QGL::SampleBuffers), mainWindow) { _mainWindow = mainWindow; _taskManager = taskManager; setAutoFillBackground(false); _background = QBrush(GANTT_BACKGROUND_COLOR); _textPen = QPen(GANTT_TEXT_COLOR); _textFont.setPixelSize(50); _textFont.setStyleHint(GANTT_TEXT_FONT); _coordxPresentLine = 0; _numPUs = 0; _wasRunning = false; _timeTotal = DEFAULT_TIME_TOTAL; _timeBefore = _timeTotal * 0.66; _timeAfter = _timeTotal * 0.34; _lastValPrevLine = 66; _timePresent = 0; _timeToShow = 0; _numCPUs = 0; _numGPUs = 0; _heightPU = 0; _initCompleted = false; _PUsByDevice = 0; _PUsByPos = 0; // Start display update timer _timer = new QTimer(this); _timer->start(35); // Connect events QObject::connect(_mainWindow, SIGNAL(sessionOpened()), this, SLOT(connected())); QObject::connect(_mainWindow, SIGNAL(sessionClosed()), this, SLOT(disconnected())); QObject::connect(_mainWindow, SIGNAL(debugLocked()), this, SLOT(ganttLocked())); QObject::connect(_mainWindow, SIGNAL(debugStepped()), this, SLOT(ganttUnlocked())); QObject::connect(_timer, SIGNAL(timeout()), this, SLOT(update())); } GanttWidget::~GanttWidget() { delete _timer; delete _rectPUs; } void GanttWidget::defaultScreen(QPainter *painter) { painter->setPen(GANTT_TEXT_COLOR); drawPresentLine(painter); drawTime(painter); } // Called each time the window is resized void GanttWidget::resizeGL(int width, int height) { update(); } void GanttWidget::paintEvent(QPaintEvent *event) { QPainter painter; painter.begin(this); painter.setRenderHint(QPainter::Antialiasing); paint(&painter, event); painter.end(); } /* Draw CPU and GPU rects */ void GanttWidget::drawPUs(QPainter *painter) { QFont f; QPen penRect; QPen penText; QPointF coordTxt; QString txt; QStaticText name; f.setFamily("utf8"); f.setWeight(QFont::Bold); f.setPixelSize(12); painter->setFont(f); penRect.setColor(GANTT_PU_COLOR); penText.setColor(GANTT_TEXT_COLOR); painter->setPen(penRect); _rectPUs = new QRectF[_numCPUs + _numGPUs]; int height_allowed = size().height() - HEIGHT_TIME_AXIS - MARGIN; // height of each processor unit rectangles int height = height_allowed / (_numCPUs + _numGPUs); _heightPU = height; int height_cpublock = height * _numCPUs; int height_gpublock = height * _numGPUs; /* The CPUs rect */ if (_numCPUs > 0) { _rectCPUblock = QRectF(WIDTH_PROGRAM + MARGIN, HEIGHT_TIME_AXIS + MARGIN, WIDTH_GLOBAL_PU, height_cpublock - MARGIN); painter->drawRect(_rectCPUblock); painter->fillRect(_rectCPUblock, GANTT_PU_COLOR); painter->setPen(penText); coordTxt = QPointF( _rectCPUblock.center().rx() - (WIDTH_GLOBAL_PU / 2) + 3, _rectCPUblock.center().ry() - f.pixelSize()); txt = QString("CPU(s)"); name = QStaticText(txt); name.setPerformanceHint(QStaticText::AggressiveCaching); painter->drawStaticText(coordTxt, name); } f.setWeight(QFont::Light); f.setPixelSize(10); painter->setFont(f); painter->setPen(penRect); /* devices */ for (int i = 0; i < _numCPUs + _numGPUs; i++) { painter->setPen(penRect); _rectPUs[i] = QRectF(WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN, HEIGHT_TIME_AXIS + MARGIN + i * height, WIDTH_PU, height - MARGIN); painter->drawRect(_rectPUs[i]); painter->fillRect(_rectPUs[i], Qt::blue); painter->setPen(penText); if (_heightPU >= f.pixelSize() * 2) { painter->drawText(_rectPUs[i], Qt::AlignVCenter, _PUsByPos[i].name); } } f.setFamily("utf8"); f.setWeight(QFont::Bold); f.setPixelSize(12); painter->setFont(f); painter->setPen(penRect); /* The GPUs rect */ if (_numGPUs > 0) { _rectGPUblock = QRectF(WIDTH_PROGRAM + MARGIN, HEIGHT_TIME_AXIS + MARGIN + height_cpublock, WIDTH_GLOBAL_PU, height_gpublock - MARGIN); painter->drawRect(_rectGPUblock); painter->fillRect(_rectGPUblock, Qt::blue); coordTxt = QPointF( _rectGPUblock.center().rx() - (WIDTH_GLOBAL_PU / 2) + 3, _rectGPUblock.center().ry() - f.pixelSize()); txt = QString("GPU(s)"); name = QStaticText(txt); name.setPerformanceHint(QStaticText::AggressiveCaching); painter->setPen(penText); painter->drawStaticText(coordTxt, name); } } /* calculate abscissa on the screen for a given time (in ms) if it's displayable return -1 if timestampMs is outside time displayable because of scale*/ qreal GanttWidget::coordxForTime(qlonglong timestampMs) { qreal startx = (qreal) WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN; qreal widthAllowed = (qreal) size().width() - startx; qreal scale = (qreal) widthAllowed / _timeTotal; qreal coordx = -1; if (timestampMs >= 0) { if ((timestampMs <= _timePresent) && (timestampMs >= (_timePresent - _timeBefore))) { coordx = (qreal) startx + (qreal)( (_timeBefore - (_timePresent - timestampMs)) * scale); } else if ((timestampMs > _timePresent) && timestampMs <= (_timeAfter + _timePresent)) { coordx = (qreal) _coordxPresentLine + (qreal)( (timestampMs - _timePresent) * scale); } } return coordx; } void GanttWidget::drawTime(QPainter *painter) { QFont f; QPen penRect; QPen penText; penRect.setColor(GANTT_TIMELINE_COLOR); penText.setColor(GANTT_TEXT_COLOR); painter->setPen(penRect); f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); _rectTime = QRectF(0, 0, size().width(), 20); painter->drawRect(_rectTime); painter->fillRect(_rectTime, Qt::blue); QString titre = QString("Time (ms)"); QStaticText titreTxt = QStaticText(titre); titreTxt.setPerformanceHint(QStaticText::AggressiveCaching); QPointF coordRect = QPointF(_rectTime.left() + SHIFT_LEFT_TIME_AXIS, _rectTime.center().ry() - f.pixelSize() + SHIFT_TOP_TIME_AXIS); painter->setPen(penText); painter->drawStaticText(coordRect, titreTxt); f.setWeight(QFont::Light); f.setPixelSize(10); painter->setFont(f); qreal ourStartx = WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN; qreal widthAvailable = ((qreal)(size().width() - ourStartx)); qreal scale = ((qreal)(_timeBefore + _timeAfter) / widthAvailable); qreal scale_time_px = (qreal) widthAvailable / (_timeBefore + _timeAfter); int timeInterval = computeTimeInterval(_timeTotal); qreal sizeInterval = ((qreal)(timeInterval * scale_time_px)); qreal step_x = (qreal)(sizeInterval / GRAD_NUM); //we calculate the location of the next gradation in the future part qlonglong first = _timePresent - _timePresent % ((qlonglong) timeInterval); qlonglong cur_t = first; //gradations in the past while (cur_t > _timePresent - _timeBefore) { if (cur_t >= (qlonglong) 0) { qreal cur_x = ((qreal)((_timeBefore - (_timePresent - cur_t)) / scale) + ourStartx); QString buffer; buffer.append(QString("%1").arg(cur_t)); QStaticText gradTxt = QStaticText(buffer); gradTxt.setPerformanceHint(QStaticText::AggressiveCaching); //calculate the fading int fading = 3 * (cur_x - ourStartx); if (fading < 0) { fading = 0; } if (fading > 255) { fading = 255; } _textPen.setColor(QColor(255, 255, 255, fading)); painter->setPen(_textPen); painter->drawLine( QLineF(cur_x, 0, cur_x, HEIGHT_TIME_AXIS - MARGIN)); if (widthAvailable > 500) { painter->drawStaticText( QPointF(cur_x, HEIGHT_TIME_AXIS - MARGIN - f.pixelSize()), gradTxt); } for (int k = 1; k < GRAD_NUM; k++) { // k=1 ,because of spans painter->drawLine( QLineF(cur_x + step_x * k, 0, cur_x + step_x * k, HEIGHT_TIME_AXIS - MARGIN * 3)); } } cur_t -= timeInterval; } //in the future cur_t = first + timeInterval; while (cur_t < _timePresent + _timeAfter) { qreal cur_x = ((qreal)((_timeBefore - (_timePresent - cur_t)) / scale) + ourStartx); QString buffer; buffer.append(QString("%1").arg(cur_t)); QStaticText gradTxt = QStaticText(buffer); gradTxt.setPerformanceHint(QStaticText::AggressiveCaching); //calculate the fading int fading = 3 * (size().width() - cur_x); if (fading > 255) { fading = 255; } _textPen.setColor(QColor(255, 255, 255, fading)); painter->setPen(_textPen); painter->drawLine(QLineF(cur_x, 0, cur_x, HEIGHT_TIME_AXIS - MARGIN)); if (widthAvailable > 500) { painter->drawStaticText( QPointF(cur_x, HEIGHT_TIME_AXIS - MARGIN - f.pixelSize()), gradTxt); } for (int k = 1; k < GRAD_NUM; k++) { painter->drawLine( QLineF(cur_x + step_x * k, 0, cur_x + step_x * k, HEIGHT_TIME_AXIS - MARGIN * 3)); } cur_t += timeInterval; } _textPen.setColor(QColor(255, 255, 255)); painter->setPen(_textPen); } //calculate un lapse of time to get at least 20 gradations if 1000 <= timeTotal //and <=24 * 10^X int GanttWidget::computeTimeInterval(int timeTotal) { int coef = 1; while (timeTotal >= SIGNIF_NUM) { timeTotal = timeTotal / 10; coef *= 10; } //we have a number between 1 and 99 if (timeTotal < FIRST_THRESHOLD) { return coef; } else if (timeTotal < SECOND_THRESHOLD) { return coef * 5; } else { return coef * 10; } } void GanttWidget::drawProgram(QPainter *painter) { QFont f; QPen penRect; QPen penText; penRect.setColor(GANTT_PU_COLOR); penText.setColor(GANTT_TEXT_COLOR); f.setFamily("utf8"); f.setWeight(QFont::Black); f.setPixelSize(10); painter->setFont(f); painter->setPen(penRect); _rectProg = QRectF(0, HEIGHT_TIME_AXIS + MARGIN, WIDTH_PROGRAM, size().height() - HEIGHT_TIME_AXIS - MARGIN * 2); painter->drawRect(_rectProg); painter->fillRect(_rectProg, Qt::blue); QPointF coordTxt = QPointF( _rectProg.center().rx() - (WIDTH_PROGRAM / 2) + 3, _rectProg.center().ry() - f.pixelSize()); QString txt = QString("Program"); QStaticText name = QStaticText(txt); name.setPerformanceHint(QStaticText::AggressiveCaching); painter->setPen(penText); painter->drawStaticText(coordTxt, name); } void GanttWidget::drawPresentLine(QPainter *painter) { QPen pen; pen.setColor(GANTT_PRESENTLINE_COLOR); painter->setPen(pen); qreal widthAllowed = (qreal)( size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN); int timeTotal = _timeBefore + _timeAfter; int x, y, w, h; x = WIDTH_PROGRAM + MARGIN + WIDTH_GLOBAL_PU + MARGIN + WIDTH_PU + MARGIN; y = (HEIGHT_TIME_AXIS + MARGIN); w = WIDTH_PRESENT_LINE; h = size().height() - (HEIGHT_TIME_AXIS + MARGIN); qreal scale = (qreal)(widthAllowed / timeTotal); qreal gap_x = (qreal)(scale * _timeBefore); _linePresent = QRectF(x + gap_x, y, w, h); _coordxPresentLine = (qreal)(x + gap_x); painter->drawRect(_linePresent); painter->fillRect(_linePresent, Qt::black); } /* Draw whole gantt diagram depending on time showing line present location. Useful to draw the diagram after the complete execution. */ void GanttWidget::drawFromTime(QPainter *painter, qlonglong timestamp) { Q_ASSERT_X(timestamp >= 0, "GanttWidget::drawFromTime", "Negative timestamp !"); /* program rect */ drawProgram(painter); _timePresent = timestamp; /* time line */ drawTime(painter); drawPUs(painter); /* Tasks */ drawIdlePU(painter); qlonglong borneBefore = _timePresent - _timeBefore; if (borneBefore < 0) { borneBefore = 0; } _tasks = _taskManager->tasks(borneBefore, _timePresent); foreach(starpu_top_task t, _tasks) { drawWorkPU(painter,t); } } /* draw idle time for each processor */ void GanttWidget::drawIdlePU(QPainter *painter) { int starty = HEIGHT_TIME_AXIS + MARGIN; int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN; int timeTotal = _timeBefore + _timeAfter; qreal posBlockx = 0; qreal placeTime = 0; bool isStartx = false; qreal scale = (qreal) widthAllowed / timeTotal; QRectF rectIdle; qlonglong timestampS = 0; if (_timePresent >= _timeBefore) { timestampS = _timePresent - _timeBefore; } /* drawIdlePu */ for (qlonglong j = timestampS; j < _timePresent; j++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(j); } placeTime++; } QFont f; QPen pen; f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); pen.setColor(GANTT_IDLE_COLOR.lighter(110)); painter->setPen(pen); for (int i = 0; i < _numPUs; i++) { rectIdle = QRectF(posBlockx, starty + (_heightPU) * i, placeTime * scale, (_heightPU - MARGIN)); painter->drawRect(rectIdle); painter->fillRect(rectIdle, GANTT_IDLE_COLOR); } } /* draw forecasted working time for each processor */ void GanttWidget::drawPrevWorkPU(QPainter *painter, starpu_top_task t) { int starty = HEIGHT_TIME_AXIS + MARGIN; int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN; qreal posBlockx = 0; qreal placeTime = 0; bool isStartx = false; qreal scale = (qreal) widthAllowed / _timeTotal; QRectF rectForecast; //either the beginning is in the Future Part //( timeAfter ) or either in the Past Part (timeBefore) qlonglong timestampS = (t.timestampStart - _timePresent); if (timestampS > 0) { // the beginning is in the Future part (displayable here) timestampS = t.timestampStart; } else { // the beginning is in the Past part (not displayable here) timestampS = _timePresent; // +1 just to be sure we don't draw over the line of Present posBlockx = _coordxPresentLine + WIDTH_PRESENT_LINE + 1; isStartx = true; placeTime -= WIDTH_PRESENT_LINE + 1; } qlonglong timestampE = (t.timestampEnd - _timePresent); if (timestampE > 0) { if (timestampE <= _timeAfter) { timestampE = t.timestampEnd; // the end is displayable } else { // the end is not displayable because it's in the future // more than timePresent + timeAfter timestampE = _timePresent + _timeAfter; } } else { // the end is not displayable because it's in the past timestampE = _timePresent; posBlockx = _coordxPresentLine + WIDTH_PRESENT_LINE + 1; isStartx = true; placeTime -= WIDTH_PRESENT_LINE + 1; } /* Future */ for (qlonglong i = timestampS; i <= timestampE; i++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(i); } placeTime++; } int pos = _PUsByDevice[t.deviceId].id; QFont f; QPen pen; pen.setColor(GANTT_TEXT_COLOR); painter->setPen(pen); f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); QLinearGradient gradient(posBlockx, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2, posBlockx + placeTime * scale, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2); QColor prevColor = GANTT_PREV_COLOR; gradient.setColorAt(0.2, prevColor.lighter(110)); gradient.setColorAt(0.3, Qt::yellow); gradient.setColorAt(0.80, prevColor.darker(270)); QBrush brush(gradient); pen.setBrush(brush); painter->setPen(pen); rectForecast = QRectF(posBlockx, starty + (_heightPU) * pos, placeTime * scale, (_heightPU - MARGIN)); painter->drawRect(rectForecast); painter->fillRect(rectForecast, brush); } /* Draw working time for each processor. Working PUs. We don't mind about task values because the taskmanager gives us only the tasks between timeBefore and timePresent so we haven't to test if they are displayable or not. We just have to calculate which part of time is displayable. The task t has its begin or its end between time Before and timePresent */ void GanttWidget::drawWorkPU(QPainter *painter, starpu_top_task t) { int starty = HEIGHT_TIME_AXIS + MARGIN; int widthAllowed = size().width() - WIDTH_PROGRAM - MARGIN - WIDTH_GLOBAL_PU - MARGIN - WIDTH_PU - MARGIN; qreal posBlockx = 0; qreal placeTime = 0; bool isStartx = false; qreal scale = (qreal) widthAllowed / _timeTotal; QRectF rectWorking; qlonglong timestampS = (_timePresent - t.timestampStart); qlonglong timestampE = -1; if (timestampS > _timeBefore) { // Begin time of task t is not displayable timestampS = _timePresent - _timeBefore; } else { timestampS = t.timestampStart; // Begin time of task t is displayable } if (t.timestampEnd == -1) { for (qlonglong i = timestampS; i <= _timePresent; i++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(i); } placeTime++; } } else { timestampE = t.timestampEnd; if (timestampE > _timePresent) { timestampE = _timePresent; } for (qlonglong i = timestampS; i <= timestampE; i++) { if (!isStartx) { isStartx = true; posBlockx = coordxForTime(i); } placeTime++; } } int pos = _PUsByDevice[t.deviceId].id; QFont f; QPen pen; f.setFamily("utf8"); f.setWeight(QFont::DemiBold); f.setPixelSize(10); painter->setFont(f); rectWorking = QRectF(posBlockx, starty + (_heightPU) * pos, placeTime * scale, (_heightPU - MARGIN)); painter->drawRect(rectWorking); QLinearGradient gradient(posBlockx, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2, posBlockx + placeTime * scale, starty + (_heightPU) * pos + (_heightPU - MARGIN) / 2); QColor workingColor = GANTT_WORKING_COLOR; gradient.setColorAt(0.2, workingColor.lighter(110)); gradient.setColorAt(0.3, Qt::green); gradient.setColorAt(0.8, workingColor.darker(270)); gradient.setSpread(QGradient::PadSpread); QBrush brush(gradient); pen.setBrush(brush); painter->setPen(pen); painter->fillRect(rectWorking, brush); } void GanttWidget::updateZoom(double value) { qDebug() << "VALEUR === " << value; // if(!(value == 0.0)) // { _timeTotal = value; updatePrevLine( _lastValPrevLine); //} } void GanttWidget::updatePrevLine(double value) { _timeBefore = _timeTotal * (value / 100); _timeAfter = _timeTotal * ((100 - value) / 100); _lastValPrevLine = value; if (!(_timer->isActive())) { update(); } } void GanttWidget::updateTimeView(int time) { qlonglong newTimeToShow = time; if (!(_timer->isActive())) { _timeToShow = newTimeToShow; update(); } } void GanttWidget::connected() { _wasRunning = false; _initCompleted = false; _timePresent = 0; if (!(_timer->isActive())) { _timer->start(35); } } void GanttWidget::disconnected() { _wasRunning = true; if (_timer->isActive()) { _timer->stop(); } } void GanttWidget::ganttLocked() { update(); // a last drawing update before to freeze the drawing if (_timer->isActive()) { _timer->stop(); // freeze the drawing } } void GanttWidget::ganttUnlocked() { if (!(_timer->isActive())) { _timer->start(35); // start the timer again } } void GanttWidget::countPUs() { int length; _numCPUs = 0; _numGPUs = 0; length = _mainWindow->serverDevices()->length(); _numPUs = length; delete _PUsByDevice; delete _PUsByPos; _PUsByDevice = new starpu_top_device[length]; _PUsByPos = new starpu_top_device[length]; int pos = 0; /* CPUs */ foreach(starpu_top_device sD,*_mainWindow->serverDevices()) { if(sD.type == 0) { _PUsByDevice[sD.id].name = sD.name; _PUsByDevice[sD.id].type = sD.type; _PUsByDevice[sD.id].id = pos; // actual location _PUsByPos[pos].id = sD.id; // the reak id _PUsByPos[pos].name = sD.name; _PUsByPos[pos].type = sD.type; _numCPUs++; pos++; } } /* GPUs */ foreach (starpu_top_device sD , *_mainWindow->serverDevices()) { if(sD.type == 1 || sD.type == 2) { _PUsByDevice[sD.id].name = sD.name; _PUsByDevice[sD.id].type = sD.type; _PUsByDevice[sD.id].id = pos; // actually location _PUsByPos[pos].id = sD.id; // the real id _PUsByPos[pos].name = sD.name; _PUsByPos[pos].type = sD.type; pos++; _numGPUs++; } } } void GanttWidget::paint(QPainter *painter, QPaintEvent *event) { painter->fillRect(event->rect(), _background); painter->setPen(_textPen); if (_mainWindow->isReady()) { if (!_initCompleted) { // do not call countPUs more than once per execution countPUs(); _initCompleted = true; } drawProgram(painter); drawPUs(painter); if (_mainWindow->isRunning()) { _timePresent = _mainWindow->effectiveRunningTime(); _timeToShow = _timePresent; // saved the time of end drawTime(painter); drawPresentLine(painter); drawIdlePU(painter); /* Past part */ qlonglong borneBefore = _timePresent - _timeBefore; if (borneBefore < 0) { borneBefore = 0; } _tasks = _taskManager->tasks(borneBefore, _timePresent); foreach (starpu_top_task t, _tasks) { drawWorkPU(painter,t); } /* Future past */ qlonglong borneAfter = _timePresent + _timeAfter; _tasks = _taskManager->prevTasks(_timePresent, borneAfter); foreach (starpu_top_task t, _tasks) { drawPrevWorkPU(painter,t); } } else if (!_wasRunning) { defaultScreen(painter); } } else { if (_wasRunning) { // display wanted part of execution (only if it's finished) drawFromTime(painter,_timeToShow); } } } starpu-1.1.5/starpu-top/aboutdialog.ui0000644000373600000000000001170012571536557014734 00000000000000 AboutDialog 0 0 328 340 0 0 0 0 About StarPU-Top... :/images/about.png:/images/about.png true 16777215 110 Developers true QAbstractItemView::NoSelection William BRAIK Yann COURTOIS Jean-Marie COUTEYEN Anthony ROY 16777215 50 font: 12pt "MS Shell Dlg 2"; StarPU-Top, for StarPU false Qt::AlignCenter 120 110 :/images/starpu_top.png true 0 0 16777215 90 Software true 0 0 16777215 16777215 QAbstractItemView::NoSelection Year : 2011 Version : 0.1 Licence : LGPL starpu-1.1.5/starpu-top/StarPU-Top-qwt-system.pri.in0000644000373600000000000000010312571536557017270 00000000000000LIBS += @STARPU_QWT_LDFLAGS@ INCLUDEPATH += @STARPU_QWT_INCLUDE@ starpu-1.1.5/starpu-top/starpu_top.10000644000373600000000000000117112571537024014354 00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10. .TH STARPU_TOP "1" "September 2015" "starpu_top (StarPU) 1.1.5" "User Commands" .SH NAME starpu_top \- manual page for starpu_top (StarPU) 1.1.5 .SH SYNOPSIS .B starpu_top [\fIOPTION\fR] .SH DESCRIPTION starpu\-top is an interface which remotely displays the on\-line state of a StarPU application and permits the user to change parameters on the fly. .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR display this help and exit .TP \fB\-v\fR, \fB\-\-version\fR output version information and exit .SH "REPORTING BUGS" Report bugs to . starpu-1.1.5/starpu-top/interactivewidget.cpp0000644000373600000000000004443312571536555016337 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "interactivewidget.h" #include "mainwindow.h" #include #include #include #include #include #include #include #include InteractiveWidget::InteractiveWidget(ParamDescription *paramDescription, MainWindow *mainWindow) : QWidget(mainWindow) { _mainWindow = mainWindow; _paramDescription = paramDescription; _internalWidget = 0; _interactiveWidgetNames = _mainWindow->interactiveWidgetNames(); _interactiveWidgetPossibilities = _mainWindow->interactiveWidgetPossibilities() ->value( _paramDescription->type).values(); // Init context menu actions QActionGroup *actionGroup = new QActionGroup(this); for (int i = 0; i < _interactiveWidgetPossibilities.count(); i++) { QAction *action = new QAction( _interactiveWidgetNames ->value( _interactiveWidgetPossibilities.at(i)), actionGroup); action->setCheckable(true); if (_interactiveWidgetPossibilities.at(i) == _paramDescription->widget) { action->setChecked(true); } QObject::connect(action, SIGNAL(triggered()), this, SLOT(widgetTypeChanged())); actionGroup->addAction(action); } addActions(actionGroup->actions()); // Set attributes setAttribute(Qt::WA_DeleteOnClose); setContextMenuPolicy(Qt::ActionsContextMenu); // Init GUI QString labelText = _paramDescription->descriptionString; if (_paramDescription->descriptionString.size() > 14) { labelText.truncate(12); labelText.append("..."); } _label = new QLabel(labelText); _label->setToolTip(_paramDescription->descriptionString); // Set layout _layout = new QHBoxLayout(this); setLayout( _layout); _layout->addWidget(_label); // Create internal widget createInternalWidget(); // Bind notifications QObject::connect(this, SIGNAL(paramValueChanged(int,bool)), _mainWindow, SLOT(interactiveWidgetUpdated(int,bool))); QObject::connect(this, SIGNAL(paramValueChanged(int,int)), _mainWindow, SLOT(interactiveWidgetUpdated(int,int))); QObject::connect(this, SIGNAL(paramValueChanged(int,double)), _mainWindow, SLOT(interactiveWidgetUpdated(int,double))); // Setup automatic cleanup QObject::connect(this, SIGNAL(destroyed()), _mainWindow, SLOT(removeDestroyedInteractiveWidgets())); qDebug() << "InteractiveWidget : initializing [desc" << _paramDescription->descriptionString << "; id" << _paramDescription->id << "; type" << _paramDescription->type << "; min" << _paramDescription->valMin << "; max" << _paramDescription->valMax << "; init bool" << _paramDescription->valInitBool << "; init double" << _paramDescription->valInitDouble << "; init enum" << _paramDescription->valInitEnum << "; init int" << _paramDescription->valInitInt << "; widget" << _paramDescription->widget << "]"; } InteractiveWidget::~InteractiveWidget() { qDebug() << "InteractiveWidget" << _paramDescription->id << ": terminating"; } void InteractiveWidget::closeEvent(QCloseEvent *ce) { ce->accept(); } void InteractiveWidget::recreateInternalWidget() { if (_internalWidget != 0) { _internalWidget->close(); _internalWidget = 0; } createInternalWidget(); adjustSize(); updateAction(_paramDescription->widget); } void InteractiveWidget::updateAction(InteractiveWidgetType newWidget) { for (int i = 0; i < actions().count(); i++) { if (actions().at(i)->text().compare( _interactiveWidgetNames->value(newWidget)) == 0) { actions().at(i)->setChecked(true); return; } } } void InteractiveWidget::createInternalWidget() { qDebug() << "Creating the interactive widget for param id" << _paramDescription->id; switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_SLIDER: { _internalWidget = new QwtSlider(this); _internalWidget->setMinimumWidth(100); QwtSlider *widget = (QwtSlider*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setScalePosition(QwtSlider::BottomScale); widget->setValue(_paramDescription->valInitInt); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(sliderValueChanged())); break; } case INTERACTIVE_WIDGET_KNOB: { _internalWidget = new QwtKnob(this); _internalWidget->setMinimumSize(50, 50); QwtKnob *widget = (QwtKnob*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitDouble); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(knobValueChanged())); break; } case INTERACTIVE_WIDGET_WHEEL: { _internalWidget = new QwtWheel(this); _internalWidget->setMinimumSize(50, 30); QwtWheel *widget = (QwtWheel*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitDouble); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(wheelValueChanged())); break; } case INTERACTIVE_WIDGET_CHECKBOX: { _internalWidget = new QCheckBox(this); _internalWidget->setMinimumSize(25, 25); QCheckBox *widget = (QCheckBox*) _internalWidget; widget->setChecked(_paramDescription->valInitBool); QObject::connect(widget, SIGNAL(clicked(bool)), this, SLOT(notifyValueChanged(bool))); break; } case INTERACTIVE_WIDGET_SPINBOX: { _internalWidget = new QSpinBox(this); _internalWidget->setMinimumSize(75, 30); QSpinBox *widget = (QSpinBox*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitInt); QObject::connect(widget, SIGNAL(valueChanged(int)), this, SLOT(notifyValueChanged(int))); break; } case INTERACTIVE_WIDGET_DOUBLESPINBOX: { _internalWidget = new QDoubleSpinBox(this); _internalWidget->setMinimumSize(75, 30); QDoubleSpinBox *widget = (QDoubleSpinBox*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitDouble); QObject::connect(widget, SIGNAL(valueChanged(double)), this, SLOT(notifyValueChanged(double))); break; } case INTERACTIVE_WIDGET_DIAL: { _internalWidget = new QDial(this); _internalWidget->setMinimumSize(80, 40); QDial *widget = (QDial*) _internalWidget; widget->setRange(_paramDescription->valMin, _paramDescription->valMax); widget->setValue(_paramDescription->valInitInt); QObject::connect(widget, SIGNAL(sliderReleased()), this, SLOT(dialValueChanged())); break; } case INTERACTIVE_WIDGET_COMBOBOX: { _internalWidget = new QComboBox(this); _internalWidget->setMinimumSize(75, 25); QComboBox *widget = (QComboBox*) _internalWidget; widget->addItems(_paramDescription->enumValues); widget->setCurrentIndex(_paramDescription->valInitEnum); QObject::connect(widget, SIGNAL(currentIndexChanged(int)), this, SLOT(notifyValueChanged(int))); break; } default: ; } _internalWidget->setAttribute(Qt::WA_DeleteOnClose); layout()->addWidget(_internalWidget); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ ParamDescription *InteractiveWidget::description() const { return _paramDescription; } QSize InteractiveWidget::minimumInternalWidgetSize() const { return _internalWidget->minimumSize(); } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void InteractiveWidget::setValue(bool value) { switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_CHECKBOX: { QCheckBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setChecked(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } default: ; } } void InteractiveWidget::setValue(int value) { switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_SLIDER: { QwtSlider *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_KNOB: { QwtKnob *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_WHEEL: { QwtWheel *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_SPINBOX: { QSpinBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DOUBLESPINBOX: { QDoubleSpinBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DIAL: { QDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_COMBOBOX: { QComboBox *widget = qobject_cast (_internalWidget); if (widget != 0) { if (value >= _paramDescription->valMin && value <= _paramDescription->valMax) { widget->setCurrentIndex(value); } else { qDebug() << "Trying to set out of range enum value for enum widget " << _paramDescription->id << "value" << value; } } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } default: ; } } void InteractiveWidget::setValue(double value) { switch (_paramDescription->widget) { case INTERACTIVE_WIDGET_SLIDER: { QwtSlider *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_KNOB: { QwtKnob *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_WHEEL: { QwtWheel *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DOUBLESPINBOX: { QDoubleSpinBox *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } case INTERACTIVE_WIDGET_DIAL: { QDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad interactive widget cast " "(InteractiveWidget::setValue()) !"; } break; } default: ; } } /* -------------------------------------------------------------------------- */ /* Other methods */ /* -------------------------------------------------------------------------- */ void InteractiveWidget::sliderValueChanged() { QwtSlider *widget = (QwtSlider*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::wheelValueChanged() { QwtWheel *widget = (QwtWheel*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::knobValueChanged() { QwtKnob *widget = (QwtKnob*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::dialValueChanged() { QDial *widget = (QDial*) QObject::sender(); if (_paramDescription->type == PARAM_TYPE_INT) { int valueInt = (int) widget->value(); notifyValueChanged(valueInt); } else { // Param type is double double valueDouble = (double) widget->value(); notifyValueChanged(valueDouble); } } void InteractiveWidget::notifyValueChanged(bool value) { emit paramValueChanged(_paramDescription->id, value); } void InteractiveWidget::notifyValueChanged(int value) { emit paramValueChanged(_paramDescription->id, value); } void InteractiveWidget::notifyValueChanged(double value) { emit paramValueChanged(_paramDescription->id, value); } void InteractiveWidget::widgetTypeChanged() { QAction *action = (QAction*) QObject::sender(); if(_paramDescription->widget != _interactiveWidgetNames->key(action->text())) { _mainWindow->updateInteractiveWidgetType (_paramDescription->id, _interactiveWidgetNames->key(action->text())); } } starpu-1.1.5/starpu-top/mainwindow.ui0000644000373600000000000001307412571536560014616 00000000000000 MainWindow 0 0 987 700 0 0 StarPU-Top :/images/starpu_top.png:/images/starpu_top.png 1 6 0 0 987 21 StarPU-Top ? Settings Toolbar false Qt::TopToolBarArea false TopToolBarArea false 60 38 Qt::DefaultContextMenu QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable Parameters 2 :/images/connect.png:/images/connect.png Connect to StarPU Ctrl+C false :/images/play.png:/images/play.png Launch StarPU Ctrl+L :/images/quit.png:/images/quit.png Quit Ctrl+Q :/images/help.png:/images/help.png Help Ctrl+H :/images/about.png:/images/about.png About StarPU-Top... :/images/preferences.png:/images/preferences.png Preferences Ctrl+P false :/images/debugon.png:/images/debugon.png Enable Debug starpu-1.1.5/starpu-top/StarPU-Top-common.pri0000644000373600000000000000331312571536555016022 00000000000000# ------------------------------------------------- # Project created by QtCreator 2011-01-22T11:55:16 # ------------------------------------------------- QT += network QT += opengl QT += sql TARGET = starpu_top TEMPLATE = app SOURCES += $$SRCDIR/main.cpp \ #STARPU-TOP $$SRCDIR/mainwindow.cpp \ $$SRCDIR/configurationmanager.cpp \ $$SRCDIR/widgetwindowsmanager.cpp \ $$SRCDIR/communicationthread.cpp \ $$SRCDIR/communicationmanager.cpp \ $$SRCDIR/preferencesdialog.cpp \ $$SRCDIR/datawidget.cpp \ $$SRCDIR/interactivewidget.cpp \ $$SRCDIR/ganttwidget.cpp \ $$SRCDIR/debugconsole.cpp \ $$SRCDIR/dataaggregatorwidget.cpp \ $$SRCDIR/taskmanager.cpp \ $$SRCDIR/abstractwidgetwindow.cpp \ $$SRCDIR/sessionsetupmanager.cpp \ #QLEDINDICATOR $$SRCDIR/qledindicator/qledindicator.cpp \ $$SRCDIR/aboutdialog.cpp HEADERS += $$SRCDIR/mainwindow.h \ #STARPU-TOP $$SRCDIR/starpu_top_types.h \ $$SRCDIR/widgetwindowsmanager.h \ $$SRCDIR/configurationmanager.h \ $$SRCDIR/communicationthread.h \ $$SRCDIR/communicationmanager.h \ $$SRCDIR/preferencesdialog.h \ $$SRCDIR/datawidget.h \ $$SRCDIR/interactivewidget.h \ $$SRCDIR/ganttwidget.h \ $$SRCDIR/debugconsole.h \ $$SRCDIR/dataaggregatorwidget.h \ $$SRCDIR/taskmanager.h \ $$SRCDIR/abstractwidgetwindow.h \ $$SRCDIR/sessionsetupmanager.h \ #QLEDINDICATOR $$SRCDIR/qledindicator/qledindicator.h \ $$SRCDIR/aboutdialog.h FORMS += $$SRCDIR/mainwindow.ui \ $$SRCDIR/preferencesdialog.ui \ $$SRCDIR/debugconsole.ui \ $$SRCDIR/aboutdialog.ui RESOURCES += $$SRCDIR/resources.qrc OTHER_FILES += $$SRCDIR/TODO.txt starpu-1.1.5/starpu-top/mainwindow.cpp0000644000373600000000000013602712571536557014775 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include "configurationmanager.h" #include "communicationthread.h" #include "widgetwindowsmanager.h" #include "sessionsetupmanager.h" #include "taskmanager.h" #include "debugconsole.h" #include "ganttwidget.h" #include "preferencesdialog.h" #include "interactivewidget.h" #include "datawidget.h" #include "dataaggregatorwidget.h" #include "aboutdialog.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { // Set up GUI components ui->setupUi(this); ui->mainToolBar->setWindowTitle("Toolbar"); _mdiArea = new QMdiArea(); _mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); _mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); // Init data initDataWidgetLists(); initInteractiveWidgetLists(); _dataWidgets = new QList > (); _interactiveWidgets = new QList > (); _dataAggregatorWidgets = new QList > (); _dataDescriptions = new QList (); _paramDescriptions = new QList (); _serverDevices = new QList (); _nbDataWidgets = _nbInteractiveWidgets = _nbDataAggregatorWidgets = 0; // Init managers _configurationManager = new ConfigurationManager(); _communicationThread = new CommunicationThread(this, _configurationManager); _widgetWindowsManager = new WidgetWindowsManager(this, _mdiArea); _sessionSetupManager = new SessionSetupManager(this); _taskManager = new TaskManager(); // Setup status bar _statusBarIcon = new QLabel(); _statusBarLabel = new QLabel(); statusBar()->addPermanentWidget(_statusBarIcon); statusBar()->addWidget(_statusBarLabel); // Setup interactions // Setup main actions // Action connect _actionConnect = ui->mainToolBar->addAction(QIcon(":/images/connect.png"), tr("Connect to StarPU")); _actionConnect->setIconText("Connect to StarPU"); _actionConnect->setToolTip("Connect to StarPU"); _actionConnect->setShortcut(QKeySequence("Ctrl+C")); QToolButton *connectButton = (QToolButton*)ui->mainToolBar->widgetForAction(_actionConnect); connectButton->setPopupMode(QToolButton::InstantPopup); QObject::connect(_actionConnect, SIGNAL(triggered()), this, SLOT(on_actionConnect_triggered())); QAction *settingsAction = new QAction( "Edit connection settings", _actionConnect); settingsAction->setIcon(QIcon(":/images/preferences.png")); QObject::connect(settingsAction, SIGNAL(triggered()), this, SLOT(on_actionPreferences_triggered())); connectButton->addAction(settingsAction); ui->menu_starpu_top->addAction(_actionConnect); // Action launch _actionLaunch = ui->mainToolBar->addAction(QIcon(":/images/play.png"), tr("Launch StarPU")); _actionLaunch->setIconText("Launch StarPU"); _actionLaunch->setToolTip("Launch StarPU"); _actionLaunch->setShortcut(QKeySequence("Ctrl+L")); ui->menu_starpu_top->addAction(_actionLaunch); QObject::connect(_actionLaunch, SIGNAL(triggered()), this, SLOT(on_actionLaunch_StarPU_triggered())); ui->mainToolBar->addSeparator(); ui->menu_starpu_top->addSeparator(); // Action debug _actionDebug = ui->mainToolBar->addAction(QIcon(":/images/debugon.png"), tr("Enable debug")); _actionDebug->setIconText("Enable debug"); _actionDebug->setToolTip("Enable debug"); _actionDebug->setShortcut(QKeySequence("Ctrl+D")); _actionDebug->setCheckable(true); ui->menu_starpu_top->addAction(_actionDebug); QObject::connect(_actionDebug, SIGNAL(toggled(bool)), this, SLOT(on_actionDebug_triggered(bool))); // Action save session setup _actionSaveSessionSetup = ui->mainToolBar->addAction( QIcon(":/images/windows.png"), tr("Save session setup")); _actionSaveSessionSetup->setIconText("Save session setup"); _actionSaveSessionSetup->setToolTip("Save session setup"); _actionSaveSessionSetup->setShortcut(QKeySequence("Ctrl+S")); ui->menu_starpu_top->addAction(_actionSaveSessionSetup); QObject::connect(_actionSaveSessionSetup, SIGNAL(triggered()), this, SLOT(on_actionSaveSessionSetup_triggered())); // Action add data aggregator widget _actionAddDataAggregatorWidget = ui->mainToolBar->addAction(QIcon(":/images/widget.png"), tr("Add data aggregator widget")); _actionAddDataAggregatorWidget->setIconText("Add data aggregator widget"); _actionAddDataAggregatorWidget->setToolTip("Add data aggregator widget"); _actionAddDataAggregatorWidget->setShortcut(QKeySequence("Ctrl+G")); ui->menu_starpu_top->addAction(_actionAddDataAggregatorWidget); QObject::connect(_actionAddDataAggregatorWidget, SIGNAL(triggered()), this, SLOT(on_actionAddDataAggregatorWidget_triggered())); ui->mainToolBar->addSeparator(); ui->menu_starpu_top->addSeparator(); // Action quit QAction *actionQuit = ui->menu_starpu_top->addAction( QIcon(":/images/quit.png"), tr("Quit")); actionQuit->setIconText("Quit"); actionQuit->setToolTip("Quit"); QObject::connect(actionQuit, SIGNAL(triggered()), this, SLOT(on_actionQuit_triggered())); actionQuit->setShortcut(QKeySequence("Ctrl+Q")); _widgetsDisplayModesList = new QComboBox(ui->mainToolBar); _widgetsDisplayModesList->addItem(tr("Flying windows"), DISPLAY_FLYING_WINDOWS); _widgetsDisplayModesList->addItem(tr("MDI, normal"), DISPLAY_MDI_NORMAL); _widgetsDisplayModesList->setCurrentIndex(1); QObject::connect(_widgetsDisplayModesList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDataWidgetsDisplayMode(int))); ui->mainToolBar->addWidget(_widgetsDisplayModesList); // Init GUI components // Retrieve the central widget layout QGridLayout *centralLayout = (QGridLayout*) ui->centralWidget->layout(); // Install MDI area _mdiArea->setMinimumSize(500, 200); _mdiArea->addAction(_actionAddDataAggregatorWidget); _mdiArea->setContextMenuPolicy(Qt::ActionsContextMenu); _mdiArea->setEnabled(false); // Install gantt widget _ganttWidget = new GanttWidget(this, _taskManager); _ganttWidget->setMinimumSize(500, 200); // Install parameters dock _parametersDockScrollArea = new QScrollArea(); _parametersDockScrollArea->setMinimumSize(250, 250); _parametersDockScrollArea->setLayout(new QVBoxLayout()); ui->parametersDock->setWidget(_parametersDockScrollArea); // Install the gantt widget container and the gantt controllers QWidget *ganttContainer = new QWidget(); QGridLayout *ganttContainerLayout = new QGridLayout(); ganttContainer->setLayout(ganttContainerLayout); // Zoom controller QwtSlider *ganttZoom = new QwtSlider(ganttContainer, Qt::Vertical); ganttZoom->setRange(100.0, 20000.0, 1.0); ganttZoom->setValue(10000.0); QObject::connect(ganttZoom, SIGNAL(valueChanged(double)), _ganttWidget, SLOT(updateZoom(double))); // Time view controller _ganttTimeView = new QSpinBox(); _ganttTimeView->setRange(0, INT_MAX); _ganttTimeView->setAccelerated(true); QObject::connect(_ganttTimeView, SIGNAL(valueChanged(int)), _ganttWidget, SLOT(updateTimeView(int))); // Prevision line controller QwtSlider *ganttPrevLine = new QwtSlider(ganttContainer, Qt::Horizontal); ganttPrevLine->setRange(0, 100); ganttPrevLine->setValue(66.67); QObject::connect(ganttPrevLine, SIGNAL(valueChanged(double)), _ganttWidget, SLOT(updatePrevLine(double))); // Set gantt layouts QHBoxLayout *ganttBottom = new QHBoxLayout(); ganttBottom->addWidget(_ganttTimeView, 0); ganttBottom->addWidget(ganttPrevLine, 1); ganttContainerLayout->addWidget(_ganttWidget, 0, 0); ganttContainerLayout->addWidget(ganttZoom, 0, 1); ganttContainerLayout->addLayout(ganttBottom, 1, 0); // Install debug console _debugConsole = new DebugConsole(this); QObject::connect(_debugConsole, SIGNAL(stepped()), this, SLOT(debugStep())); _debugConsole->setVisible(false); // Install splitter _splitter = new QSplitter(Qt::Vertical); _splitter->setChildrenCollapsible(false); _splitter->setHandleWidth(5); _splitter->addWidget(_mdiArea); _splitter->addWidget(ganttContainer); _splitter->addWidget(_debugConsole); centralLayout->addWidget(_splitter, 0, 0); // Restore main window setup when a session setup is loaded QObject::connect(_sessionSetupManager, SIGNAL(mainWindowSetupLoaded(MainWindowSetup)), this, SLOT(sessionMainWindowSetupLoaded(MainWindowSetup))); // Restore parameters dock setup when a session setup is loaded QObject::connect(_sessionSetupManager, SIGNAL(parametersDockSetupLoaded(ParametersDockSetup)), this, SLOT(sessionParametersDockSetupLoaded(ParametersDockSetup))); // Restore widgets windows setup when a session setup is loaded QObject::connect( _sessionSetupManager, SIGNAL( widgetWindowsSetupLoaded( QList , QList )), this, SLOT( sessionWidgetWindowsSetupLoaded( QList , QList ))); // Init UI states _displayMode = DISPLAY_MDI_NORMAL; _connected = false; _ready = false; _running = false; _debug = false; // Init main window connexion status setConnected(false); // Load previously saved configuration _configurationManager->syncConfiguration(); } MainWindow::~MainWindow() { delete _statusBarLabel; delete _statusBarIcon; delete ui; delete _taskManager; } /* -------------------------------------------------------------------------- */ /* Events */ /* -------------------------------------------------------------------------- */ void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::closeEvent(QCloseEvent *ce) { int returned = -1; if (isRunning()) { returned = QMessageBox::question( this, tr("Quit StarPU-Top ?"), tr("StarPU-Top is currently monitoring.\n") + tr( "Do you really want to stop " "monitoring and exit the application ?"), QMessageBox::Ok | QMessageBox::Cancel); } else { _configurationManager->syncConfiguration(); qDebug() << "MainWindow : exiting the application"; qApp->quit(); // Exit the application } if (returned == QMessageBox::Ok) { if (_communicationThread->isRunning()) { _communicationThread->exit(0); qDebug() << "MainWindow : stopped communication thread"; } _configurationManager->syncConfiguration(); qDebug() << "MainWindow : exiting the application"; qApp->quit(); // exit application } else { ce->ignore(); // ignore close event } } void MainWindow::openSession() { bool ok; // (Re)initialize the tasks database _taskManager->initialize(); ok = _taskManager->connectDatabase(); Q_ASSERT_X(ok == true, "MainWindow::openSession()", "Couldn't connect to the tasks database !"); // Init time references _lockedTime = 0; // Possibly clear old session widgets clearWidgets(); // Enable the MDI area _mdiArea->setEnabled(true); // Install fresh data widgets for (int i = 0; i < _dataDescriptions->count(); i++) { if (_dataDescriptions->at(i)->widget != DATA_WIDGET_NONE) { DataWidget* dataWidget = addDataWidget(_dataDescriptions->at(i)); _widgetWindowsManager->displayWidgetWindow(dataWidget); } } // Install fresh interactive widgets for (int i = 0; i < _paramDescriptions->count(); i++) { if (_paramDescriptions->at(i)->widget != INTERACTIVE_WIDGET_NONE) { InteractiveWidget* interactiveWidget = addInteractiveWidget( _paramDescriptions->at(i)); displayInteractiveWidget(interactiveWidget); } } emit sessionOpened(); } void MainWindow::closeSession() { // Clear old data/params descriptions clearDescriptions(); // Disable the MDI area _mdiArea->setEnabled(false); // Update gantt time controller _ganttTimeView->setValue(effectiveRunningTime()); // Close the preferences dialog if open if (_preferencesDialog != 0) { _preferencesDialog->close(); } // Stop the communication thread if (_communicationThread->isRunning()) { _communicationThread->exit(0); qDebug() << "MainWindow : stopped communication thread"; } QMessageBox::information( this, tr("End of the session"), tr("The session has just finished (time running : ") + QString::number(runningTime()) + "ms, time locked : " + QString::number(lockedTime()) + "ms, time effectively running : " + QString::number( effectiveRunningTime()) + "ms)", QMessageBox::Ok); emit sessionClosed(); } void MainWindow::debugLock() { qDebug() << "MainWindow : locking session"; _currentLockTime.start(); setStatusBarIcon(":/images/lock.png"); setStatusBarMessage("Locked"); emit debugLocked(); } void MainWindow::debugStep() { qDebug() << "MainWindow : unlocking session"; _lockedTime += _currentLockTime.elapsed(); _currentLockTime = QTime(); _actionDebug->setEnabled(true); setStatusBarIcon(""); setStatusBarMessage("Running"); emit debugStepped(); } void MainWindow::sessionMainWindowSetupLoaded(MainWindowSetup mainWindowSetup) { qDebug() << "MainWindow : restoring main window setup from another session"; // Load geometry if (restoreGeometry(mainWindowSetup.geometry) == false) { qDebug() << "MainWindow : failed to restore main window geometry"; } // Load display mode setDisplayMode(mainWindowSetup.displayMode); } void MainWindow::sessionParametersDockSetupLoaded( ParametersDockSetup parametersDockSetup) { qDebug() << "MainWindow : " "restoring parameters dock setup from another session"; } void MainWindow::sessionWidgetWindowsSetupLoaded( QList dataWidgetsSetup, QList dataAggregatorWidgetsSetup) { qDebug() << "MainWindow : " "restoring widget windows setup from another session"; // Restore data widgets setup for (int i = 0; i < dataWidgetsSetup.count(); i++) { DataWidget *dataWidget = dataWidgetFromDataId( dataWidgetsSetup.at(i).dataId); if (dataWidget->isInside() != dataWidgetsSetup.at(i).inside) { dataWidget->setInside(dataWidgetsSetup.at(i).inside); if (dataWidget->isInside() == true) { _widgetWindowsManager->flyingWindowToMdi(dataWidget); } else { _widgetWindowsManager->mdiToFlyingWindow(dataWidget); } } if (dataWidget->isInside() == false) { dataWidget->restoreGeometry(dataWidgetsSetup.at(i).geometry); } else { dataWidget->parentWidget()->restoreGeometry( dataWidgetsSetup.at(i).geometry); } } // Restore data aggregator widgets setup for (int i = 0; i < dataAggregatorWidgetsSetup.count(); i++) { DataAggregatorWidget *dataAggregatorWidget = addDataAggregatorWidget( dataAggregatorWidgetsSetup.at(i).dataIds); _widgetWindowsManager->displayWidgetWindow(dataAggregatorWidget); if (dataAggregatorWidget->isInside() != dataAggregatorWidgetsSetup.at(i).inside) { dataAggregatorWidget->setInside( dataAggregatorWidgetsSetup.at(i).inside); if (dataAggregatorWidget->isInside() == true) { _widgetWindowsManager->flyingWindowToMdi(dataAggregatorWidget); } else { _widgetWindowsManager->mdiToFlyingWindow(dataAggregatorWidget); } } if (dataAggregatorWidget->isInside() == false) { dataAggregatorWidget ->restoreGeometry( dataAggregatorWidgetsSetup.at(i).geometry); } else { dataAggregatorWidget->parentWidget() ->restoreGeometry( dataAggregatorWidgetsSetup.at(i).geometry); } } } void MainWindow::protocolErrorCaught(QString errorMessage) { qDebug() << "MainWindow : protocol error caught (" + errorMessage + ")"; } void MainWindow::synchronizeSessionTime(qlonglong serverTimestamp) { qDebug() << "Synchronized with server reference timestamp (" << serverTimestamp << ")"; _referenceTimestamp = serverTimestamp; if (_preGoTimer.isNull()) { _preGoTimer.start(); } else { _preGoTimer.restart(); } } void MainWindow::initClient(QString serverID, QList *dataDescriptions, QList *paramDescriptions, QList *serverDevices) { _serverID = serverID; _dataDescriptions = dataDescriptions; _paramDescriptions = paramDescriptions; _serverDevices = serverDevices; setReady(true); // Display widget choices list in preferences dialog _preferencesDialog = new PreferencesDialog(this, _configurationManager, _sessionSetupManager, 1); emit preferencesDialogCreated(_widgetsDisplayModesList->currentIndex()); _preferencesDialog->setVisible(true); } /* -------------------------------------------------------------------------- */ /* Actions */ /* -------------------------------------------------------------------------- */ void MainWindow::connectionSucceeded() { qDebug() << "MainWindow : connected to server"; setConnected(true); } void MainWindow::connectionAborted(QString message) { QMessageBox::critical(this, "StarPU-Top", message, QMessageBox::Ok); setConnected(false); } void MainWindow::disconnected() { if (isRunning()) { setRunning(false); } if (isReady()) { setReady(false); } setConnected(false); qDebug() << "MainWindow : disconnected from server"; } void MainWindow::on_actionConnect_triggered() { setStatusBarMessage("Awaiting connection..."); _actionConnect->setEnabled(false); // Initiate connection to server _communicationThread->start(/*QThread::NormalPriority*/); _communicationThread->moveToThread(_communicationThread); } void MainWindow::on_actionLaunch_StarPU_triggered() { // Tell server to launch the session setRunning(true); emit clientLaunched(); } void MainWindow::on_actionDebug_triggered(bool enabled) { _actionDebug->setEnabled(false); _actionDebug->setToolTip("Waiting for the server's acknowledgement..."); _actionDebug->setIconText("Waiting for the server's acknowledgement..."); emit debugEnabled(enabled); } void MainWindow::on_actionSaveSessionSetup_triggered() { if (_sessionSetupManager->saveSessionSetup(_serverID) == true) { qDebug() << "MainWindow : session setup successfully saved"; statusBar()->showMessage(tr("Session setup successfully saved"),3000); } else { statusBar()->showMessage(tr("Couldn't save the session setup"),3000); } } void MainWindow::on_actionQuit_triggered() { close(); // Calls CloseEvent() } void MainWindow::on_actionAddDataAggregatorWidget_triggered() { AbstractWidgetWindow *widgetWindow = (AbstractWidgetWindow*) addDataAggregatorWidget(); _widgetWindowsManager->displayWidgetWindow(widgetWindow); } void MainWindow::on_actionPreferences_triggered() { int tabindex = (_connected ? 1 : 0); // Open preferences dialog _preferencesDialog = new PreferencesDialog(this, _configurationManager, _sessionSetupManager, tabindex); _preferencesDialog->setVisible(true); emit preferencesDialogCreated(_widgetsDisplayModesList->currentIndex()); } void MainWindow::on_actionAbout_triggered() { AboutDialog *aboutDialog = new AboutDialog(this); aboutDialog->setVisible(true); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ const QSplitter *MainWindow::splitter() const { return _splitter; } const QDockWidget *MainWindow::parametersDock() const { return ui->parametersDock; } const WidgetWindowsManager* MainWindow::widgetWindowsManager() const { return _widgetWindowsManager; } const ConfigurationManager* MainWindow::configurationManager() const { return _configurationManager; } const SessionSetupManager* MainWindow::sessionSetupManager() const { return _sessionSetupManager; } const TaskManager* MainWindow::taskManager() const { return _taskManager; } const QHash *MainWindow::dataWidgetNames() const { return &_dataWidgetNames; } const QHash > *MainWindow::dataWidgetPossibilities() const { return &_dataWidgetPossibilities; } const QHash *MainWindow::interactiveWidgetNames() const { return &_interactiveWidgetNames; } const QHash > *MainWindow::interactiveWidgetPossibilities() const { return &_interactiveWidgetPossibilities; } int MainWindow::nbDataWidgets() const { return _nbDataWidgets; } int MainWindow::nbInteractiveWidgets() const { return _nbInteractiveWidgets; } int MainWindow::nbDataAggregatorWidgets() const { return _nbDataAggregatorWidgets; } QString MainWindow::serverID() const { return _serverID; } const QList *MainWindow::dataDescriptions() const { return _dataDescriptions; } const QList *MainWindow::paramDescriptions() const { return _paramDescriptions; } bool MainWindow::isConnected() const { return _connected; } bool MainWindow::isReady() const { return _ready; } bool MainWindow::isRunning() const { return _running; } bool MainWindow::isDebugEnabled() const { return _debug; } DisplayMode MainWindow::displayMode() const { return _displayMode; } int MainWindow::effectiveRunningTime() const { if (_runningTime.isNull()) { return 0; } return _runningTime.elapsed() - (_lockedTime + currentLockTime()); } int MainWindow::runningTime() const { if (_runningTime.isNull()) { return 0; } return _runningTime.elapsed(); } int MainWindow::currentLockTime() const { if (_currentLockTime.isNull()) { return 0; } return _currentLockTime.elapsed(); } int MainWindow::lockedTime() const { return _lockedTime; } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void MainWindow::setStatusBarMessage(QString message) { if (_statusBarLabel != 0) { _statusBarLabel->setText(message); } } void MainWindow::updateStatusBarMessage(QString message) { setStatusBarMessage(message); } void MainWindow::setStatusBarIcon(QString iconFile) { if (_statusBarIcon != 0) { _statusBarIcon->setPixmap(QPixmap(iconFile)); } } void MainWindow::setConnected(bool connected) { _connected = connected; if (_connected == false) { Q_ASSERT_X(_ready == false && _running == false, "MainWindow::setConnected()", "MainWindow states hierarchy violated"); _actionConnect->setEnabled(true); _actionLaunch->setEnabled(false); _actionDebug->setEnabled(false); _actionSaveSessionSetup->setEnabled(false); _actionAddDataAggregatorWidget->setEnabled(false); setStatusBarMessage(tr("Disconnected")); } else { _actionConnect->setEnabled(false); setStatusBarMessage( tr("Connected (") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); } } void MainWindow::setReady(bool ready) { _ready = ready; if (_ready == true) { Q_ASSERT_X(_connected == true, "MainWindow::setReady()", "MainWindow states hierarchy violated"); _actionLaunch->setEnabled(true); _actionDebug->setEnabled(true); _actionAddDataAggregatorWidget->setEnabled(true); setStatusBarMessage( tr("Connected and ready (") + _serverID + tr(" on ") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); openSession(); _actionSaveSessionSetup->setEnabled(true); } else { Q_ASSERT_X(_running == false, "MainWindow::setReady()", "MainWindow states hierarchy violated"); _actionConnect->setEnabled(false); _actionLaunch->setEnabled(false); _actionDebug->setEnabled(false); _actionAddDataAggregatorWidget->setEnabled(false); setStatusBarMessage( tr("Connected (") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); closeSession(); _actionSaveSessionSetup->setEnabled(false); } } void MainWindow::setRunning(bool running) { _running = running; if (running == true) { Q_ASSERT_X(_connected == true && _ready == true, "MainWindow::setRunning()", "MainWindow states hierarchy violated"); // Stop pre-running time and start running time _preGoTime = _preGoTimer.elapsed() + _referenceTimestamp; qDebug() << "Pre-Go time :" << _preGoTime; if (_runningTime.isNull()) { _runningTime.start(); } else { _runningTime.restart(); } _actionLaunch->setEnabled(false); setStatusBarMessage(tr("Running")); setWindowTitle( windowTitle() + " (" + _serverID + tr(" on ") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); } else { _actionLaunch->setEnabled(true); setStatusBarMessage( tr("Connected and ready (") + _serverID + tr(" on ") + _configurationManager->serverHost() + ":" + QString::number(_configurationManager->serverPort()) + ")"); setWindowTitle(tr("StarPU-Top")); } } void MainWindow::setDebug(bool enabled) { _debug = enabled; _actionDebug->setEnabled(true); if (_debug == true) { qDebug() << "MainWindow : enabling debug mode"; _actionDebug->setIcon(QIcon(":/images/debugoff.png")); _actionDebug->setIconText("Disable debug"); _actionDebug->setText("Disable debug"); _actionDebug->setToolTip("Disable debug"); _debugConsole->setVisible(true); } else { qDebug() << "MainWindow : disabling debug mode"; _actionDebug->setIcon(QIcon(":/images/debugon.png")); _actionDebug->setIconText("Enable debug"); _actionDebug->setText("Enable debug"); _actionDebug->setToolTip("Enable debug"); _debugConsole->setVisible(false); } } void MainWindow::setDisplayMode(DisplayMode displayMode) { _displayMode = displayMode; switch (_displayMode) { case DISPLAY_FLYING_WINDOWS: _widgetWindowsManager->mdiToFlyingWindows(); break; case DISPLAY_MDI_NORMAL: _widgetWindowsManager->flyingWindowsToMdi(); break; } } void MainWindow::setDebugMessage(QString debugMessage) { if (isDebugEnabled() == true) { _debugConsole->appendDebugLogMessage(debugMessage); } else { qDebug() << "Debug message ignored (received while not in debug mode)"; } } void MainWindow::setDebugLock(QString debugLockMessage) { if (isDebugEnabled() == true) { debugLock(); _debugConsole->appendDebugLockMessage(debugLockMessage); } else { qDebug() << "Debug lock ignored (received while not in debug mode)"; } } /* -------------------------------------------------------------------------- */ /* Other methods */ /* -------------------------------------------------------------------------- */ void MainWindow::clearDescriptions() { clearDataDescriptions(); clearParamDescriptions(); } DataWidget* MainWindow::addDataWidget(DataDescription *dataDescription) { // Create new data widget following the description bool inside = (_displayMode == DISPLAY_FLYING_WINDOWS ? false : true); DataWidget *dataWidget = new DataWidget(dataDescription, _widgetWindowsManager, this, inside); _dataWidgets->append(QPointer (dataWidget)); _nbDataWidgets++; return dataWidget; } void MainWindow::clearWidgets() { clearDataWidgets(); clearInteractiveWidgets(); } void MainWindow::clearDataWidgets() { _widgetWindowsManager->closeWidgetWindows(); _dataWidgets->clear(); } void MainWindow::removeDestroyedDataWidgets() { // Clear all null data widget pointers in the data widgets list for (int i = 0; i < _dataWidgets->count(); i++) { if (_dataWidgets->at(i).isNull()) { _dataWidgets->removeAt(i); _nbDataWidgets--; } } } void MainWindow::clearDataDescriptions() { _dataDescriptions->clear(); } InteractiveWidget *MainWindow::addInteractiveWidget( ParamDescription *paramDescription) { // Add new interactive widget following the description InteractiveWidget *interactiveWidget = new InteractiveWidget( paramDescription, this); _interactiveWidgets->append( QPointer (interactiveWidget)); _nbInteractiveWidgets++; return interactiveWidget; } DataAggregatorWidget *MainWindow::addDataAggregatorWidget(QList dataIds) { bool inside = (_displayMode == DISPLAY_FLYING_WINDOWS ? false : true); DataAggregatorWidget *dataAggregatorWidget = new DataAggregatorWidget( _widgetWindowsManager, this, inside, dataIds); _dataAggregatorWidgets->append( QPointer (dataAggregatorWidget)); _nbDataAggregatorWidgets++; return dataAggregatorWidget; } void MainWindow::displayInteractiveWidget(InteractiveWidget *interactiveWidget) { // Display interactive widget in the dock widget QVBoxLayout* layout = (QVBoxLayout*) _parametersDockScrollArea->layout(); layout->addWidget(interactiveWidget); } void MainWindow::clearInteractiveWidgets() { qDebug() << "Closing all interactive widgets"; for (int i = 0; i < _interactiveWidgets->count(); i++) { _interactiveWidgets->at(i).data()->close(); } _interactiveWidgets->clear(); } void MainWindow::removeDestroyedInteractiveWidgets() { // Clear all null data widget pointers in the data widgets list for (int i = 0; i < _interactiveWidgets->count(); i++) { if (_interactiveWidgets->at(i).isNull()) { _interactiveWidgets->removeAt(i); _paramDescriptions->at(i)->widget = INTERACTIVE_WIDGET_NONE; _nbInteractiveWidgets--; } } } void MainWindow::clearParamDescriptions() { _paramDescriptions->clear(); } void MainWindow::removeDestroyedDataAggregatorWidgets() { // Clear all null data aggregator widget pointers in list for (int i = 0; i < _dataAggregatorWidgets->count(); i++) { if (_dataAggregatorWidgets->at(i).isNull()) { _dataAggregatorWidgets->removeAt(i); _nbDataAggregatorWidgets--; } } } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ QString MainWindow::statusBarMessage() const { return _statusBarLabel->text(); } const QList > *MainWindow::dataWidgets() const { return _dataWidgets; } const QList > *MainWindow::interactiveWidgets() const { return _interactiveWidgets; } const QList > *MainWindow::dataAggregatorWidgets() const { return _dataAggregatorWidgets; } DataWidget *MainWindow::dataWidgetFromDataId(int dataId) { for (int i = 0; i < _dataWidgets->count(); i++) { if (_dataWidgets->at(i)->description()->id == dataId) return _dataWidgets->at(i); } return 0; } InteractiveWidget *MainWindow::interactiveWidgetFromParamId(int paramId) { for (int i = 0; i < _interactiveWidgets->count(); i++) { if (_interactiveWidgets->at(i)->description()->id == paramId) return _interactiveWidgets->at(i); } return 0; } DataDescription *MainWindow::dataDescriptionFromId(int dataId) { for (int i = 0; i < _dataDescriptions->count(); i++) { if (_dataDescriptions->at(i)->id == dataId) return _dataDescriptions->at(i); } return 0; } ParamDescription *MainWindow::paramDescriptionFromId(int paramId) { for (int i = 0; i < _paramDescriptions->count(); i++) { if (_paramDescriptions->at(i)->id == paramId) return _paramDescriptions->at(i); } return 0; } const QList *MainWindow::serverDevices() const { return _serverDevices; } /* -------------------------------------------------------------------------- */ /* Other methods */ /* -------------------------------------------------------------------------- */ void MainWindow::updateDataWidgetsDisplayMode(int index) { // Update the display mode setDisplayMode( (DisplayMode) _widgetsDisplayModesList->itemData(index).toInt()); } void MainWindow::updateDisplayModeIndex(int index) { // Update display mode choice index in the toolbar _widgetsDisplayModesList->setCurrentIndex(index); } void MainWindow::updateDataWidgetType(int dataId, DataWidgetType newWidget) { // Update the data widget description with type selected by user DataDescription *dataDescription = dataDescriptionFromId(dataId); if (dataDescription != 0) { DataWidgetType oldWidget = dataDescription->widget; dataDescription->widget = newWidget; qDebug() << "Data of id" << dataId << "changed widget type (old :" << oldWidget << " new:" << newWidget << ")"; DataWidget *dataWidget = dataWidgetFromDataId(dataId); if (newWidget == DATA_WIDGET_NONE && oldWidget != DATA_WIDGET_NONE) { // We have disabled this data emit dataDisabled(dataId); qDebug() << "Data of id has been" << dataId << "DISABLED"; _widgetWindowsManager->closeWidgetWindow(dataWidget); } else if (newWidget != DATA_WIDGET_NONE && oldWidget == DATA_WIDGET_NONE) { // We have enabled this data // The entire widget needs to be created _widgetWindowsManager->displayWidgetWindow( addDataWidget(dataDescriptionFromId(dataId))); emit dataEnabled(dataId); qDebug() << "Data of id has been" << dataId << "ENABLED"; } else if (newWidget != DATA_WIDGET_NONE && oldWidget != DATA_WIDGET_NONE) { // Neither disable nor enabled, just change of the widget // The widget just needs to redraw the internal data widget dataWidget->recreateInternalWidget(); } } } void MainWindow::updateInteractiveWidgetType(int paramId, InteractiveWidgetType newWidget) { ParamDescription *paramDescription = paramDescriptionFromId(paramId); if (paramDescription != 0) { InteractiveWidgetType oldWidget = paramDescription->widget; paramDescription->widget = newWidget; qDebug() << "Param of id" << paramId << "changed widget type (old :" << oldWidget << " new:" << newWidget << ")"; // The widget just needs to redraw the internal interactive widget InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( paramId); interactiveWidget->recreateInternalWidget(); } } /* -------------------------------------------------------------------------- */ /* Slots */ /* -------------------------------------------------------------------------- */ void MainWindow::updateInteractiveWidget(int interactiveWidgetId, bool value, qlonglong timestamp) { InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( interactiveWidgetId); if (interactiveWidget != 0) { qDebug() << "Updating interactive widget of id" << interactiveWidgetId << "updated with value" << value << "and timestamp" << timestamp; interactiveWidget->setValue(value); } else { qDebug() << "Trying to update inexistant interactive widget ! (id" << interactiveWidgetId << ")"; } } void MainWindow::updateInteractiveWidget(int interactiveWidgetId, int value, qlonglong timestamp) { InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( interactiveWidgetId); if (interactiveWidget != 0) { qDebug() << "Updating interactive widget of id" << interactiveWidgetId << "updated with value" << value << "and timestamp" << timestamp; interactiveWidget->setValue(value); } else { qDebug() << "Trying to update inexistant interactive widget ! (id" << interactiveWidgetId << ")"; } } void MainWindow::updateInteractiveWidget(int interactiveWidgetId, double value, qlonglong timestamp) { InteractiveWidget *interactiveWidget = interactiveWidgetFromParamId( interactiveWidgetId); if (interactiveWidget != 0) { qDebug() << "Updating interactive widget of id" << interactiveWidgetId << "updated with value" << value << "and timestamp" << timestamp; interactiveWidget->setValue(value); } else { qDebug() << "Trying to update inexistant interactive widget ! (id" << interactiveWidgetId << ")"; } } void MainWindow::updateTaskPrev(int taskId, int deviceId, qlonglong timestamp, qlonglong timestampStart, qlonglong timestampEnd) { _taskManager->addTaskPrev(taskId, deviceId, timestampStart - _preGoTime, timestampEnd - _preGoTime); } void MainWindow::updateTaskStart(int taskId, int deviceId, qlonglong timestamp) { _taskManager->addTaskStart(taskId, deviceId, timestamp - _preGoTime); } void MainWindow::updateTaskEnd(int taskId, qlonglong timestamp) { _taskManager->addTaskEnd(taskId, timestamp - _preGoTime); } void MainWindow::updateDataWidget(int dataWidgetId, bool value, qlonglong timestamp) { DataWidget *dataWidget = dataWidgetFromDataId(dataWidgetId); if (dataWidget != 0) { qDebug() << "MainWindow : updating data widget of id" << dataWidgetId << "with value" << value << "and timestamp" << timestamp; dataWidget->setValue(value); } else { qDebug() << "MainWindow : trying to update inexistant data widget ! (id" << dataWidgetId << ")"; } } void MainWindow::updateDataWidget(int dataWidgetId, int value, qlonglong timestamp) { DataWidget *dataWidget = dataWidgetFromDataId(dataWidgetId); if (dataWidget != 0) { qDebug() << "MainWindow : updating data widget of id" << dataWidgetId << "with value" << value << "and timestamp" << timestamp; dataWidget->setValue(value); } else { qDebug() << "MainWindow : trying to update inexistant data widget ! (id" << dataWidgetId << ")"; } } void MainWindow::updateDataWidget(int dataWidgetId, double value, qlonglong timestamp) { DataWidget *dataWidget = dataWidgetFromDataId(dataWidgetId); if (dataWidget != 0) { qDebug() << "MainWindow : updating data widget of id" << dataWidgetId << "with value" << value << "and timestamp" << timestamp; dataWidget->setValue(value); } else { qDebug() << "MainWindow : trying to update inexistant data widget ! (id" << dataWidgetId << ")"; } } void MainWindow::interactiveWidgetUpdated(int interactiveWidgetId, bool value) { qDebug() << "MainWindow : interactive widget of id" << interactiveWidgetId << "updated with value" << value; emit paramValueUpdated(interactiveWidgetId, value); } void MainWindow::interactiveWidgetUpdated(int interactiveWidgetId, int value) { qDebug() << "MainWindow : interactive widget of id" << interactiveWidgetId << "updated with value" << value; emit paramValueUpdated(interactiveWidgetId, value); } void MainWindow::interactiveWidgetUpdated(int interactiveWidgetId, double value) { qDebug() << "MainWindow : interactive widget of id" << interactiveWidgetId << "updated with value" << value; emit paramValueUpdated(interactiveWidgetId, value); } void MainWindow::initDataWidgetLists() { //Names _dataWidgetNames.insert(DATA_WIDGET_LCD, tr("Lcd")); _dataWidgetNames.insert(DATA_WIDGET_PLOT, tr("Plot")); _dataWidgetNames.insert(DATA_WIDGET_LEVEL, tr("Level")); _dataWidgetNames.insert(DATA_WIDGET_LED, tr("Led")); _dataWidgetNames.insert(DATA_WIDGET_DIAL, tr("Dial")); _dataWidgetNames.insert(DATA_WIDGET_NONE, tr("")); // Sets of widgets for each type // Bool _dataBoolWidgets.insert(DATA_WIDGET_LED); // Int _dataIntWidgets.insert(DATA_WIDGET_LCD); _dataIntWidgets.insert(DATA_WIDGET_PLOT); _dataIntWidgets.insert(DATA_WIDGET_LEVEL); _dataIntWidgets.insert(DATA_WIDGET_DIAL); // Float _dataFloatWidgets.insert(DATA_WIDGET_LCD); _dataFloatWidgets.insert(DATA_WIDGET_PLOT); _dataFloatWidgets.insert(DATA_WIDGET_LEVEL); _dataFloatWidgets.insert(DATA_WIDGET_DIAL); // Associate a type to widget possibilities _dataWidgetPossibilities.insert(DATA_TYPE_BOOL, _dataBoolWidgets); _dataWidgetPossibilities.insert(DATA_TYPE_INT, _dataIntWidgets); _dataWidgetPossibilities.insert(DATA_TYPE_FLOAT, _dataFloatWidgets); } void MainWindow::initInteractiveWidgetLists() { _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_SLIDER, tr("Slider")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_KNOB, tr("Knob")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_WHEEL, tr("Wheel")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_CHECKBOX, tr("Checkbox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_SPINBOX, tr("Spinbox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_DOUBLESPINBOX, tr("Double Spinbox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_DIAL, tr("Dial")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_COMBOBOX, tr("Combobox")); _interactiveWidgetNames.insert(INTERACTIVE_WIDGET_NONE, tr("")); // Sets of widgets for each type // Bool _paramBoolWidgets.insert(INTERACTIVE_WIDGET_CHECKBOX); // Int _paramIntWidgets.insert(INTERACTIVE_WIDGET_SLIDER); _paramIntWidgets.insert(INTERACTIVE_WIDGET_KNOB); _paramIntWidgets.insert(INTERACTIVE_WIDGET_WHEEL); _paramIntWidgets.insert(INTERACTIVE_WIDGET_SPINBOX); _paramIntWidgets.insert(INTERACTIVE_WIDGET_DIAL); // Float _paramFloatWidgets.insert(INTERACTIVE_WIDGET_SLIDER); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_KNOB); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_WHEEL); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_DOUBLESPINBOX); _paramFloatWidgets.insert(INTERACTIVE_WIDGET_DIAL); // Enum _paramEnumWidgets.insert(INTERACTIVE_WIDGET_COMBOBOX); // Associate a type to widget possibilities _interactiveWidgetPossibilities.insert(PARAM_TYPE_BOOL, _paramBoolWidgets); _interactiveWidgetPossibilities.insert(PARAM_TYPE_INT, _paramIntWidgets); _interactiveWidgetPossibilities.insert(PARAM_TYPE_FLOAT, _paramFloatWidgets); _interactiveWidgetPossibilities.insert(PARAM_TYPE_ENUM, _paramEnumWidgets); } starpu-1.1.5/starpu-top/StarPU-Top-qwt-embed.pri0000644000373600000000000000612312571536666016424 00000000000000SRCDIR=../../starpu-top SOURCES += \ $$SRCDIR/qwt/qwt_thermo.cpp \ $$SRCDIR/qwt/qwt_math.cpp \ $$SRCDIR/qwt/qwt_scale_engine.cpp \ $$SRCDIR/qwt/qwt_scale_draw.cpp \ $$SRCDIR/qwt/qwt_scale_map.cpp \ $$SRCDIR/qwt/qwt_scale_div.cpp \ $$SRCDIR/qwt/qwt_painter.cpp \ $$SRCDIR/qwt/qwt_abstract_scale.cpp \ $$SRCDIR/qwt/qwt_abstract_scale_draw.cpp \ $$SRCDIR/qwt/qwt_interval.cpp \ $$SRCDIR/qwt/qwt_text.cpp \ $$SRCDIR/qwt/qwt_text_engine.cpp \ $$SRCDIR/qwt/qwt_clipper.cpp \ $$SRCDIR/qwt/qwt_color_map.cpp \ $$SRCDIR/qwt/qwt_plot.cpp \ $$SRCDIR/qwt/qwt_plot_dict.cpp \ $$SRCDIR/qwt/qwt_plot_layout.cpp \ $$SRCDIR/qwt/qwt_scale_widget.cpp \ $$SRCDIR/qwt/qwt_text_label.cpp \ $$SRCDIR/qwt/qwt_legend.cpp \ $$SRCDIR/qwt/qwt_dyngrid_layout.cpp \ $$SRCDIR/qwt/qwt_plot_canvas.cpp \ $$SRCDIR/qwt/qwt_plot_item.cpp \ $$SRCDIR/qwt/qwt_legend_item.cpp \ $$SRCDIR/qwt/qwt_symbol.cpp \ $$SRCDIR/qwt/qwt_plot_axis.cpp \ $$SRCDIR/qwt/qwt_plot_xml.cpp \ $$SRCDIR/qwt/qwt_knob.cpp \ $$SRCDIR/qwt/qwt_abstract_slider.cpp \ $$SRCDIR/qwt/qwt_round_scale_draw.cpp \ $$SRCDIR/qwt/qwt_double_range.cpp \ $$SRCDIR/qwt/qwt_wheel.cpp \ $$SRCDIR/qwt/qwt_slider.cpp \ $$SRCDIR/qwt/qwt_plot_curve.cpp \ $$SRCDIR/qwt/qwt_plot_seriesitem.cpp \ $$SRCDIR/qwt/qwt_series_data.cpp \ $$SRCDIR/qwt/qwt_point_polar.cpp \ $$SRCDIR/qwt/qwt_curve_fitter.cpp \ $$SRCDIR/qwt/qwt_spline.cpp \ $$SRCDIR/qwt/qwt_dial.cpp \ $$SRCDIR/qwt/qwt_dial_needle.cpp HEADERS += \ $$SRCDIR/qwt/qwt_thermo.h \ $$SRCDIR/qwt/qwt_math.h \ $$SRCDIR/qwt/qwt_scale_engine.h \ $$SRCDIR/qwt/qwt_scale_draw.h \ $$SRCDIR/qwt/qwt_scale_map.h \ $$SRCDIR/qwt/qwt_scale_div.h \ $$SRCDIR/qwt/qwt_painter.h \ $$SRCDIR/qwt/qwt_global.h \ $$SRCDIR/qwt/qwt_abstract_scale.h \ $$SRCDIR/qwt/qwt_abstract_scale_draw.h \ $$SRCDIR/qwt/qwt_interval.h \ $$SRCDIR/qwt/qwt_text.h \ $$SRCDIR/qwt/qwt_text_engine.h \ $$SRCDIR/qwt/qwt_clipper.h \ $$SRCDIR/qwt/qwt_color_map.h \ $$SRCDIR/qwt/qwt_plot.h \ $$SRCDIR/qwt/qwt_plot_dict.h \ $$SRCDIR/qwt/qwt_plot_layout.h \ $$SRCDIR/qwt/qwt_scale_widget.h \ $$SRCDIR/qwt/qwt_text_label.h \ $$SRCDIR/qwt/qwt_legend.h \ $$SRCDIR/qwt/qwt_dyngrid_layout.h \ $$SRCDIR/qwt/qwt_plot_canvas.h \ $$SRCDIR/qwt/qwt_plot_item.h \ $$SRCDIR/qwt/qwt_legend_itemmanager.h \ $$SRCDIR/qwt/qwt_legend_item.h \ $$SRCDIR/qwt/qwt_symbol.h \ $$SRCDIR/qwt/qwt_knob.h \ $$SRCDIR/qwt/qwt_abstract_slider.h \ $$SRCDIR/qwt/qwt_round_scale_draw.h \ $$SRCDIR/qwt/qwt_double_range.h \ $$SRCDIR/qwt/qwt_wheel.h \ $$SRCDIR/qwt/qwt_slider.h \ $$SRCDIR/qwt/qwt_plot_curve.h \ $$SRCDIR/qwt/qwt_plot_seriesitem.h \ $$SRCDIR/qwt/qwt_series_data.h \ $$SRCDIR/qwt/qwt_point_polar.h \ $$SRCDIR/qwt/qwt_curve_fitter.h \ $$SRCDIR/qwt/qwt_spline.h \ $$SRCDIR/qwt/qwt_dial.h \ $$SRCDIR/qwt/qwt_dial_needle.h INCLUDEPATH += $$SRCDIR/qwt starpu-1.1.5/starpu-top/abstractwidgetwindow.cpp0000644000373600000000000001130212571536560017036 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "abstractwidgetwindow.h" #include "widgetwindowsmanager.h" #include "mainwindow.h" #include AbstractWidgetWindow::AbstractWidgetWindow( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside) : QWidget(mainWindow) { _widgetWindowsManager = widgetWindowsManager; _mainWindow = mainWindow; _inside = inside; // Init id _windowId = generateWindowId(); // Init GUI _sizeGrip = new QSizeGrip(this); _sizeGrip->move(width()-32,height()-32); _sizeGrip->resize(32,32); _inOutButton = new QToolButton(); QObject::connect(_inOutButton, SIGNAL(clicked()), this, SLOT(on_inOutButton_clicked())); _inside ? _inOutButton->setToolTip(tr("To flying window")) : _inOutButton->setToolTip(tr("To MDI")); _inside ? _inOutButton->setIcon(QIcon(":/images/outside.png")) : _inOutButton->setIcon(QIcon(":/images/inside.png")); // Set attributes setAttribute(Qt::WA_DeleteOnClose); } AbstractWidgetWindow::~AbstractWidgetWindow() { delete _sizeGrip; delete _inOutButton; } /* -------------------------------------------------------------------------- */ /* Events */ /* -------------------------------------------------------------------------- */ void AbstractWidgetWindow::mousePressEvent(QMouseEvent *event) { if ((isInside() == false) && (event->button() == Qt::LeftButton)) { dragPosition = event->globalPos() - frameGeometry().topLeft(); event->accept(); } } void AbstractWidgetWindow::mouseMoveEvent(QMouseEvent *event) { if ((isInside() == false) && (event->buttons() & Qt::LeftButton)) { move(event->globalPos() - dragPosition); event->accept(); } } void AbstractWidgetWindow::resizeEvent(QResizeEvent *event) { _sizeGrip->move(width()-32,height()-32); _sizeGrip->resize(32,32); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ int AbstractWidgetWindow::windowId() const { return _windowId; } bool AbstractWidgetWindow::isInside() const { return _inside; } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void AbstractWidgetWindow::setInside(bool inside) { _inside = inside; if(isInside() == false) { _inOutButton->setToolTip(tr("To MDI")); _inOutButton->setIcon(QIcon(":/images/inside.png")); } else { _inOutButton->setToolTip(tr("To flying window")); _inOutButton->setIcon(QIcon(":/images/outside.png")); } } /* -------------------------------------------------------------------------- */ /* GUI interactions */ /* -------------------------------------------------------------------------- */ void AbstractWidgetWindow::on_inOutButton_clicked() { setInside(!isInside()); if(_inside) { _widgetWindowsManager->flyingWindowToMdi(this); } else { _widgetWindowsManager->mdiToFlyingWindow(this); } } /* -------------------------------------------------------------------------- */ /* Window ID generation */ /* -------------------------------------------------------------------------- */ int AbstractWidgetWindow::generateWindowId() { static int windowId = 0; return windowId++; } starpu-1.1.5/starpu-top/ganttwidget.h0000644000373600000000000000557312571536557014610 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef GANTTWIDGET_H #define GANTTWIDGET_H class MainWindow; class TaskManager; #include #include #include "starpu_top_types.h" class GanttWidget : public QGLWidget { Q_OBJECT public: explicit GanttWidget( MainWindow *mainWindow, TaskManager *taskManager); ~GanttWidget(); public slots: void updateZoom(double value); void updatePrevLine(double value); void updateTimeView(int time); void connected(); void disconnected(); void ganttLocked(); void ganttUnlocked(); protected: void paintEvent(QPaintEvent *event); void paint(QPainter *painter, QPaintEvent *event); void drawPUs(QPainter *painter); void drawTime(QPainter *painter); void drawProgram(QPainter *painter); void resizeGL (int width,int height); void drawWorkPU(QPainter *painter, starpu_top_task t); void drawIdlePU(QPainter *painter); void drawPrevWorkPU(QPainter *painter, starpu_top_task t); void defaultScreen(QPainter *painter); void drawPresentLine(QPainter *painter); int computeTimeInterval(int timeTotal); qreal coordxForTime(qlonglong timestamp_ms); void drawFromTime(QPainter *painter, qlonglong timestamp); void countPUs(); private: MainWindow *_mainWindow; TaskManager *_taskManager; QBrush _background; QFont _textFont; QPen _textPen; QRectF _rectTime; QRectF _rectProg; QRectF _rectCPUblock; QRectF _rectGPUblock; QRectF *_rectPUs; QRectF _linePresent; qreal _coordxPresentLine; int _numPUs; bool _wasRunning; QList _tasks; int _timeTotal; int _timeAfter; int _timeBefore; double _lastValPrevLine; QTimer *_timer; qlonglong _timePresent; qlonglong _timeToShow; starpu_top_device *_PUsByDevice; starpu_top_device *_PUsByPos; int _numCPUs; int _numGPUs; bool _initCompleted; int _heightPU; // Height of each CPU or GPU rectangles }; #endif // GANTTWIDGET_H starpu-1.1.5/starpu-top/StarPU-Top.pro.user0000644000373600000000000001760712571536560015526 00000000000000 ProjectExplorer.Project.ActiveTarget 0 ProjectExplorer.Project.EditorSettings UTF-8 ProjectExplorer.Project.Target.0 Bureau Qt4ProjectManager.Target.DesktopTarget 0 0 qmake QtProjectManager.QMakeBuildStep Make Qt4ProjectManager.MakeStep false 2 Make Qt4ProjectManager.MakeStep true clean 1 false Déboguer Qt4ProjectManager.Qt4BuildConfiguration 2 C:/Users/Will/Documents/My Dropbox/Projets/Projets partagés/StarPU-Top-build-desktop 14 2 true qmake QtProjectManager.QMakeBuildStep Make Qt4ProjectManager.MakeStep false 2 Make Qt4ProjectManager.MakeStep true clean 1 false Release Qt4ProjectManager.Qt4BuildConfiguration 0 C:/Users/Will/Documents/My Dropbox/Projets/Projets partagés/StarPU-Top-build-desktop 14 2 true 2 StarPU-Top Qt4ProjectManager.Qt4RunConfiguration 2 StarPU-Top.pro false false false false 1 ProjectExplorer.Project.TargetCount 1 ProjectExplorer.Project.Updater.FileVersion 4 starpu-1.1.5/starpu-top/interactivewidget.h0000644000373600000000000000536712571536557016011 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef INTERACTIVEWIDGET_H #define INTERACTIVEWIDGET_H #include #include #include #include #include "starpu_top_types.h" class MainWindow; class InteractiveWidget: public QWidget { /* Widget which represents a single parameter on the server and which takes place in the parameters dock of the main window. Can display the parameter under different forms defined in the interactive widget specifications. The internal widget can be changed at any time. */ Q_OBJECT public: explicit InteractiveWidget(ParamDescription *paramDescription, MainWindow *mainWindow); ~InteractiveWidget(); // Getters ParamDescription *description() const; QSize minimumInternalWidgetSize() const; private: // Events void closeEvent(QCloseEvent *ce); // UI components MainWindow *_mainWindow; QLabel *_label; QWidget *_internalWidget; QHBoxLayout *_layout; // Data ParamDescription *_paramDescription; const QHash *_interactiveWidgetNames; QList _interactiveWidgetPossibilities; // Create the internal widget void createInternalWidget(); /** SLOTS **/ public slots: // Setters void setValue(bool value); void setValue(int value); void setValue(double value); // Other methods void recreateInternalWidget(); private slots: // Other methods void sliderValueChanged(); void wheelValueChanged(); void knobValueChanged(); void dialValueChanged(); void notifyValueChanged(bool value); void notifyValueChanged(int value); void notifyValueChanged(double value); void widgetTypeChanged(); void updateAction(InteractiveWidgetType newWidget); signals: void paramValueChanged(int id, bool value); void paramValueChanged(int id, int value); void paramValueChanged(int id, double value); }; #endif // INTERACTIVEWIDGET_H starpu-1.1.5/starpu-top/communicationthread.h0000644000373600000000000000364512571536557016322 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMMUNICATIONTHREAD_H #define COMMUNICATIONTHREAD_H class MainWindow; class ConfigurationManager; class CommunicationManager; #include #include #include class CommunicationThread : public QThread { Q_OBJECT public: CommunicationThread( MainWindow *mainWindow, ConfigurationManager *configurationManager); ~CommunicationThread(); // Thread execution loop void run(); private: // Linked components MainWindow *_mainWindow; ConfigurationManager *_configurationManager; CommunicationManager *_communicationManager; QProcess * _SSHProcess; int _connectionAttemptsCount; void createNewCommunicationManager(void); private slots: void connectionError(QAbstractSocket::SocketError error); void connectionSucceeded(); void connectionDisconnected(); signals: void SocketError(QAbstractSocket::SocketError); void progress(QString message); void abort(QString message); void disconnected(); }; #endif // COMMUNICATIONTHREAD_H starpu-1.1.5/starpu-top/starpu_top_types.h0000644000373600000000000002050312571536557015701 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef STARPU_TOP_TYPES_H #define STARPU_TOP_TYPES_H #include #include #include /* -------------------------------------------------------------------------- */ /* Display modes */ /* -------------------------------------------------------------------------- */ enum DisplayMode { DISPLAY_FLYING_WINDOWS = 0, DISPLAY_MDI_NORMAL = 1, }; /* -------------------------------------------------------------------------- */ /* Widgets */ /* -------------------------------------------------------------------------- */ // Types enum DataWidgetType { // Data widgets /** You must pass any modification to the following functions : MainWindow::initDataWidgetLists(), DataWidget::DataWidget(), DataWidget::updateValue() **/ DATA_WIDGET_NONE = -1, DATA_WIDGET_LCD = 0, DATA_WIDGET_PLOT = 1, DATA_WIDGET_LEVEL = 2, DATA_WIDGET_LED = 3, DATA_WIDGET_DIAL = 4, }; enum InteractiveWidgetType { // Interactive widgets /** You must pass any modification to the following functions : MainWindow::initInteractiveWidgetLists(), InteractiveWidget::InteractiveWidget() **/ INTERACTIVE_WIDGET_NONE = -1, INTERACTIVE_WIDGET_SLIDER = 0, INTERACTIVE_WIDGET_KNOB = 1, INTERACTIVE_WIDGET_WHEEL = 2, INTERACTIVE_WIDGET_CHECKBOX = 3, INTERACTIVE_WIDGET_SPINBOX = 4, INTERACTIVE_WIDGET_DOUBLESPINBOX = 5, INTERACTIVE_WIDGET_DIAL = 6, INTERACTIVE_WIDGET_COMBOBOX = 7, }; static const DataWidgetType DEFAULT_DATA_WIDGET_BOOL = DATA_WIDGET_LED; static const DataWidgetType DEFAULT_DATA_WIDGET_INT = DATA_WIDGET_LCD; static const DataWidgetType DEFAULT_DATA_WIDGET_FLOAT = DATA_WIDGET_LCD; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_BOOL = INTERACTIVE_WIDGET_CHECKBOX; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_INT = INTERACTIVE_WIDGET_SPINBOX; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_FLOAT = INTERACTIVE_WIDGET_DOUBLESPINBOX; static const InteractiveWidgetType DEFAULT_INTERACTIVE_WIDGET_ENUM = INTERACTIVE_WIDGET_COMBOBOX; enum DataType { // Data /** If types were to be added the following functions should be updated : PreferencesDialog::initDataWidgetLists() **/ DATA_TYPE_BOOL = 0, DATA_TYPE_INT = 1, DATA_TYPE_FLOAT = 2, }; enum ParamType { // Params /** If types were to be added the following functions should be updated : PreferencesDialog::initInteractiveWidgetLists() **/ PARAM_TYPE_BOOL = 0, PARAM_TYPE_INT = 1, PARAM_TYPE_FLOAT = 2, PARAM_TYPE_ENUM = 4, }; enum starpu_top_device_type { SERVERDEVICE_CPU = 0, SERVERDEVICE_CUDA = 1, SERVERDEVICE_OPENCL = 2 }; // Server devices typedef struct { int id; starpu_top_device_type type; QString name; } starpu_top_device; // Server tasks typedef struct { int taskId; int deviceId; qlonglong timestampStart; qlonglong timestampEnd; } starpu_top_task; // Descriptions typedef struct { // Certain fields must be ignored depending on type int id; QString descriptionString; DataWidgetType widget; DataType type; double valMax; double valMin; } DataDescription; typedef struct { // Certain fields must be ignored depending on type int id; QString descriptionString; InteractiveWidgetType widget; ParamType type; bool valInitBool; int valInitInt; double valInitDouble; int valInitEnum; double valMax; double valMin; QStringList enumValues; } ParamDescription; /* --------------------------------------------------------------------------- */ /* Widget lists items data */ /* --------------------------------------------------------------------------- */ typedef struct { int id; DataWidgetType widget; } DataWidgetListItemData; typedef struct { int id; InteractiveWidgetType widget; } InteractiveWidgetListItemData; /* --------------------------------------------------------------------------- */ /* Plot curves data */ /* --------------------------------------------------------------------------- */ typedef struct { QVector *xData; QVector *yData; } CurveData; /* --------------------------------------------------------------------------- */ /* Communication Manager states */ /* --------------------------------------------------------------------------- */ enum CommunicationState { COM_STATE_INIT = 0, COM_STATE_INIT_SERVERINFO = 1, COM_STATE_INIT_DATA = 2, COM_STATE_INIT_PARAMS = 3, COM_STATE_INIT_DEV = 4, COM_STATE_READY = 8, COM_STATE_LOOP = 10, }; /* --------------------------------------------------------------------------- */ /* Communication protocol messages */ /* --------------------------------------------------------------------------- */ enum CommunicationInMessageType { /* Complete commands */ COM_MSG_IN_TYPE_BOOL = 0, COM_MSG_IN_TYPE_INT = 1, COM_MSG_IN_TYPE_FLOAT = 2, COM_MSG_IN_TYPE_ENUM = 3, COM_MSG_IN_SERVERINFO_BEGIN = 5, COM_MSG_IN_SERVERINFO_END = 6, COM_MSG_IN_DATA_BEGIN = 10, COM_MSG_IN_DATA_END = 11, COM_MSG_IN_PARAMS_BEGIN = 20, COM_MSG_IN_PARAMS_END = 21, COM_MSG_IN_DEV_BEGIN = 30, COM_MSG_IN_DEV_END = 31, COM_MSG_IN_DEV_CPU = 32, COM_MSG_IN_DEV_CUDA = 33, COM_MSG_IN_DEV_OPENCL = 34, COM_MSG_IN_READY = 40, COM_MSG_IN_SET = 50, COM_MSG_IN_PREV = 60, COM_MSG_IN_START = 61, COM_MSG_IN_END = 62, COM_MSG_IN_UPDATE = 70, COM_MSG_IN_DEBUG = 80, COM_MSG_IN_DEBUG_ON = 81, COM_MSG_IN_DEBUG_OFF = 82, COM_MSG_IN_DEBUG_MESSAGE = 83, COM_MSG_IN_DEBUG_LOCK = 84, /* Shortened commands */ COM_MSG_IN_SHORT_UPDATE = 100, COM_MSG_IN_SHORT_PREV = 110, COM_MSG_IN_SHORT_START = 111, COM_MSG_IN_SHORT_END = 112, }; enum CommunicationOutMessageType { /* Complete commands */ COM_MSG_OUT_GO = 0, COM_MSG_OUT_ENABLE = 10, COM_MSG_OUT_DISABLE = 11, COM_MSG_OUT_SET = 20, COM_MSG_OUT_DEBUG = 30, COM_MSG_OUT_DEBUG_ON = 31, COM_MSG_OUT_DEBUG_OFF = 32, COM_MSG_OUT_DEBUG_STEP = 33, }; /* --------------------------------------------------------------------------- */ /* Session setup data for loading session setups */ /* --------------------------------------------------------------------------- */ typedef struct { int id; DataType type; DataWidgetType widget; } DataDescriptionSetup; typedef struct { int id; ParamType type; InteractiveWidgetType widget; } ParamDescriptionSetup; typedef struct { QByteArray geometry; DisplayMode displayMode; } MainWindowSetup; typedef struct { bool floating; QByteArray geometry; } ParametersDockSetup; typedef struct { bool inside; QByteArray geometry; int dataId; } DataWidgetSetup; typedef struct { bool inside; QByteArray geometry; QList dataIds; } DataAggregatorWidgetSetup; #endif // STARPU_TOP_TYPES_H starpu-1.1.5/starpu-top/preferencesdialog.cpp0000644000373600000000000004275212571536555016301 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "preferencesdialog.h" #include "ui_preferencesdialog.h" #include "mainwindow.h" #include "configurationmanager.h" #include "sessionsetupmanager.h" #include #include #include const QString DEFAULT_SESSION_SETUP_NAME = ""; PreferencesDialog::PreferencesDialog(MainWindow *mainWindow, ConfigurationManager *configurationManager, SessionSetupManager *sessionSetupManger, int activeTab) : QDialog(mainWindow), ui(new Ui::PreferencesDialog) { ui->setupUi(this); _mainWindow = mainWindow; _configurationManager = configurationManager; _sessionSetupManager = sessionSetupManger; _dataWidgetNames = _mainWindow->dataWidgetNames(); _dataWidgetPossibilities = _mainWindow->dataWidgetPossibilities(); _interactiveWidgetNames = _mainWindow->interactiveWidgetNames(); _interactiveWidgetPossibilities = _mainWindow->interactiveWidgetPossibilities(); ui->ipEdit->setText(_configurationManager->serverHost()); ui->portEdit->setValue(_configurationManager->serverPort()); ui->commandEdit->setText(_configurationManager->commandLine()); ui->connectionSSHGroupBox->setChecked(_configurationManager); ui->antialiasingCheckBox->setChecked(_configurationManager->antialiasing()); ui->displayModeComboBox->addItem(tr("Flying windows"), DISPLAY_FLYING_WINDOWS); ui->displayModeComboBox->addItem(tr("MDI, normal"), DISPLAY_MDI_NORMAL); ui->preferencesTab->setCurrentIndex(activeTab); // Synchronize display mode indexes with the main window's toolbar QObject::connect(_mainWindow, SIGNAL(preferencesDialogCreated(int)), this, SLOT(updateDisplayModeIndex(int))); QObject::connect(ui->displayModeComboBox, SIGNAL(currentIndexChanged(int)), _mainWindow, SLOT(updateDisplayModeIndex(int))); // Synchronize descriptions setup when session setup is loaded QObject::connect( _mainWindow->sessionSetupManager(), SIGNAL( descriptionsSetupLoaded(QList , QList )), this, SLOT( sessionDescriptionsSetupLoaded( QList , QList ))); // Synchronize main window setup when session setup is loaded QObject::connect(_mainWindow->sessionSetupManager(), SIGNAL(mainWindowSetupLoaded(MainWindowSetup)), this, SLOT(sessionMainWindowSetupLoaded(MainWindowSetup))); if (_mainWindow->isConnected()) { ui->connectionServerGroupBox->setEnabled(false); } if (_mainWindow->isReady() == false) { ui->displayWidgetsGroupBox->setEnabled(false); } displayWidgetPreferences(); displaySessionSetupsList(); } PreferencesDialog::~PreferencesDialog() { delete ui; } void PreferencesDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void PreferencesDialog::closeEvent(QCloseEvent *ce) { _configurationManager->setServerHost(ui->ipEdit->text()); _configurationManager->setServerPort(ui->portEdit->value()); _configurationManager->setCommandLine(ui->commandEdit->text()); _configurationManager->setAntialiasing( ui->antialiasingCheckBox->isChecked()); _configurationManager->setSSH(ui->connectionSSHGroupBox->isChecked()); ce->accept(); } void PreferencesDialog::displayWidgetPreferences() { // Read data descriptions for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++) { DataDescription *dataDescription = _mainWindow->dataDescriptions()->at( i); // Init UI QGridLayout *layout = (QGridLayout*) ui->dataWidgetsGroupBox->layout(); layout->addWidget(new QLabel(dataDescription->descriptionString), i, 0, Qt::AlignHCenter); QComboBox *dataWidgetList = new QComboBox(); dataWidgetList->setMinimumWidth(100); // Init list int dataId = dataDescription->id; DataType dataType = dataDescription->type; DataWidgetListItemData dataStruct; dataStruct.id = dataId; QVariant data; QList < DataWidgetType > dataWidgetPossibilities = _dataWidgetPossibilities->value(dataType).values(); int currentDataWidgetIndex; for (int j = 0; j < dataWidgetPossibilities.count(); j++) { DataWidgetType widget = dataWidgetPossibilities.at(j); if (widget == dataDescription->widget) { currentDataWidgetIndex = j; } dataStruct.widget = widget; data.setValue(dataStruct); dataWidgetList->addItem(_dataWidgetNames->value(widget), data); } // Last item : MUST be DATA_WIDGET_NONE dataStruct.widget = DATA_WIDGET_NONE; data.setValue(dataStruct); dataWidgetList->addItem( _dataWidgetNames->value(DATA_WIDGET_NONE), data); // Init index if (dataDescription->widget == DATA_WIDGET_NONE) { // NONE is the last item dataWidgetList->setCurrentIndex(dataWidgetList->count() - 1); } else { dataWidgetList->setCurrentIndex(currentDataWidgetIndex); } QObject::connect(dataWidgetList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDataWidgetType(int))); _dataWidgetListComboBoxes.append(dataWidgetList); layout->addWidget(dataWidgetList, i, 1, Qt::AlignHCenter); } // Param descriptions for (int i = 0; i < _mainWindow->paramDescriptions()->count(); i++) { ParamDescription *paramDescription = _mainWindow->paramDescriptions()->at(i); QGridLayout *layout = (QGridLayout*) ui->interactiveWidgetsGroupBox->layout(); layout->addWidget(new QLabel(paramDescription->descriptionString), i, 0, Qt::AlignHCenter); QComboBox *interactiveWidgetList = new QComboBox(); interactiveWidgetList->setMinimumWidth(100); // Init list int paramId = paramDescription->id; ParamType paramType = paramDescription->type; InteractiveWidgetListItemData dataStruct; dataStruct.id = paramId; QVariant data; QList < InteractiveWidgetType > interactiveWidgetPossibilities = _interactiveWidgetPossibilities->value(paramType).values(); int currentInteractiveWidgetIndex; for (int j = 0; j < interactiveWidgetPossibilities.count(); j++) { InteractiveWidgetType widget = interactiveWidgetPossibilities.at(j); if (widget == paramDescription->widget) { currentInteractiveWidgetIndex = j; } dataStruct.widget = widget; data.setValue(dataStruct); interactiveWidgetList->addItem( _interactiveWidgetNames->value(widget), data); } // Init index interactiveWidgetList->setCurrentIndex(currentInteractiveWidgetIndex); QObject::connect(interactiveWidgetList, SIGNAL(currentIndexChanged(int)), this, SLOT(updateInteractiveWidgetType(int))); _interactiveWidgetListComboBoxes.append(interactiveWidgetList); layout->addWidget(interactiveWidgetList, i, 1, Qt::AlignHCenter); } } void PreferencesDialog::displaySessionSetupsList() { // Default session setup must be the first index ui->loadSessionSetupComboBox->addItem(DEFAULT_SESSION_SETUP_NAME); QDir sessionSetupsDir = QDir(SESSION_SETUPS_DIR); QStringList filter; filter << "*" + SESSION_SETUPS_FILEEXT; sessionSetupsDir.setNameFilters(filter); sessionSetupsDir.setSorting(QDir::Time); QStringList sessionSetupFiles = sessionSetupsDir.entryList(); QStringList sessionSetupNames; for (int i = 0; i < sessionSetupFiles.count(); i++) { QString sessionSetupFile = sessionSetupFiles.at(i); QString sessionSetupName = sessionSetupFile; sessionSetupName.chop(SESSION_SETUPS_FILEEXT.size()); sessionSetupNames.append(sessionSetupName); } ui->loadSessionSetupComboBox->addItems(sessionSetupNames); ui->loadSessionSetupComboBox->setCurrentIndex(0); QObject::connect(ui->loadSessionSetupComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(loadSessionSetup(QString))); } void PreferencesDialog::updateDisplayModeIndex(int index) { ui->displayModeComboBox->setCurrentIndex(index); } void PreferencesDialog::updateDataWidgetType(int index) { QComboBox *dataWidgetList = (QComboBox*) QObject::sender(); QVariant data = dataWidgetList->itemData(index, Qt::UserRole); DataWidgetListItemData dataStruct; Q_ASSERT_X(data.canConvert () == true, "PreferencesDialog::updateDataWidgetType()", "Data extraction from QVariant failed !"); dataStruct = data.value (); int dataId = dataStruct.id; DataWidgetType newWidget = dataStruct.widget; _mainWindow->updateDataWidgetType(dataId, newWidget); } void PreferencesDialog::updateInteractiveWidgetType(int index) { QComboBox *interactiveWidgetList = (QComboBox*) QObject::sender(); QVariant data = interactiveWidgetList->itemData(index, Qt::UserRole); InteractiveWidgetListItemData dataStruct; Q_ASSERT_X(data.canConvert () == true, "PreferencesDialog::updateInteractiveWidgetType()", "Data extraction from QVariant failed !"); dataStruct = data.value (); int paramId = dataStruct.id; InteractiveWidgetType newWidget = dataStruct.widget; _mainWindow->updateInteractiveWidgetType(paramId, newWidget); } void PreferencesDialog::loadSessionSetup(QString sessionSetupName) { if (sessionSetupName.compare(DEFAULT_SESSION_SETUP_NAME) == 0) { qDebug() << "PreferencesDialog : loading default session setup"; // Load default data widgets loadDefaultDataWidgets(); // Load default interactive widgets loadDefaultInteractiveWidgets(); } else { qDebug() << "PreferencesDialog : loading session setup" << sessionSetupName; if (_sessionSetupManager->loadSessionSetup(sessionSetupName) == true) { qDebug() << "PreferencesDialog : loaded session setup successfully"; } else { QMessageBox::warning(this, tr("StarPU-Top"), tr("Couldn't load the session setup !"), QMessageBox::Ok); QComboBox *comboBox = (QComboBox*) QObject::sender(); int indexToRemove = comboBox->currentIndex(); comboBox->setCurrentIndex(0); comboBox->removeItem(indexToRemove); } } } void PreferencesDialog::loadDefaultDataWidgets() { for (int i = 0; i < _dataWidgetListComboBoxes.count(); i++) { for (int j = 0; _dataWidgetListComboBoxes.at(i)->count(); j++) { Q_ASSERT_X( _dataWidgetListComboBoxes.at(i)->itemData(j). canConvert< DataWidgetListItemData> () == true, "PreferencesDialog::loadSessionSetup()", "Data extraction from QVariant failed !"); DataWidgetListItemData dataStruct = _dataWidgetListComboBoxes.at(i)->itemData(j).value< DataWidgetListItemData> (); if (dataStruct.widget == DEFAULT_DATA_WIDGET_BOOL || dataStruct.widget == DEFAULT_DATA_WIDGET_INT || dataStruct.widget == DEFAULT_DATA_WIDGET_FLOAT) { _dataWidgetListComboBoxes.at(i)->setCurrentIndex(j); break; } } } } void PreferencesDialog::loadDefaultInteractiveWidgets() { for (int i = 0; i < _interactiveWidgetListComboBoxes.count(); i++) { for (int j = 0; _interactiveWidgetListComboBoxes.at(i)->count(); j++) { Q_ASSERT_X( _interactiveWidgetListComboBoxes. at(i)->itemData(j). canConvert< InteractiveWidgetListItemData> () == true, "PreferencesDialog::loadSessionSetup()", "Data extraction from QVariant failed !"); InteractiveWidgetListItemData dataStruct = _interactiveWidgetListComboBoxes.at(i) ->itemData(j).value< InteractiveWidgetListItemData> (); if (dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_BOOL || dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_INT || dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_FLOAT || dataStruct.widget == DEFAULT_INTERACTIVE_WIDGET_ENUM) { _interactiveWidgetListComboBoxes.at(i)->setCurrentIndex(j); break; } } } } void PreferencesDialog::sessionDescriptionsSetupLoaded( QList dataDescriptionsSetup, QList paramDescriptionsSetup) { qDebug() << "PreferencesDialog : " "restoring descriptions setup from another session"; // Load data descriptions setup for (int i = 0; i < dataDescriptionsSetup.count(); i++) { // The comboboxes are created following the order of the descriptions int newIndex = indexOfDataWidget(_dataWidgetListComboBoxes.at(i), dataDescriptionsSetup.at(i).widget); Q_ASSERT_X(newIndex != -1, "PreferencesDialog::sessionSetupLoaded()", "Couldn't find loaded data widget index in the list !"); _dataWidgetListComboBoxes.at(i)->setCurrentIndex(newIndex); } // Load param descriptions setup for (int i = 0; i < paramDescriptionsSetup.count(); i++) { // The comboboxes are created following the order of the descriptions int newIndex = indexOfInteractiveWidget( _interactiveWidgetListComboBoxes.at(i), paramDescriptionsSetup.at(i).widget); Q_ASSERT_X(newIndex != -1, "PreferencesDialog::sessionSetupLoaded()", "Couldn't find loaded interactive widget index in the list !"); _interactiveWidgetListComboBoxes.at(i)->setCurrentIndex(newIndex); } } void PreferencesDialog::sessionMainWindowSetupLoaded( MainWindowSetup mainWindowSetup) { if (_mainWindow->displayMode() != mainWindowSetup.displayMode) { for (int i = 0; i < ui->displayModeComboBox->count(); i++) { DisplayMode displayMode = (DisplayMode) ui->displayModeComboBox ->itemData(i).toInt(); if (displayMode == mainWindowSetup.displayMode) { ui->displayModeComboBox->setCurrentIndex(i); return; } } } } // Util methods int PreferencesDialog::indexOfDataWidget(QComboBox* dataWidgetList, DataWidgetType widget) { for (int i = 0; dataWidgetList->count(); i++) { Q_ASSERT_X( dataWidgetList->itemData(i) . canConvert () == true, "PreferencesDialog::indexOfDataWidget()", "Data extraction from QVariant failed !"); DataWidgetListItemData dataStruct = dataWidgetList->itemData(i).value< DataWidgetListItemData> (); if (dataStruct.widget == widget) { return i; } } return -1; } int PreferencesDialog::indexOfInteractiveWidget( QComboBox* interactiveWidgetList, InteractiveWidgetType widget) { for (int i = 0; interactiveWidgetList->count(); i++) { Q_ASSERT_X( interactiveWidgetList->itemData(i). canConvert< InteractiveWidgetListItemData> () == true, "PreferencesDialog::indexOfInteractiveWidget()", "Data extraction from QVariant failed !"); InteractiveWidgetListItemData dataStruct = interactiveWidgetList->itemData(i).value< InteractiveWidgetListItemData> (); if (dataStruct.widget == widget) { return i; } } return -1; } starpu-1.1.5/starpu-top/dataaggregatorwidget.h0000644000373600000000000000464112571536557016442 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef DATAAGGREGATORWIDGET_H #define DATAAGGREGATORWIDGET_H class MainWindow; class WidgetWindowsManager; class QwtPlotItem; class QwtPlotCurve; class QwtPlot; #include #include #include "starpu_top_types.h" #include "abstractwidgetwindow.h" class DataAggregatorWidget : public AbstractWidgetWindow { /* Aggregates data from different data sources so they can be easily compared. Each data source is displayed as a curve in a plot widget. */ Q_OBJECT public: explicit DataAggregatorWidget( WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside = false, QList dataIds = QList()); ~DataAggregatorWidget(); // Getters QSize minimumInternalWidgetSize() const; QList aggregatedData() const; private: // Metadata // Curve colors QList _curveColors; QListIterator *_colorIterator; // Bound data descriptions QHash _curves; QHash _curvesData; // GUI components QToolButton *_addDataButton; QToolButton *_removeDataButton; QwtPlot *_plot; // Events void closeEvent(QCloseEvent *ce); public slots: void addData(int dataId); void removeData(int dataId); private slots: void createInternalWidget(); void update(int value, int dataId); void update(double value, int dataId); void curveChecked(QwtPlotItem *curve, bool checked); void dataAdded(); void dataRemoved(); void disableData(int dataId); void enableData(int dataId); }; #endif // DATAAGGREGATORWIDGET_H starpu-1.1.5/starpu-top/main.cpp0000644000373600000000000000511612571536557013537 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "mainwindow.h" #include #include #define PROGNAME "starpu_top" static void parse_args(int argc, char **argv) { if (argc == 1) return; if (argc > 2 || /* Argc should be either 1 or 2 */ strncmp(argv[1], "--help", 6) == 0 || strncmp(argv[1], "-h", 2) == 0) { (void) fprintf(stderr, "\ starpu-top is an interface which remotely displays the \n\ on-line state of a StarPU application and permits the user \n\ to change parameters on the fly. \n\ \n\ Usage: %s [OPTION] \n\ \n\ Options: \n\ -h, --help display this help and exit \n\ -v, --version output version information and exit \n\ \n\ Report bugs to <" PACKAGE_BUGREPORT ">.", PROGNAME); } else if (strncmp(argv[1], "--version", 9) == 0 || strncmp(argv[1], "-v", 2) == 0) { fprintf(stderr, "%s (%s) %s\n", PROGNAME, PACKAGE_NAME, PACKAGE_VERSION); } else { fprintf(stderr, "Unknown arg %s\n", argv[1]); } exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { parse_args(argc, argv); QApplication a(argc, argv); // Application description QCoreApplication::setOrganizationName("INRIA Bordeaux Sud-Ouest"); QCoreApplication::setOrganizationDomain("runtime.bordeaux.inria.fr"); QCoreApplication::setApplicationName("StarPU-Top"); QCoreApplication::setApplicationVersion("0.1"); MainWindow w; w.show(); return a.exec(); } starpu-1.1.5/starpu-top/mainwindow.h0000644000373600000000000002451312571536555014434 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef MAINWINDOW_H #define MAINWINDOW_H class GanttWidget; class PreferencesDialog; class DebugConsole; class AbstractWidgetWindow; class DataWidget; class DataAggregatorWidget; class InteractiveWidget; class CommunicationThread; class ConfigurationManager; class WidgetWindowsManager; class SessionSetupManager; class TaskManager; #include #include #include #include #include #include #include #include #include #include #include "starpu_top_types.h" namespace Ui { class MainWindow; } class MainWindow: public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); // Getters // Get GUI components const QSplitter *splitter() const; const QDockWidget *parametersDock() const; // Get managers const WidgetWindowsManager* widgetWindowsManager() const; const ConfigurationManager* configurationManager() const; const SessionSetupManager* sessionSetupManager() const; const TaskManager* taskManager() const; // Get different descriptions for the current session QString serverID() const; const QList *dataDescriptions() const; const QList *paramDescriptions() const; DataDescription *dataDescriptionFromId(int dataId); ParamDescription *paramDescriptionFromId(int interactiveId); const QList *serverDevices() const; // Get different widgets metadata const QHash *dataWidgetNames() const; const QHash > *dataWidgetPossibilities() const; const QHash *interactiveWidgetNames() const; const QHash > *interactiveWidgetPossibilities() const; // Get the actual widgets const QList > *dataWidgets() const; const QList > *dataAggregatorWidgets() const; const QList > *interactiveWidgets() const; DataWidget *dataWidgetFromDataId(int id); InteractiveWidget *interactiveWidgetFromParamId(int id); // Get widgets counts int nbDataWidgets() const; int nbDataAggregatorWidgets() const; int nbInteractiveWidgets() const; // Get GUI states bool isConnected() const; bool isReady() const; bool isRunning() const; bool isDebugEnabled() const; DisplayMode displayMode() const; // Get effective session time int effectiveRunningTime() const; // Add new widgets to the session DataWidget *addDataWidget(DataDescription *dataDescription); DataAggregatorWidget *addDataAggregatorWidget( QList dataIds = QList ()); InteractiveWidget *addInteractiveWidget(ParamDescription *paramDescription); protected: // Events void changeEvent(QEvent *e); void closeEvent(QCloseEvent *e); private: // GUI components Ui::MainWindow *ui; QComboBox *_widgetsDisplayModesList; QSplitter *_splitter; QMdiArea *_mdiArea; GanttWidget *_ganttWidget; QSpinBox *_ganttTimeView; QScrollArea *_parametersDockScrollArea; DebugConsole *_debugConsole; QLabel *_statusBarIcon; QLabel *_statusBarLabel; PreferencesDialog *_preferencesDialog; QList > *_dataWidgets; QList > *_dataAggregatorWidgets; QList > *_interactiveWidgets; // Managers ConfigurationManager *_configurationManager; CommunicationThread *_communicationThread; // Will instantiate the communication manager WidgetWindowsManager *_widgetWindowsManager; SessionSetupManager *_sessionSetupManager; TaskManager *_taskManager; // GUI states DisplayMode _displayMode; bool _connected; bool _ready; bool _running; bool _debug; // GUI actions QAction *_actionConnect; QAction *_actionLaunch; QAction *_actionDebug; QAction *_actionSaveSessionSetup; QAction *_actionAddDataWidget; QAction *_actionAddDataAggregatorWidget; // Widgets metadata QHash _dataWidgetNames; QSet _dataBoolWidgets, _dataIntWidgets, _dataFloatWidgets; QHash > _dataWidgetPossibilities; QHash _interactiveWidgetNames; QSet _paramBoolWidgets, _paramIntWidgets, _paramFloatWidgets, _paramEnumWidgets; QHash > _interactiveWidgetPossibilities; // Session metadata QString _serverID; qlonglong _referenceTimestamp; // Different descriptions QList *_dataDescriptions; QList *_paramDescriptions; QList *_serverDevices; int _nbDataWidgets; int _nbDataAggregatorWidgets; int _nbInteractiveWidgets; // Time references QTime _preGoTimer; int _preGoTime; QTime _runningTime; QTime _currentLockTime; int _lockedTime; // Get the current status bar message QString statusBarMessage() const; // Get the current session running time int runningTime() const; int currentLockTime() const; int lockedTime() const; /** SLOTS **/ private slots: // Actions on GUI void on_actionConnect_triggered(); void on_actionLaunch_StarPU_triggered(); void on_actionSaveSessionSetup_triggered(); void on_actionDebug_triggered(bool enabled); void on_actionQuit_triggered(); void on_actionPreferences_triggered(); void on_actionAbout_triggered(); void on_actionAddDataAggregatorWidget_triggered(); // Setters // Set GUI states void setConnected(bool connected); void setReady(bool ready); void setRunning(bool running); void setDebug(bool enabled); void setDisplayMode(DisplayMode displayMode); // Other methods void initDataWidgetLists(); void initInteractiveWidgetLists(); void displayInteractiveWidget(InteractiveWidget *interactiveWidget); void removeDestroyedDataWidgets(); void removeDestroyedInteractiveWidgets(); void removeDestroyedDataAggregatorWidgets(); void clearDescriptions(); void clearDataDescriptions(); void clearParamDescriptions(); void clearWidgets(); void clearDataWidgets(); void clearInteractiveWidgets(); void openSession(); void closeSession(); void setStatusBarIcon(QString iconFile); void setStatusBarMessage(QString message); void debugLock(); void debugStep(); void sessionMainWindowSetupLoaded(MainWindowSetup mainWindowSetup); void sessionParametersDockSetupLoaded( ParametersDockSetup parametersDockSetup); void sessionWidgetWindowsSetupLoaded( QList dataWidgetsSetup, QList dataAggregatorWidgetsSetup); public slots: void synchronizeSessionTime(qlonglong serverTimestamp); void initClient(QString serverID, QList *dataDescriptions, QList *paramDescriptions, QList *serverDevices); // Connection events handlers void connectionSucceeded(); void connectionAborted(QString message); void disconnected(); // GUI updates void updateDataWidgetsDisplayMode(int index); void updateDisplayModeIndex(int index); void updateDataWidgetType(int dataId, DataWidgetType newWidget); void updateInteractiveWidgetType(int paramId, InteractiveWidgetType newWidget); void updateStatusBarMessage(QString message); // Responses to protocol messages void protocolErrorCaught(QString errorMessage); // Debug void setDebugMessage(QString debugMessage); void setDebugLock(QString debugLockMessage); // Incoming widget update messages void updateDataWidget(int dataWidgetId, bool value, qlonglong timestamp); void updateDataWidget(int dataWidgetId, int value, qlonglong timestamp); void updateDataWidget(int dataWidgetId, double value, qlonglong timestamp); void updateInteractiveWidget(int interactiveWidgetId, bool value, qlonglong timestamp); void updateInteractiveWidget(int interactiveWidgetId, int value, qlonglong timestamp); void updateInteractiveWidget(int interactiveWidgetId, double value, qlonglong timestamp); // Incoming task update messages void updateTaskPrev(int taskId, int deviceId, qlonglong timestamp, qlonglong timestampStart, qlonglong timestampEnd); void updateTaskStart(int taskId, int deviceId, qlonglong timestamp); void updateTaskEnd(int taskId, qlonglong timestamp); // Outgoing widget update messages void interactiveWidgetUpdated(int interactiveWidgetId, bool value); void interactiveWidgetUpdated(int interactiveWidgetId, int value); void interactiveWidgetUpdated(int interactiveWidgetId, double value); /** SIGNALS **/ signals: void preferencesDialogCreated(int); void sessionOpened(); void sessionClosed(); void clientLaunched(); void dataEnabled(int dataId); void dataDisabled(int dataId); void paramValueUpdated(int paramId, bool paramValue); void paramValueUpdated(int paramId, int paramValue); void paramValueUpdated(int paramId, double paramValue); void debugEnabled(bool enabled); void debugStepped(); void debugLocked(); }; #endif // MAINWINDOW_H starpu-1.1.5/starpu-top/images/0000755000373600000000000000000012571536555013427 500000000000000starpu-1.1.5/starpu-top/images/quit.png0000644000373600000000000000112712571536555015040 00000000000000PNG  IHDRw=sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATH͕kaϵDApsn,.fԂ8 &6:IעmiCЭ8'{Mm*uZ}Z}w̸NEEY, `hS@,o:@R"# 'RI{|kp M`'KsGVA^ X:n_ 8`i _tSXn0ۙVC ]`;'hlZ~E 'hgμ# 4 zǥ~?Z߀=5{\%/+ { yKMC(3<@#8MipS"(xbh2<5?efO 1m@5cfl@Úf2/1o#(nzr-58]LGk`'*c4:r[p_P5?]0Ğ KwȫIENDB`starpu-1.1.5/starpu-top/images/widget.png0000644000373600000000000000775612571536555015357 00000000000000PNG  IHDR00W pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxOhU?3J6۬d1ZKAăAHѴV4 Ҹ*mM-PD0-&PPEhB Քl6;n7;;3!;&f!,}oAu*Tx[7n`pA0Wwz{{SQۃ`EF333'"M:*E<@0d{%DرcGE~:SSSզ]uVEC|Ȳ\1KHeiҎ4MCӴ@?ccc]hkk++nMtww[|>RTهoٲ8'p8Lgg'i7nܰ$ ܿ6/nJ\}&qsⳫOW (bINmNJ 9J΀$I|'NKpm[90oU( Cl6-yU;9[_gxϮV\*DT*I:vj "g 9SUd25 滴늢 IX%2LIj+(@P {ḆsR)$IbaaYu90tx!zO`\& ;,b+מ!{>>zcp@ 8\-u3GGذaC͗ Ήj%Jѿغu-LU[րݬGQrz 4V, ܳVTĚQUUe;+vc\:J$ KRO2,+֖-_(Y8Xu#r[>bjnnf|||UDn޼*---NKH1 -  G,%+zxZn9^JB>-z޾}醆???iw bCW\R I@O5@5$D/Ȏg1dVtz"ˈ߳o] X:e]kw]#ۛ>teP.hUG,V'89I/@i -_IKυONPl)p}9  4b)vIǛc52U OmbypBjM{pu7a F>A|Z.U!hOfaUeu;P>v}dZ_J?.^.>+{3q>ûLZƹq=(IftL_J.m+{Hx3.̘{"͔H#?'. xJJ]s3w~fHt$ZQr+RZܒ|H#uZĝ$O1h0,;(Cb-qlG(8 -U~!,pFroRݢVzUHD/5oQEP{\qJZ, "9! HMIѡ?G[O}00q~-(Q F4F{=^K[Ã6PRSzԁo>Y ®yk>6֣ҌжLL"6i/4DU"nv`ݪ٫D߉^w=QYV}Ikƪ" AQgzؐ!hg,=HKφP"j7lY1S8*9 Q%GOP'47Xd CIAh/fԘE;rBENS‚+9XpmTS0y?YeE=7ц6PZ.13Oz*2\\/'dunQɅ]Žk>F*77o`tV_=dw]W^!) #,$&)K <դ}XDVn Aٔs76||pv72xVF}Qdץa#WkIENDB`starpu-1.1.5/starpu-top/images/help.png0000644000373600000000000000141412571536555015005 00000000000000PNG  IHDRasBIT|d pHYs  ~ tEXtSoftwareMacromedia Fireworks MX*$tEXtCreation Time11/05/07ݺ`IDATx}OHTaޛ1 j%cB(AÕڵ2h2rӟ[2 )q,͌f޽}{.4ׁ~EҡE 6r6ד6מd3ˍjlKNJ۰GС%:;FLxӬ)D3<0"@\|ͩ秊Tr}Ě; GYH a-~B޴=_u]abeMxX$_r [rmlO%z{P[/Pp\䯢hL {dynM`bFeliH϶=:m`(܋sS(G |x8RU /=N9Lzcdfcvo+i(q%݂@8}P)L14k@|%x,99D ] ԏ5uVfΎVM"vyA`,'5#^RтrD.O!5Kr]U=tiUA Sñ l%15ܵK y&$]pA)N|+ <7DIENDB`starpu-1.1.5/starpu-top/images/debugon.png0000644000373600000000000000423312571536555015502 00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<=IDATxڴW}lUs?ҁl($X; - p> g0@ ưit A+ v:lm,-ro=ysLȲ9I۰T=MmAt(tDь<W9/Xpѻm[k*R.MGޥ9aZ HW3[1rÁPY*hE5( W lxZ|ݿ{l+[3lƊ0_5٨"cZ~VeRј1Kjؼ3""Wʿ+;>>~ˑw6ύ Ý+o_lǁC"XxA 6pf O` <ڶcyCC'\q ҩ٪jB%5M0,'1, u"wr;"7c0\yJ``.~Hõ•)l 辮6D$~[l%pK>sGIU}ks~dT,@-|iG800 c:sfJEV}cJ:! 1Z d/z##021kjᯨ-D@l5N{ףm]u 'GH ɓ.)9T/oA624c򵃈yj" )W֠sv6>ǶQ{K m{*3 Ml F~OT>G$»lYcFSZ8|t YabSIO!)l'1,$ Q0S6bJܹ'ٻ%ۈX:LjfEY4I'rJ'3R-PӐ}xq.{m?_Cy/6I4Y ' Pۭ0:^<kM@0_eq( B_|xph}gy}4s-9`@g$ rLYBKԊswK,_Wcd H˼ ޠ`rJ3md xšw u+X'|J .q:^^TAwhCׄL5+JMu-22[q^$7&p+%/ ])L$$r~aSw 8._E'hj H㺯e'I[+ӡ `P&`јc3QKY'Y8[.B8.8NTu.fI1)XA5 Q2LKapb9|)9g_[s (*3ܲ7Z>G d砤/,%`g+- 9HkѱUh&Bߢ vbһߘ> 7}d:*>wD*K ].%3nc;~ }Df'RE蒻жMꟇbÊӝGBhYvEQz݀X#AO6n}w.;pz,3qH!߉=߅}4AyşOG$á t'.L@" D[nx!) T{grgv0@ii٪@00,)' BHNuD$\7kX\,AVΌC`l@Y٭ xEߜďG$.q>NLl"DYB7P` %fn9 1s á*UUn"3$oX ֚Apo^D"4< 72t_Q-YadЏG5gq- Gxxjckx0%G8$+1TIR?1,l>j?m_@Mǣ\E@}u٬j =kqZ+^u8A7LoOz{X7w gYnE*IENDB`starpu-1.1.5/starpu-top/images/debugoff.png0000644000373600000000000000444112571536555015641 00000000000000PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWipU~r{H!"k)I $)Z;miG1XԩG[VGEFAdѡ,D!\sT`'N}y;n\d(`m(5(tRۺt8ȷ8]S7s&hEdd t bw1^ ʘgg]PY)PTGs~ @zꙟn\Wwsp h yeS_cr(z5\VW@)E=f1[Ċu9$|˗ݵsG3Q^׈yϾX L4AHfXg'c荪ᄚ+`K[Z3ě7wn([*k5?mZ;%-C'؃>p&\n]Dy#l^ԡ[^{l E=2gc{ϞFih ؊1ڋԡw.z؞P-,Q4 YTj֢vRD'1ֽJ'˓YCr:4HPBC&dS(~^#mEPI,0 "sĥa["692Q'}Bd9"0H|^OS+yFV#߾;0/}z[| Q"Uu0i) MiZ6Y'(!C|3P2 7#݆WpCvyV~zg ~P__׋]g3h* J޲1`8N[%JA>s9[|e 8%x:ɶЂFhm{2ͶIF YʩW?;dW 69ֵ"GP\JN٣QXԟ@A,l`:[ᱳ#S; `XDI'%cT ľj$.zPP WMæ> y!?;Ň;הeRc)f!2tp8 0ȩI{"߅iOȽkR#P@#y9{@X|-'oG711KBM054Al0.,"S@iWCݺ Ɬte!*w֦L{ |߄y Z!76-y;=θoA5IasR^j(60e?*"&҇lܱ:sC%"3ReY"r&y(trlsy -DݜI{.jpIS{la[k Ydd jbxkwC 5m@vFx\xD!eشp7}>4~Mj%^U /GM=V8қ~~4 ͕5 ]*eI/sF\x\LZHqD&ryo|L*Iis rXC1#xW MNQZ(MJx6MWt76pTÌlJPN,]N:T>-2N3iMSlk\L) )H $>ZTC<^~y\EIF,F0 TbK;/>@å$HWKG7Lo= .$kc}l̥5H>I9ٗ ;iȾq/ OÚ<ʈx!Ҏ m5# g͜6"]m_B_s䷽~@DJ YHΧWylӞr8<|뾉XjaSĉX,s{Нѱe M>ʁߊ{*F[;5Y>7̎mğ6 |~ ]SuR_L烄p.~A=h}A\eQeɟ0IENDB`starpu-1.1.5/starpu-top/images/windows.png0000644000373600000000000000170712571536555015554 00000000000000PNG  IHDRw=sBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<DIDATHoE?3w"#Bq UPD !D$SC4tnRPP"q Hb'ݝ_"Fj̼j%E6#WDD@:6 AfS!K΄ӟ݅{W;|")"B)/ ՞2(}aFw_|)cv6&H T9gB)U RKgeIDPDpJڊ2^Q+F_ѥ]΃'<|̨16.>?^fyQ#^.rnd Q'<UDXz?dc&*go޹v\(rl[O77DAvI~7Vާjٸ5y}A"h\rln!#"TyYxDD I\!R 5+G1; =T+I%ۍ޸{W7frלy.Mc-ʲhUw-"I;Bv*!b )<}6xY#/vQ DH<)Kp8d*OUvq|ԛ9of^Us:::-6EUɲ Uekk =e񾤪*Qr\-kGU;sn5,t sЂ1_J\OIENDB`starpu-1.1.5/starpu-top/images/remove.png0000644000373600000000000000041212571536555015347 00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?%qjŁAl?~b`A?0Vlb?gI2慳ʌYYX98 7@>:鿿g`0`=^c&IENDB`starpu-1.1.5/starpu-top/images/lock.png0000644000373600000000000000172512571536555015012 00000000000000PNG  IHDR(-SPLTEܶش!حѝ݀n]J8ɌĂv ԥ̒H%ܒzbsJP2ǎkHs%WUI=1s%PԱkkHH%%sPksHW%UI=1%sPkH%zbJs2PkH%ssPP¶zzznnnbbbVVVJJJ>>>222&&&𠠤vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv)tRNS@f pHYs  ~nIDATxڅY 0 EѾTc:ߥXA9@8M܁lxfH)=1vûy"bX@fZEi*o2  6aqZ8ܯW<$zIENDB`starpu-1.1.5/starpu-top/images/play.png0000644000373600000000000000710112571536555015021 00000000000000PNG  IHDR szz pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FlIDATxOU?}y<:`EyQX2Fbo1]v_3z13 Y%p1@iݺKi<?>zw2; %i"wz5MRs(6 |xWͳDn%yU XJ jIInP7[]x4sopb ce-~Qn!W{baw:3$ )vƂbw9X3~t5uhmkQ0@raաX]̅Wsysd7FTPchH!bSМn\ !r e$mM@c(LnSМK15 ؊_ί?s7"!`Eux\"u&Hx1yl0@qS#kwHJ~7Z1]0=,fKݣs!✞Q47@s‑U/w VI $[[5]~xr3:3hHIENDB`starpu-1.1.5/starpu-top/images/about.png0000644000373600000000000000267512571536555015201 00000000000000PNG  IHDRw=IDATxb`19b''eW*'˥./_o6zoc3eW{D"?##D߿~_~0?3bBIt= .NV?0j.nnaaaaaannn3e`gcaHLOg``` Y(,-##]."? A??1 wg8y5X?^.6!raiX<1@@'J |e*Zw /QUws02>w~0000W.aRtiX^e  ,,, ۻ>|v./]j&BfQf6.}I*a%;R\COhE0 BqV1 Qif6|͗b  W f``` l|JJL,< ;>=4 Ye200pC-c``٠200-Qe[C-`\ /ԥ /Js1S5CK%딋|D(N\s'l|~hY8R9g.lZ,j7+J =YR:XR)sOioN}탽]PlOgZۻV(CGgFmK}O?8uDdZkDpy> esh[Z+rDisܮ4P*_;0V;pWݳ:҆bh lv3QmBR+1{ƀsPH: =~⏏~QysnhKKk-o 8E UD KKOc3 ay ?ljN N*߿ ȈR%Qq2i|SLJqbt3{KQIȮp+amW<:T'%۽~ZbruB:1bEd;Vl,~a]O݁QJ@06 AJǫ\d[z6wo~۹.@9F;`B'";LC6MVGkuXTc]~k5A3Q*PDtHh35a`?Ad{&jX>J &2xH9"(Pg$r K7!-\)kU6Ή_}@&] qy@8>AcQҊhϝIމ4E\Z61rRLx^0c N>`'rRy8x 3œ=hr/A)NQ_'{@t(4|‘U[#@Zԟ'}H!nˊ/(g\|w yxt_~S#}N2ȓ;y`0Cw" w~^p20G2.YV~"?Q⸗HZ6OjQ~tsz$Ѹ\ H,'} M2,ݰ^ÕԿU0IENDB`starpu-1.1.5/starpu-top/images/starpu_top.png0000644000373600000000000006077412571536555016273 00000000000000PNG  IHDR\rfsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleTerminaltEXtAuthorLapo Calamandreiߑ*)tEXtDescriptionBased of Jakub Steiner's work''aIDATxIȖ&#c"Ǘozݯi#ҢvFF+E-j/mB^U^N}ӎ6h4N~oNt;w13vnmo&v`mmnmmvnm;vn)ݶvNݶv `ݶSmmmnmmvnm;vn)ݶvNݶv `ݶSmmmnmmvnm;vn)ݶvNݶv `ݶSmmmnmmvnm;vnnIz?Zk)ewnkޘ9R_R//*(|>o{>9m5?6M^?E|.1Rp8D$;v[ )%V<˿ˇ77G=q`8ADox-2,K, l6Z "l6xKUj|bw3#c%+=6736ǹuǴm>UBa]X)equokis:w{ksqqsQ?ADH.*![m}uWoWU `>wv9}t6?UVunmK3>D,0N!VCE<~pZǮִW:vm~w}9su ̿C-E)2:޿#/r׉U/kf^w_4zhw=w48o۸ߡMx浦ll_eB=@FXPڿ/R<.v۫-/716,WI&^-w7Kы`w¿v[ ]@@W'_ef/쪅k^*|vy sώ>ep|kd?x CsԾ[ naOgr?'+=W P?UNT/8M?7FЩY{;"pf-޷NGE-ᅪ~x{ ǥk >9w3i>sxsH uW!DjcN>Km2ql/KlMمG{pwtiy5hX0R[je ސ:7D6 }`cP/c':Lj1 eBøl-BGusi{?g !7oV(񣣸$>4xFR<_u晏 1@m\_ cZl~2g֙{˼|qq &7g9[nԟo0Zrou0<1:`pi٦R Wa3|* 1;]CsMjJ0dvIiEqf)槛I.(U.8VOcp }}|#83gC ӧi𿬺RfAv^u+cX,Yp-~$$~DH&~^gXg~O\*pM=y>ɗKN+e ,,}K[ NEʈ n6E{Jlk,)Y< ]KЭ(][U%A&yy//-}![ |UoX RB) a8#@A<+CoV^% -.!oC}VPxag۲߂rW"g #zj*oeXm<_A@"#d !I,5ƛس6 Ro4K*S˸ytuJS2^I]weYqNx'glumւK,ل)'Ֆ_ A_Mq RȔT{ѳT#n<> lgÁ~{{%Awk|y <%W>ʣM8NZwW=wV; {̇E1A"V @DGXl$dKH?@X$?m>0Iv1 |٭w熉Us]e +M;q9ٯp+~B.n?rE Dr!NQ"pt qzLgTWm,˜[}.ɘs\- 9r,b~S)d4|±\ÞB @PdP@Dzzo͢FI%6 e| (YbkZZ\pjb*jF,낉PUS\iuFۺ4}&Z,$?Q?qpcc[} mF-6hQ3sߋ弲PW,a0Er9b<@UpZUP)fNz뚁KW|&v Lb|}'Q'J㓸C.~ t׼&IO[b!O=T.qKO!y>sX^o4wE{( VEAW*/)'1h H`1`xcn Dp`,e:r|+T2P# ˺ο-8URcE={ (PJWzayJ4 <_)r%"W/(^Ƈ.u+&W%Vk놅z{|)1?5( DL8vo!"u~Ϸ&xD58F"9M{=NӉA,pc,'»adc$=1: T`-*Qg-b٬Wl &I%bc%ߍ`MYT?"B) ~J_%fV|$("z}X!7ct[đrI"}Dю T$cr c Ǡ{CY{(+4 բy-F?(\4mk ~:pQВxq;kq_-t87@2ξ_+X`ۀ]A`0`k7HY#ݬqVzV)[c|;*^C_pʡ bŸ>(폆 ?b|T>WFHp۟$ˋh6=I?*04mtc~;y^ ?U~7"/pa9(XܚC3|boX^nJ_f;K |t+o~zdzo,HKRPZS!yj{+Sկ軮p]޸5 Hb»:SHX\6Id!]J 6ԥ@AEZs @$cq) (d+p +>sjCKO?D  p5N] cIF5`xV]o)ހ<opz,۔4m= 4ߋ4lms$`og䂅ąޞtS Q>G|l麸f[S]Aj.1?5e *6nP @i&?0U!%+H&^'.~B.t(F h!{:3Mq9 ~&pkMb_~u2mIAߎ:ѵo|ϭ)GD8½`KU~l=p<ʕdbg`E?ėgr_]F!IN4ФPeTSTB*,~A3Mr !P@uy_C_{ |DHt" P;OUm~S&Nn|y~~νi ,cc2ErS~/X[GZ|Bܲ"W׫, TZ,-e౛ǜeW)Z)pAd?Ry F/l5xKz f Xpa9s=j*Cj8? *i YZJ(q$?۟ ,Z~ | J _Wu n7z)oZfNVc$La,!@t? KulgB_(A=ZeMRb Xt*S1Jeكp=(PA.@/)&߄4`cҁp];[_ (T.`- T?{ENvŌ@uRU6tYl ӁME5Yb?O1'c cLqB!̀To"BI &Y "$ .1<!n#6jG[(:OheiUIxY( "0l-{^Ip,$Uך#P@3vuh8DKpHܿKT`.ܞ;EAH@ 5Pdi90cL&NiȪPק򊼊:KD5P§ӋԠ `K&npЮ w͞2?Q7p0_vLCo P@p^ w-֜21QK/W1P( ^"(#n +]}^WLMf?QD4  T\ %O8-#jgߨ o:t Bo"=H/\YL? IYKO62Ձpf=cՖv?~V `0HU@k8IfX#) Zpv@:1Yd-%6 R/bXd7lKp+\t-~N`.hQ6}9< 6ETAt!1t؋rCYz_"q?@`fKrZɻ P*^%yo%"h!b»?W_B~}&+E`0ԵsC{QeG9Zä30"LF{&gWX:kRyE1!}6 Kf4G"{4ٻ>8 #sд-c1Ӂj/؂j#) 2턾⼂Q@i|#Mr1k<{8Yru pcŹqK#L[b@]' 4 owLGT(qBcU$%(T(Qq NEB%%x+M;ah~q/-4FZhYyt &%miy}wt`-FX^nf|_ZN3K1G=0G3+~;'4a& "?؋1؏5'5R]ͥDY7?a~b~ؿFze}% fX/3DafDTMVVAo?l&\s=jAa 0CLOSRF@r& gt`tq.OVm :=h'+dV5˹Ej#ݟ_1?_[OZ-6 z`jquI̢0i- ͪ5QUJ"":3 ̟W"Ō(!ڃN"u&S[tu =T^YCQs((scִxnW~u@7݅>tN算;SW_ /<2E,ԀJ 8@!UF\tۀ2LKY=9om290dbW!9 Q,پTzDLʻ<۔G5 똢_]o2,ъ!tuK3tQ>}_@~d?Wu .3%@,m$2alK;+|כ_ );UDa!/L[7[ Ԅ/v5'屿DÏ~wMuߐ{YU[Q.zc擠#@gr^d>J 5 +ӡ$(| J9TL)zm 0W6osQ&+4^#:FLk)IZc EɦT 婶lSA7j4C _rQ Lɤ9qOΟo0)bb՘C2."r(NʚJ? WIAqGֶ |mV4Mn>Z ˜=p;?7,)@*N8J0AbqϺ!!~x)4[Cr*)N=&@ǭQML yEl+""| 5Lb9 'qL+|p. i\as O4 vot|4ӀOS~t1}<ͯ/΃S@,bHV`z8@,%H6[2goX[`<&MY'g;NpGcd |3{L$@7FAh0=8BаEX v9?TN4mتev,@WW*^+S>WU!/g]ocvw,D:0ECS;%J赐K",w7`U%uw*/q?x SRsEoϱL]\0ȢU J->CYM&!ULFv |c06ӁKHJKB u-Ub7?I8UqNqwݧD _(SPE4$rvZH[w J|8W"7]xy|ْS+dDrAJ'6LcX Խ_?ϞgBN_V A`W)<)V(TCawE)5GS}CsRukܘZB壴"/SȌEH,؂m@%wD݊8m˖ߺƌ[4H~f8?@˿?Gb=Y^8Rn,7?ke/+`y0vS+a ?פ^ु!p r!0Fu?r\ SՅuťGiaQcˤThF7">lp̙F}vw  ?* \j^/SՒl=%?jRIɜ1%BkNrC!E^Vp|PCMe9f,3u B!`RU2?K%??1=]۹6i N"6$czT@d"\97i F=3lϡF#x ϶d:p=a9MtoHp| 0؋KirWq4K/* n.cH+f$w?V}"8p EBNaz3G d\ ԖɖȺ&[:٠?S~0 :wbtsBdfk|3ȌdMz"3,/T&?`hްuw?~SETrOrkL/VވB ]ȭjaR#YO[Ҁ 8b-?փ1)D^ ydTg5M pQG__枃5\/lӎ1D?‡~0/O_ӥeY.`b&IOM1}~+p!wzb0)*;kh |*5+U!,h_1F=pto^ I_SdHu ‡L?ػG2RGQ 3Re@# g;CZ>D a27ڏqL֢otF] #Phk ݈yI<ӇiWBz(=ptOYLyP ?NS<~'ͱ.UOsv Sk|99[e`0NY_UyD@8B=*_2NW$SN dRj^F+c,wa>[973,/BB[iCʳ)><}8ϩRUSW9SvoUEf`qMf4)(I?1(fo.,l]qup_P/. f[l"U a nE0@f|6HNӰ?XM${?;|ϧkH dՒJr5!g96#͠XTF刼dUd )}Z< ,ΝZ_F\ A:r5بʸk ,.6zM}ڏQ>v FbLOV8}4w;uLu)1K!tьGlj%{90δYm%vƝ@ @B, "@qXti1(~OȤDzgERJ62#L0p_A76Ԋ\AS%LVvPV-.7X?k-pT _ˁۼd3&N;?=P]lgoXHX\+"a"͊lDo~{%ԹI*Z:j=̛3N?A8ߏRN=Qn'E}VHyXVE%F|v =Rˀ;8**jHtq"!9ӵc4bzS$,%$vA 3=l5ycWF:Ѧ8)/{Crˍ-'cH?BQ>U(1Kǥ|a=MVlc2ԫ3PS'~.! iSHyw_*<5ใnMU:.Rrʥ;cʽWW AxNJߞC: _F% ׮ U lXg+ #LOCË'LpoDu"rOm$d{?$ V3ߟb9[+wsC@ȹS˩NM"=닰cµAtm5^S15;#ν,aT6e0QM7t})]zB+  )UB&} ]K*AG@px%) cPS"]EFycӀDfhTScD/Lß,Uj4‚#0Z ½O^Em 7O6`D:deXsг]x|dY1˧MCAAE(Ј=F 7Lw|uQ3]oۜit]Ϫ 37F1uFLO8y9OSqf0Kb%#q\" 2 I$ ̍pm182l9#]`kcY_W-1bʕ$#-o"K3&wŬf-)n0AH>2cuyw?o?q˖ȳ^ \ʏ8Jߜ+kI,,L(CVu 4UI1rXeu-j>pĄawh.`9NS<9MȤ~=`$МI]XT` #s=l"`qXsQe ]]n^SHD0t?J})+/[nW"oKUzQs~>[1 dZ @H# iB`zNA:QQ0נfQ\?? Isj ,1TXM n핚'GF* OP I*兪k<H*qpV6ν@%ejk<<&"3`zz4d3!Cj s84HAltZ*b S8(\TPSOz*^!YY~ h3*t̤5N 0>Ù-v@il@@Z8/i1(R^^ɍ9J2pT#p%:fz0";;hU'*]/ 1KƞW*_1(LiXj}x+I t^@@R5_i;q\`F.B~ʃ 2Ese,/+KHz8)GR5oz^M3Mz۶X& #i`v&LDRbM0Ox#dl2z7?4Rlr&TDՉl+RG`6< $2S鿼_WF SېR K?px$eaB_,{@$T?)g~zus$ő=J2F 2g;r$X^lPtk w`y:E^ :嫆bT0r"H$P-Έ 2UL:$X-6v~ L}sdpF[~ Y ' SnT$c8I 9*i4Ez,f &///-M;k?˴+7mp?\s<$-$`4IHsÑH{ TQX.+SB|^u<*s?Jt\x_>0kIW{x!`=\ xr U0U4폿aw) dޚ,ǶeY[knmA B0Jݣaټ9Y\h`x3pҜ. s20ԌGFX^X\g}8I \LS,0ڒd X ' ;#,kDlqNe@ឲFX/7HWFƁ?=?^S迫p(pxo1V} vIY^X?;C,)VNnc"%~Lq(E;{̕7k>-5˿` _!,h|ÃDq7lhL 3 e""KjiBLbNRΰk,.8~woE>!Y4NI. pR.GwG8{<tlRյ=&!X/R) qliK~I(/*LXrZll#< rb&W;@rrN;:- ajf0i` 'X/3wq;#UW©~.T".*?P# oWZ-7O?$gX\6 g30m-DcJH ,giTF3_̔ <dg r2bPgoӴaJ:ܦ[͌Go(pouQEz/-J-ۆknuΊt-urek$8b3k6x;Vs |AL̆aaK!"ɑ;U+[OTKk ŧb\obp*ιZl#D@|FIh w_Z⣼,_N_BN!/|DLAn^f^F6[3Ι&Wul~ ^w53#sO$YeU}{#Hb;M1(JPrR7dޅ)Srp^lGG:("R~ㅦ(Nf/`5ﯧ䟪@Zt¿˿mp0ΐu6T:'~гϟ)ޏsLfɺԗ^IȸXj? 5`J.uyO7#V8Y)`v 7XV`Oh7@"z>ETp65$vϕ+gb"@$~{c0pV9A= Ě]I1ʀ|"QX2[7!IJ!` ˼t"|$>)*\ HgK[vn : ~{@O(0G G=cVU8 5EvBצk*n8PU0T;("`SqD`/-_mւ%f4?J1~38-Yޮy o-2$2frn0Ej$Cg=8u*6V\hl׺~xw^+)ZΐL֋gL "i3HČ/3 xG ;6+*_m5Uأ5 ^' p箩% *u^_K}}DK8D^ jN=o8:a,?-!D=rj$M(j>Oq7fnYv^ m4>Hw T[8t3˞j!b2q GE! סW 4`MFuq$ǁo+בlm+ )"&<1!`F߻!.|f5%!_sLW`nBxU8?w8~tVf3lkPhSxS}B J+w~jP0b'@lAL*jH`8NTY F1!s; >HU1?c~zsw tS =?fZhLfbFWtE(V*{|AU7;9U~I2je0'`?$s(NЁ`ҷe߃OXӼ] Ll*㤝b@2?I30g^.T_F{ fHQN)3L10ýJ {IY :W0'mKmR(W s::[qa?XY(*9nn dx28Թ',?Z*(|\H>m `r43JHΫ h!jt!(RZ?yK~` 3=/t8Ip|@qm u:Q XNnuSd\J%3F%Ӌ&=$(wik[8!@!㤝姰28;=T|~A;;_,g}03&Rt\v%8߽Q!=So h2b;#Ο̑zC wtwAĪsU1-.5yl)7R׿67bc镅{5K+l\7a`,2-~<TqQtK;sN(C r)g5Pg"}w#Qad' IHF"N=bfLuNCe>/d (AZ@o\Ж,V'׮VE< ν YADOQp֋4/uFXkz ?:}/T5=I d XN82;wR7mfUZ* P\}tH5y 7@Đ`1xv 0p$gHn縼ێ%mK_ аǫ+VY*Uts$#?nSf] r&eU#)7hQ`U_b_s#P7e,gM^fWZq|]p9?HAt "$dpyųN @ @2Ưtр<`hw :܄[e`r+H:&1t`gT9m' p+4RbS3&}^ĬW`6Wz<?S|\DXpKŠ&/OkJA൪| S5q?5B7H=3P 5~%Ο0;] ҥvZ%WĿN0Xq@g 4X:l 405F}Q¿2@P*ljt ?!˴ɉ0mM|[ד,?О}G7oOUEӕ,9o;13V[}2U1UEP亄E302-R51=[ Ig ^UTR*eP5l501 (8:? b8ppƜ`,}:dވ᠝b._G׿u~nߡFV %$?ɤ&GXWfN @\źԝzjgp蘗8[4pB-ÄJeoob܅! HJ0"2eOIb;̸taQPh sT"ٱCv[[se+0|nؑ*5 -ߜlֵ nZ8 JBn܎F rb@e*춸A0,BW B&ᦖLJ9u(u܌Fq`]y6}VPB!gHEUZu5E? z@Kk\S/}kh[9FxX+BCm NH0P~s*R7e߈4}7}vX_7ymAEA*%Mӊ7f bqQB4`ײ EiBWcQWg *贵PmCa)3@BA[më&?wk !zUu_) -4۔2ʠuqҊ7 +} ҽaР %o/3p)<;gmqPn2%u_ h BL@!FImx 4cy^[g1*8Ja@S mu=]!_/רA gZ7XV6 >^p8,8CwÚV . 94ka\wx*o?ۡ-pt"@I!{k \:Qb , wٱ.f" 3YeZ 4ý|)0h"0bq*.@Ns*-@1w<_MM쿜x?] FPEuEkӳnY`JKs W զ<ˑ:Zs߆4O Ow@P,OgUes D-]/.S|WXϯh3˛ =7~u_RHxUa"4ƅ]õϻe`C)6@ Ü/|Z<^[}ji օxpҭ>tCKcaTVnvugFS\BݨPP= N!`LkqBQ XҰ0ѽmkm2/c\B[aDlRʠ|p `*io!Z ?f-[)>Ɇz/!Č[wU,6\]e>wMY!_AǬ뭲K[iT}6#4Kv` @5Bu_ā_Th[BBݕaT(-CFFvQ"7밅AW:~sfh0(֊ n~oz?]]tF 8""_ @lQow;rhwn7@lU`" @o z-vvBfi7$Q^z 'vyWK-hv-MS(W}n&VaShjSm]q˲,z"BB_,^@S pzv!nm׆MUQ"r8vnkh ?θZEИ=[pp^.ݶfIpg6 Xd׸bE/j|>t:UZCiy>~^e?3cX`Za^c^ Po%@W@>#Fk=6a@|@4=<;;xZEofY6FJӴ2[/wy_vwwuppP.i,)+{6/~@h,zYe >~l}gGCIlrd `vvvVGԴ\oM$f6WWW_?%%4w RPJI2< t[9jzb@MSyokɾvzVF ͂ r_v&lTgmiצH\ ^]^˭~$Mmx=^6:Bl(]ٞW<:)S}ˁu 3kS^DzX`ntɭ?mnA$H P8{nɫׁ* t}0&~w.\^n *t4f)@j~_E r`l`"I %y1v_)=1INF@+7*gVcKh1 EױBjIM`m?N='z??!CK1P鋾2 {;mIj^T@mE`_M13D⿏+q?‡A- n5MFTII$$305o= 4WMF. ZR&G|F~@@S"PX_h 7v /RԮӏ#hN݅@BWǨԌ@zEMjh|1P#7FNFPCyݦdh/H=\5f:qQMz@DP7`kt@&V@K#x1V_c:[4 z3E1; o``````````[4<]IENDB`starpu-1.1.5/starpu-top/images/inside.png0000644000373600000000000000305712571536555015335 00000000000000PNG  IHDR szzIDATXŗ]lػM%R4.izC! 4EUiUz7R{QUZ.R7R **R%YpA Mb9b6ݐA8}3gќ=ߙֈoiVW狂G `׺J$xz QvvqEP$NAHh8[aW{ HnD' ỔR ޞT*8^q;硭`D5wuvq2yY33?gڳboNxO$Q5QbŏCZ:A[0^AC.05}pZ Skmk!GM:$FkG@+DME,{XehM>1`_2̎G^ʺ^i@B iiԀ(%pQwy4|bH0?z9p ~g2]bX Jk (% kh!Ik~hQɔWg2by IurR & h-}!b B*tnǂ'.UdjX JjcDk0QMtu_9LhMv+h5XAlp{MFڽQbD[0^9A$;ĝ9zj~N)+ub iP1&: XȖ>8gpQDWٶ"SO?lvn'5ȟ>>N&:@7֧`O 7_~=YXw$Hj=mi*^XWԛJW/d 3Ipyix }&3迺(T9O 튟%й#| drhfa=[ip A_J0IENDB`starpu-1.1.5/starpu-top/images/preferences.png0000644000373600000000000000412112571536555016354 00000000000000PNG  IHDR szzsBIT|dIDATXkPT]eeA.j:BDcjLS`AtR)budHd:m´Z FƚN(-.,{fVg}y{3nCMMrHܗ`PxTH ȑ#&i@[8L'~ĻU([Jw>|O>+l&=Hp`ڬ$IwYuuuSeu_-.(@bJaWx;(eRUU^$d-Ȧ zÂ꣯NZwLƛLf֜EVAAhR%o2STUUk%/Lz\8YV3˲e$I H [ /&`^漂(#{VͲK'4*r,Zrs$8h a0 dY?0EV "k pGYq٢;!L'Tvsg.j% Т(j6 Hhuu X3v~)dKW)"T1ߔa?[[ "q^', .WfzP̒Wǚ##ڽb<6b$;:! $g(׮64>gTTTx'紟ⰥnޮenŞ&- (2&!!!ʍ5_:N䥦lȲn..L&z9<ƛM5#?g.hp8IY K mnn{Z|.n.^*qˍN06 <~YwKrPqSH%?f^Eԕ A~ ~`!> .7~)EQ@$^(XNl91uuuS:%@Zq.>\̤>} NVDK,K  Qbk6[Vx)/֚Y3`S^!)> %vԍPZZިʖˍ^AdYX"Vn<7H.n[m1Z< 14F =.pxr8սm\sX E3?=c-)(s~9+#3fFiqftv . Hm.X)iOF{WeYE  \D^8p`PWbLCFi3M8xz`6@ꬸ7*RTPg$MzQq!~x<DEE$,N-CL:]:vf4MHEk[wn?ݤhgK?рa2"(,*y94QNB׃6vbO/4q( @?W\yy9w{_pI#^oOe"ֶ'+M3.]BWx_ . "a0j%{LaE[Q C Xύ[>[8h¹!LOT(BDcL̊6&,Y{[n>扨V8<c.Sx|b%W/IENDB`starpu-1.1.5/starpu-top/images/add.png0000644000373600000000000000060312571536555014604 00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڬS;n05RnihB^iO@gr-8ADEO @Og68*nBF4?c7\?aw;θ_ nۓ`6VUEKO"lrN eYDb79<"2,KjY7M+A\5X%``&$8d (xTuGJdySh$ض2|ǢiPCQ);E<øm[DZ)Gn~cz|<GKI /IENDB`starpu-1.1.5/starpu-top/communicationmanager.h0000644000373600000000000001371212571536560016453 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMMUNICATIONMANAGER_H #define COMMUNICATIONMANAGER_H #include #include "starpu_top_types.h" class CommunicationManager : public QTcpSocket { /* Receives protocol messages from server, parses them and notifies the GUI appropriately using signals. Sends protocol messages to server when the GUI notifies. */ Q_OBJECT public: CommunicationManager(QObject *parent = 0); ~CommunicationManager(); private: // Protocol message strings QHash _inMessageStrings; QHash _outMessageStrings; QSet _typeMessageStrings; QSet _beginEndMessageStrings; QSet _widgetStatusChangeMessageStrings; QSet _debugMessageStrings; QSet _loopMessageStrings; // Metadata int _serverInfoMsgCount; QString _serverID; qlonglong _serverTimestamp; QList *_dataDescriptions; QList *_paramDescriptions; QList *_serverDevices; // Communication states CommunicationState _state; bool _initServerInfoCompleted; bool _initDataCompleted; bool _initParamsCompleted; bool _initDevCompleted; // Getters // Get communication states CommunicationState state() const; bool isInitCompleted() const; // Get session descriptions DataDescription *dataDescriptionFromId(int dataId) const; ParamDescription *paramDescriptionFromId(int paramId) const; // Init protocol message strings void initInMessageStrings(); void initOutMessageStrings(); private slots: // Initialize a new session void initializeSession(); // Receive protocol messages void messageReceived(); // Parse different protocol messages void parseInitMessage(QString messageString); void parseInitServerInfoMessage(QString messageString); void parseInitDataMessage(QString messageString); void parseInitParamsMessage(QString messageString); void parseInitDevMessage(QString messageString); void parseReadyMessage(QString messageString); void parseLoopMessage(QString messageString); void parseTaskPrevMessage(QString messageString); void parseTaskStartMessage(QString messageString); void parseTaskEndMessage(QString messageString); void parseDataUpdateMessage(QString messageString); void parseParamNotificationMessage(QString messageString); void parseDebugEnabledMessage(QString messageString); void parseDebugMessageMessage(QString messageString); void parseDebugLockMessage(QString messageString); public slots: // Build different protocol messages QString buildGoMessage(); QString buildDataEnableMessage(int dataId); QString buildDataDisableMessage(int dataId); QString buildParamSetMessage(int paramId, bool paramValue); QString buildParamSetMessage(int paramId, int paramValue); QString buildParamSetMessage(int paramId, double paramValue); QString buildDebugEnabledMessage(bool enabled); QString buildStepMessage(); // Send different protocol messages void sendMessage(QString messageString); void sendGoMessage(); void sendDataEnableMessage(int dataId); void sendDataDisableMessage(int dataId); void sendParamSetMessage(int paramId, bool paramValue); void sendParamSetMessage(int paramId, int paramValue); void sendParamSetMessage(int paramId, double paramValue); void sendDebugEnabledMessage(bool enabled); void sendStepMessage(); // Clear session descriptions void clearDescriptions(); signals: // Reference time received from server void sessionTimeSynchronized(qlonglong serverTimestamp); // Send init session data to GUI void serverInitCompleted(QString serverID, QList *dataDescriptions, QList *paramDescriptions, QList *serverDevices); // Notify GUI with a protocol message // Protocol error void protocolError(QString errorMessage); // Debug protocol messages void notifyDebugEnabled(bool enabled); void notifyDebugMessage(QString debugMessage); void notifyDebugLock(QString lockMessage); // Data update protocol messages void notifyDataUpdate(int dataId, bool dataValue, qlonglong timestamp); void notifyDataUpdate(int dataId, int dataValue, qlonglong timestamp); void notifyDataUpdate(int dataId, double dataValue, qlonglong timestamp); // Parameter update protocol messages void notifyParamUpdate(int paramId, bool paramValue, qlonglong timestamp); void notifyParamUpdate(int paramId, int paramValue, qlonglong timestamp); void notifyParamUpdate(int paramId, double paramValue, qlonglong timestamp); // Task update protocol messages void notifyTaskPrevUpdate(int taskId, int deviceId, qlonglong timestamp, qlonglong timestampStart, qlonglong timestampEnd); void notifyTaskStartUpdate(int taskId, int deviceId, qlonglong timestamp); void notifyTaskEndUpdate(int taskId, qlonglong timestamp); void protoConnected(); }; #endif // COMMUNICATIONMANAGER_H starpu-1.1.5/starpu-top/qledindicator/0000755000373600000000000000000012571536560015000 500000000000000starpu-1.1.5/starpu-top/qledindicator/qledindicator.cpp0000644000373600000000000000632212571536560020251 00000000000000/*************************************************************************** * Copyright (C) 2010 by Tn * * thenobody@poczta.fm * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "qledindicator.h" const qreal QLedIndicator::scaledSize = 1000; QLedIndicator::QLedIndicator(QWidget *parent) : QWidget(parent) { this->checked = false; onColor1 = QColor(0, 255, 0); onColor2 = QColor(0, 192, 0); offColor1 = QColor(255, 0, 0); offColor2 = QColor(192, 0, 0); } void QLedIndicator::paintEvent(QPaintEvent *event) { qreal realSize = qMin(width() / 1.3, height() / 1.3); QRadialGradient gradient; QPainter painter(this); QPen pen(Qt::black); pen.setWidth(1); painter.setRenderHint(QPainter::Antialiasing); painter.translate(width() / 2, height() / 2); painter.scale(realSize / scaledSize, realSize / scaledSize); gradient = QRadialGradient(QPointF(-500, -500), 1500, QPointF(-500, -500)); gradient.setColorAt(0, QColor(224, 224, 224)); gradient.setColorAt(1, QColor(28, 28, 28)); painter.setPen(pen); painter.setBrush(QBrush(gradient)); painter.drawEllipse(QPointF(0, 0), 500, 500); gradient = QRadialGradient(QPointF(500, 500), 1500, QPointF(500, 500)); gradient.setColorAt(0, QColor(224, 224, 224)); gradient.setColorAt(1, QColor(28, 28, 28)); painter.setPen(pen); painter.setBrush(QBrush(gradient)); painter.drawEllipse(QPointF(0, 0), 450, 450); painter.setPen(pen); if (isChecked()) { gradient = QRadialGradient(QPointF(-500, -500), 1500, QPointF(-500, -500)); gradient.setColorAt(0, onColor1); gradient.setColorAt(1, onColor2); } else { gradient = QRadialGradient(QPointF(500, 500), 1500, QPointF(500, 500)); gradient.setColorAt(0, offColor1); gradient.setColorAt(1, offColor2); } painter.setBrush(gradient); painter.drawEllipse(QPointF(0, 0), 400, 400); } void QLedIndicator::setChecked(bool checked) { this->checked = checked; update(); } bool QLedIndicator::isChecked() const { return this->checked; } starpu-1.1.5/starpu-top/qledindicator/qledindicator.h0000644000373600000000000000512012571536560017711 00000000000000/*************************************************************************** * Copyright (C) 2010 by Tn * * thenobody@poczta.fm * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef QLEDINDICATOR_H #define QLEDINDICATOR_H #include #include #include #include class QLedIndicator: public QWidget { Q_PROPERTY(QColor onColor1 WRITE setOnColor1 READ getOnColor1 );Q_PROPERTY(QColor onColor2 WRITE setOnColor2 READ getOnColor2 );Q_PROPERTY(QColor offColor1 WRITE setOffColor1 READ getOffColor1 );Q_PROPERTY(QColor offColor2 WRITE setOffColor2 READ getOffColor2 );Q_OBJECT public: QLedIndicator(QWidget *parent); void setOnColor1(QColor c) { onColor1 = c; } void setOffColor1(QColor c) { offColor1 = c; } void setOnColor2(QColor c) { onColor2 = c; } void setOffColor2(QColor c) { offColor2 = c; } QColor getOnColor1(void) { return onColor1; } QColor getOffColor1(void) { return offColor1; } QColor getOnColor2(void) { return onColor2; } QColor getOffColor2(void) { return offColor2; } void setChecked(bool checked); bool isChecked() const; protected: virtual void paintEvent(QPaintEvent *event); private: bool checked; static const qreal scaledSize; QColor onColor1, offColor1; QColor onColor2, offColor2; QPixmap ledBuffer; }; #endif // QLEDINDICATOR_H starpu-1.1.5/starpu-top/taskmanager.cpp0000644000373600000000000002200112571536557015100 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "taskmanager.h" #include #include #include TaskManager::TaskManager() { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "TaskManager's' constructor", "Singleton pattern violated - " "TaskManager instanciated more than once"); qDebug() << "TaskManager : initializing"; instanciated = true; } TaskManager::~TaskManager() { qDebug() << "TaskManager : terminating"; _database.close(); } void TaskManager::initialize() { if (_database.isOpen()) { _database.close(); } _database = QSqlDatabase::addDatabase("QSQLITE"); _database.setDatabaseName(":memory:"); } bool TaskManager::connectDatabase() { if (_database.open() == false) { qDebug() << "TaskManager : connection to tasks database failed"; return false; } qDebug() << "TaskManager : connection to tasks database established"; QSqlQuery createDbQuery; // Real tasks table createDbQuery.exec("create table tasks (id int primary key, " "device int, start int, end int)"); createDbQuery.exec("create index tsidx on tasks(start,end)"); // Prev tasks table createDbQuery.exec("create table prevtasks (id int primary key, " "device int, start int, end int)"); createDbQuery.exec("create index prevtsidx on prevtasks(start,end)"); // Prepare the queries QSqlQuery insertTaskPrevQuery, insertTaskStartQuery, updateTaskEndQuery, selectTasksQuery, selectPrevTasksQuery; insertTaskPrevQuery.prepare( "insert or replace into prevtasks (id, device, start, end) " "values (?, ?, ?, ?)"); insertTaskStartQuery.prepare("insert into tasks (id, device, start, end) " "values (?, ?, ?, -1)"); updateTaskEndQuery.prepare("update tasks set end = ? where id = ?"); selectTasksQuery.prepare( "select * from tasks where (start between ? and ?) " "or (end between ? and ?) or (start < ? and end = -1)"); selectPrevTasksQuery.prepare( "select * from prevtasks where (start between ? and ?) " "or (end between ? and ?) or (start < ? and end = -1)"); // Optimisation insertTaskPrevQuery.setForwardOnly(true); insertTaskStartQuery.setForwardOnly(true); updateTaskEndQuery.setForwardOnly(true); selectTasksQuery.setForwardOnly(true); selectPrevTasksQuery.setForwardOnly(true); _insertTaskPrevQuery = insertTaskPrevQuery; _insertTaskStartQuery = insertTaskStartQuery; _updateTaskEndQuery = updateTaskEndQuery; _selectTasksQuery = selectTasksQuery; _selectPrevTasksQuery = selectPrevTasksQuery; return true; } void TaskManager::addTaskPrev(int taskId, int deviceId, qlonglong timestampStart, qlonglong timestampEnd) { _insertTaskPrevQuery.addBindValue(taskId); _insertTaskPrevQuery.addBindValue(deviceId); _insertTaskPrevQuery.addBindValue(timestampStart); _insertTaskPrevQuery.addBindValue(timestampEnd); if (_insertTaskPrevQuery.exec() == false) { qDebug() << "TaskManager : add task PREV for task" << taskId << "failed ! (" << _insertTaskPrevQuery.lastError() << ")"; } else { qDebug() << "TaskManager : registered new task PREV with id" << taskId << "on device" << deviceId << ", timestampStart" << timestampStart << ", timestampEnd" << timestampEnd; } } void TaskManager::addTaskStart(int taskId, int deviceId, qlonglong timestampStart) { _insertTaskStartQuery.addBindValue(taskId); _insertTaskStartQuery.addBindValue(deviceId); _insertTaskStartQuery.addBindValue(timestampStart); if (_insertTaskStartQuery.exec() == false) { qDebug() << "TaskManager : add task START for task" << taskId << "failed !" << _insertTaskStartQuery.lastError() << ")"; } else { qDebug() << "TaskManager : registered task START with id" << taskId << "on device" << deviceId << ", timestampStart" << timestampStart; } } void TaskManager::addTaskEnd(int taskId, qlonglong timestampEnd) { _updateTaskEndQuery.addBindValue(timestampEnd); _updateTaskEndQuery.addBindValue(taskId); if (_updateTaskEndQuery.exec() == false) { qDebug() << "TaskManager : add task END for task" << taskId << "failed !" << _updateTaskEndQuery.lastError() << ")"; } else { qDebug() << "TaskManager : registered task END with id" << taskId << ", timestampEnd" << timestampEnd; } } QList TaskManager::tasks(qlonglong timestampStart, qlonglong timestampEnd) { QList < starpu_top_task > tasks; _selectTasksQuery.addBindValue(timestampStart); _selectTasksQuery.addBindValue(timestampEnd); _selectTasksQuery.addBindValue(timestampStart); _selectTasksQuery.addBindValue(timestampEnd); _selectTasksQuery.addBindValue(timestampStart); if (_selectTasksQuery.exec() == false) { qDebug() << "TaskManager : failed to select tasks ! (" << _selectTasksQuery.lastError() << ")"; } else { qDebug() << "TaskManager : fetching tasks between" << timestampStart << "and" << timestampEnd; int idField = _selectTasksQuery.record().indexOf("id"); int deviceField = _selectTasksQuery.record().indexOf("device"); int startField = _selectTasksQuery.record().indexOf("start"); int endField = _selectTasksQuery.record().indexOf("end"); while (_selectTasksQuery.next()) { int taskId = _selectTasksQuery.value(idField).toInt(); int deviceId = _selectTasksQuery.value(deviceField).toInt(); qlonglong timestampStart = _selectTasksQuery.value(startField).toLongLong(); qlonglong timestampEnd = _selectTasksQuery.value(endField).toLongLong(); starpu_top_task task; task.taskId = taskId; task.deviceId = deviceId; task.timestampStart = timestampStart; task.timestampEnd = timestampEnd; tasks.append(task); } qDebug() << "TaskManager : selected" << tasks.count() << "tasks"; } return tasks; } QList TaskManager::prevTasks(qlonglong timestampStart, qlonglong timestampEnd) { QList < starpu_top_task > prevTasks; _selectPrevTasksQuery.addBindValue(timestampStart); _selectPrevTasksQuery.addBindValue(timestampEnd); _selectPrevTasksQuery.addBindValue(timestampStart); _selectPrevTasksQuery.addBindValue(timestampEnd); _selectPrevTasksQuery.addBindValue(timestampStart); if (_selectPrevTasksQuery.exec() == false) { qDebug() << "TaskManager : failed to select prev tasks ! (" << _selectPrevTasksQuery.lastError() << ")"; } else { qDebug() << "TaskManager : fetching prev tasks between" << timestampStart << "and" << timestampEnd; int idField = _selectPrevTasksQuery.record().indexOf("id"); int deviceField = _selectPrevTasksQuery.record().indexOf("device"); int startField = _selectPrevTasksQuery.record().indexOf("start"); int endField = _selectPrevTasksQuery.record().indexOf("end"); while (_selectPrevTasksQuery.next()) { int taskId = _selectPrevTasksQuery.value(idField).toInt(); int deviceId = _selectPrevTasksQuery.value(deviceField).toInt(); qlonglong timestampStart = _selectPrevTasksQuery.value(startField).toLongLong(); qlonglong timestampEnd = _selectPrevTasksQuery.value(endField).toLongLong(); starpu_top_task prevTask; prevTask.taskId = taskId; prevTask.deviceId = deviceId; prevTask.timestampStart = timestampStart; prevTask.timestampEnd = timestampEnd; prevTasks.append(prevTask); } qDebug() << "TaskManager : selected" << prevTasks.count() << "prev tasks"; } return prevTasks; } starpu-1.1.5/starpu-top/communicationmanager.cpp0000644000373600000000000014124612571536557017020 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "communicationmanager.h" // Protocol messages delimiters const char COM_MSG_SEPARATOR = ';'; const char COM_MSG_ENDL = '\n'; CommunicationManager::CommunicationManager(QObject *parent) : QTcpSocket(parent) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "CommunicationManager's' constructor", "Singleton pattern violated - " "CommunicationManager instanciated more than once"); qDebug() << "CommunicationManager : initializing"; // Init incoming messages initInMessageStrings(); // Init outgoing messages initOutMessageStrings(); // Init session data and communication states initializeSession(); QObject::connect(this, SIGNAL(readyRead()), this, SLOT(messageReceived())); QObject::connect(this, SIGNAL(disconnected()), this, SLOT(clearDescriptions())); QObject::connect(this, SIGNAL(disconnected()), this, SLOT(initializeSession())); instanciated = true; } CommunicationManager::~CommunicationManager() { qDebug() << "CommunicationManager : terminating"; delete _dataDescriptions; delete _paramDescriptions; delete _serverDevices; } void CommunicationManager::initializeSession() { _dataDescriptions = new QList (); _paramDescriptions = new QList (); _serverDevices = new QList ; _serverInfoMsgCount = 0; _state = COM_STATE_INIT; _initServerInfoCompleted = _initDataCompleted = _initParamsCompleted = _initDevCompleted = false; } /* -------------------------------------------------------------------------- */ /* Receive messages */ /* -------------------------------------------------------------------------- */ void CommunicationManager::messageReceived() { while (canReadLine()) { QByteArray message = readLine(); QString messageString = QString(message).trimmed(); switch (_state) { case COM_STATE_INIT: { if (_beginEndMessageStrings.contains(messageString)) { parseInitMessage(messageString); } else { emit protocolError( "Unexpected message received in INIT (" + messageString + ")"); } break; } case COM_STATE_INIT_SERVERINFO: parseInitServerInfoMessage(messageString); break; case COM_STATE_INIT_DATA: parseInitDataMessage(messageString); break; case COM_STATE_INIT_PARAMS: parseInitParamsMessage(messageString); break; case COM_STATE_INIT_DEV: parseInitDevMessage(messageString); break; case COM_STATE_READY: parseReadyMessage(messageString); break; case COM_STATE_LOOP: parseLoopMessage(messageString); break; } } } /* -------------------------------------------------------------------------- */ /* Parse messages */ /* -------------------------------------------------------------------------- */ void CommunicationManager::parseInitMessage(QString messageString) { switch (_inMessageStrings.value(messageString)) { case COM_MSG_IN_SERVERINFO_BEGIN: qDebug() << "CommunicationManager : SERVERINFO BEGIN received in INIT"; _state = COM_STATE_INIT_SERVERINFO; break; case COM_MSG_IN_DATA_BEGIN: qDebug() << "CommunicationManager : DATA BEGIN received in INIT"; _state = COM_STATE_INIT_DATA; break; case COM_MSG_IN_PARAMS_BEGIN: qDebug() << "CommunicationManager : PARAMS BEGIN received in INIT"; _state = COM_STATE_INIT_PARAMS; break; case COM_MSG_IN_DEV_BEGIN: qDebug() << "CommunicationManager : DEV BEGIN received in INIT"; _state = COM_STATE_INIT_DEV; break; default: ; } } void CommunicationManager::parseInitServerInfoMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_SERVERINFO_END) { qDebug() << "CommunicationManager : " "SERVERINFO END received in INIT SERVERINFO"; _initServerInfoCompleted = true; emit protoConnected(); if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT SERVERINFO (" + messageString + ")"); } } else if (_serverInfoMsgCount == 0) { // First server info : Server ID qDebug() << "CommunicationManager : " "SERVERINFO received in INIT SERVERINFO (" << messageString + ")"; _serverID = messageString; _serverInfoMsgCount++; } else if (_serverInfoMsgCount == 1) { // Second server info : Server timestamp qDebug() << "CommunicationManager : " "SERVERTIMESTAMP received in INIT SERVERINFO (" << messageString + ")"; QString serverTimestampString = messageString; bool ok = false; qlonglong serverTimestamp = serverTimestampString.toLongLong(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitServerInfoMessage()", "Bogus SERVERTIMESTAMP received in INIT SERVERINFO"); emit(sessionTimeSynchronized(serverTimestamp)); _serverTimestamp = serverTimestamp; _serverInfoMsgCount++; } } void CommunicationManager::parseInitDataMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_DATA_END) { qDebug() << "CommunicationManager : DATA END received in INIT DATA"; _initDataCompleted = true; if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT DATA (" + messageString + ")"); } } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString typeString = messageParts.at(0); QString idString = messageParts.at(1); bool ok = false; int id = idString.toInt(&ok); // Data ID Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString description = messageParts.at(2); // Data description DataType type; DataWidgetType widget; // Data widget double valMax = 0., valMin = 0.; bool active; Q_ASSERT_X(_typeMessageStrings.contains(typeString), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); switch (_inMessageStrings.value(typeString)) { case COM_MSG_IN_TYPE_BOOL: { Q_ASSERT_X(messageParts.count() == 4, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString activeString = messageParts.at(3); Q_ASSERT_X( (activeString.compare("0") == 0) || (activeString.compare("1") == 0), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); if (activeString.compare("1") == 0) { active = true; } else { active = false; } type = DATA_TYPE_BOOL; widget = DEFAULT_DATA_WIDGET_BOOL; break; } case COM_MSG_IN_TYPE_INT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString activeString = messageParts.at(5); bool ok = false; int activeInt = activeString.toInt(&ok); Q_ASSERT_X(ok == true && (activeInt == 0 || activeInt == 1), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); if (activeInt == 1) { active = true; } else { active = false; } QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); // Data ID Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); type = DATA_TYPE_INT; widget = DEFAULT_DATA_WIDGET_INT; break; } case COM_MSG_IN_TYPE_FLOAT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString activeString = messageParts.at(5); bool ok = false; int activeInt = activeString.toInt(&ok); Q_ASSERT_X(ok == true && (activeInt == 0 || activeInt == 1), "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); if (activeInt == 1) { active = true; } else { active = false; } QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDataMessage()", "Bogus message received in INIT DATA"); type = DATA_TYPE_FLOAT; widget = DEFAULT_DATA_WIDGET_FLOAT; break; } default: emit protocolError( "Bogus message received in INIT DATA (" + messageString + ")"); return; } // Build the data description corresponding to this message if (active == false) { widget = DATA_WIDGET_NONE; } DataDescription *dataWidgetDescription = new DataDescription; dataWidgetDescription->id = id; dataWidgetDescription->descriptionString = description; dataWidgetDescription->type = type; dataWidgetDescription->widget = widget; dataWidgetDescription->valMin = valMin; dataWidgetDescription->valMax = valMax; _dataDescriptions->append(dataWidgetDescription); qDebug() << "CommunicationManager : " "DATA MSG successfully parsed in INIT DATA (" << messageString + ")"; } } void CommunicationManager::parseInitParamsMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_PARAMS_END) { qDebug() << "CommunicationManager : " "PARAMS END received in INIT PARAMS"; _initParamsCompleted = true; if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT PARAMS (" + messageString + ")"); } } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString typeString = messageParts.at(0); QString idString = messageParts.at(1); bool ok = false; int id = idString.toInt(&ok); // Param ID Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString description = messageParts.at(2); // Param description ParamType type; InteractiveWidgetType widget; bool valInitBool = false; int valInitInt = 0; double valInitDouble = 0.; int valInitEnum = 0; double valMax = 0., valMin = 0.; QStringList enumValues; Q_ASSERT_X(_typeMessageStrings.contains(typeString), "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); switch (_inMessageStrings.value(typeString)) { case COM_MSG_IN_TYPE_BOOL: { QString valInitString = messageParts.at(3); Q_ASSERT_X( messageParts.count() == 4 && (valInitString.compare("0") == 0 || valInitString.compare("1") == 1), "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); if (valInitString.compare("0") == 0) { valInitBool = false; } else { valInitBool = true; } type = PARAM_TYPE_BOOL; widget = DEFAULT_INTERACTIVE_WIDGET_BOOL; break; } case COM_MSG_IN_TYPE_INT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valInitString = messageParts.at(5); bool ok = false; valInitInt = valInitString.toInt(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); type = PARAM_TYPE_INT; widget = DEFAULT_INTERACTIVE_WIDGET_INT; break; } case COM_MSG_IN_TYPE_FLOAT: { Q_ASSERT_X(messageParts.count() == 6, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valInitString = messageParts.at(5); bool ok = false; valInitDouble = valInitString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMinString = messageParts.at(3); valMin = valMinString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valMaxString = messageParts.at(4); valMax = valMaxString.toDouble(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); type = PARAM_TYPE_FLOAT; widget = DEFAULT_INTERACTIVE_WIDGET_FLOAT; break; } case COM_MSG_IN_TYPE_ENUM: { Q_ASSERT_X(messageParts.count() > 4, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QString valInitString = messageParts.at(messageParts.count()-1); bool ok = false; valInitEnum = valInitString.toInt(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitParamsMessage()", "Bogus message received in INIT PARAMS"); QStringList values; for (int i = 3; i < messageParts.count() - 1; i++) { values << messageParts.at(i); } valMin = 0.0; valMax = messageParts.count() - 3 - 1; enumValues = values; type = PARAM_TYPE_ENUM; widget = DEFAULT_INTERACTIVE_WIDGET_ENUM; break; } default: emit protocolError( "Bogus message received in INIT PARAMS (" + messageString + ")"); return; } // Build the param description corresponding to this message ParamDescription *interactiveWidgetDescription = new ParamDescription; interactiveWidgetDescription->id = id; interactiveWidgetDescription->descriptionString = description; interactiveWidgetDescription->type = type; interactiveWidgetDescription->widget = widget; interactiveWidgetDescription->valInitBool = valInitBool; interactiveWidgetDescription->valInitInt = valInitInt; interactiveWidgetDescription->valInitDouble = valInitDouble; interactiveWidgetDescription->valInitEnum = valInitEnum; interactiveWidgetDescription->valMin = valMin; interactiveWidgetDescription->valMax = valMax; interactiveWidgetDescription->enumValues = enumValues; _paramDescriptions->append(interactiveWidgetDescription); qDebug() << "CommunicationManager : " "PARAMS MSG successfully parsed in INIT PARAMS (" << messageString + ")"; } } void CommunicationManager::parseInitDevMessage(QString messageString) { if (_beginEndMessageStrings.contains(messageString)) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_DEV_END) { qDebug() << "CommunicationManager : DEV END received in INIT DEV"; _initDevCompleted = true; if (isInitCompleted()) { _state = COM_STATE_READY; } else { _state = COM_STATE_INIT; } } else { emit protocolError( "Bogus message received in INIT DEV (" + messageString + ")"); } } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); Q_ASSERT_X(messageParts.count() == 3, "CommunicationManager::parseInitDevMessage()", "Bogus message received in INIT DEV"); QString deviceIdString = messageParts.at(0); QString deviceTypeString = messageParts.at(1); QString deviceNameString = messageParts.at(2); bool ok = false; int deviceId = deviceIdString.toInt(&ok); Q_ASSERT_X(ok == true, "CommunicationManager::parseInitDevMessage()", "Bogus message received in INIT DEV"); starpu_top_device_type deviceType; Q_ASSERT_X( deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_CPU)) == 0 || deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_CUDA)) == 0 || deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_OPENCL)) == 0 , "CommunicationManager::parseInitDevMessage()", "Bogus message received in INIT DEV"); if (deviceTypeString.compare(_inMessageStrings.key(COM_MSG_IN_DEV_CPU)) == 0) { deviceType = SERVERDEVICE_CPU; } else if (deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_CUDA)) == 0) { deviceType = SERVERDEVICE_CUDA; } else if (deviceTypeString.compare( _inMessageStrings.key(COM_MSG_IN_DEV_OPENCL)) == 0) { deviceType = SERVERDEVICE_OPENCL; } starpu_top_device device; device.id = deviceId; device.type = deviceType; device.name = deviceNameString; _serverDevices->append(device); qDebug() << "CommunicationManager : " "DEV MSG successfully parsed in INIT DEV (" << messageString + ")"; } } void CommunicationManager::parseReadyMessage(QString messageString) { if (_inMessageStrings.value(messageString) == COM_MSG_IN_READY) { qDebug() << "CommunicationManager : READY received in READY (" << messageString + ")"; emit serverInitCompleted(_serverID, _dataDescriptions, _paramDescriptions, _serverDevices); _state = COM_STATE_LOOP; } else { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString head = messageParts.at(0); Q_ASSERT_X(_widgetStatusChangeMessageStrings.contains(head), "CommunicationManager::parseReadyMessage()", "Bogus message received in READY"); switch (_inMessageStrings.value(head)) { case COM_MSG_IN_SET: parseParamNotificationMessage(messageString); break; default: ; } } } void CommunicationManager::parseLoopMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); QString head = messageParts.at(0); if (_widgetStatusChangeMessageStrings.contains(head)) { switch (_inMessageStrings.value(head)) { case COM_MSG_IN_SET: parseParamNotificationMessage(messageString); break; default: ; } } else if (_loopMessageStrings.contains(head)) { switch (_inMessageStrings.value(head)) { case COM_MSG_IN_PREV: parseTaskPrevMessage(messageString); break; case COM_MSG_IN_SHORT_PREV: parseTaskPrevMessage(messageString); break; case COM_MSG_IN_START: parseTaskStartMessage(messageString); break; case COM_MSG_IN_SHORT_START: parseTaskStartMessage(messageString); break; case COM_MSG_IN_END: parseTaskEndMessage(messageString); break; case COM_MSG_IN_SHORT_END: parseTaskEndMessage(messageString); break; case COM_MSG_IN_UPDATE: parseDataUpdateMessage(messageString); break; case COM_MSG_IN_SHORT_UPDATE: parseDataUpdateMessage(messageString); break; default: ; } } else if (_debugMessageStrings.contains(head)) { switch (_inMessageStrings.value(head)) { case COM_MSG_IN_DEBUG: parseDebugEnabledMessage(messageString); break; case COM_MSG_IN_DEBUG_MESSAGE: parseDebugMessageMessage(messageString); break; case COM_MSG_IN_DEBUG_LOCK: parseDebugLockMessage(messageString); break; default: ; } } else { emit protocolError( "Unexpected message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseTaskPrevMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 6) { QString taskIdString = messageParts.at(1); QString deviceIdString = messageParts.at(2); QString timestampString = messageParts.at(3); QString timestampStartString = messageParts.at(4); QString timestampEndString = messageParts.at(5); int taskId; int deviceId; qlonglong timestamp; qlonglong timestampStart; qlonglong timestampEnd; bool ok = false; taskId = taskIdString.toInt(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } deviceId = deviceIdString.toInt(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } timestampStart = timestampStartString.toLongLong(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } timestampEnd = timestampEndString.toLongLong(&ok); if (ok == false) { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); return; } emit notifyTaskPrevUpdate(taskId, deviceId, timestamp, timestampStart, timestampEnd); qDebug() << "CommunicationManager : " "TASK PREV message successfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Unexpected TASK PREV message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseTaskStartMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 4) { QString taskIdString = messageParts.at(1); QString deviceIdString = messageParts.at(2); QString timestampString = messageParts.at(3); int taskId; int deviceId; qlonglong timestamp; bool ok = false; taskId = taskIdString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); return; } deviceId = deviceIdString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); return; } emit notifyTaskStartUpdate(taskId, deviceId, timestamp); qDebug() << "CommunicationManager : " "TASK START message succesfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Bogus TASK START message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseTaskEndMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 3) { QString taskIdString = messageParts.at(1); QString timestampString = messageParts.at(2); int taskId; qlonglong timestamp; bool ok = false; taskId = taskIdString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus TASK END message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus TASK END message received in LOOP (" + messageString + ")"); return; } emit notifyTaskEndUpdate(taskId, timestamp); qDebug() << "CommunicationManager : " "TASK END message successfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Bogus TASK END message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseDataUpdateMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() == 4) { QString dataIdString = messageParts.at(1); QString timestampString = messageParts.at(3); QString dataValueString = messageParts.at(2); int dataId; qlonglong timestamp; bool ok = false; dataId = dataIdString.toInt(&ok); if (ok == false || (dataDescriptionFromId(dataId) == 0)) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } switch (dataDescriptionFromId(dataId)->type) { case DATA_TYPE_BOOL: { bool dataVal; if (dataValueString.compare("0") == 0) { dataVal = false; } else if (dataValueString.compare("1") == 0) { dataVal = true; } else { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } emit notifyDataUpdate(dataId, dataVal, timestamp); break; } case DATA_TYPE_INT: { int dataVal = dataValueString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } emit notifyDataUpdate(dataId, dataVal, timestamp); break; } case DATA_TYPE_FLOAT: { double dataVal = dataValueString.toDouble(&ok); if (ok == false) { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); return; } emit notifyDataUpdate(dataId, dataVal, timestamp); break; } default: emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); } qDebug() << "CommunicationManager : " "UPDATE message successfully parsed in LOOP (" << messageString + ")"; } else { emit protocolError( "Bogus UPDATE message received in LOOP (" + messageString + ")"); } } void CommunicationManager::parseParamNotificationMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 4) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } QString paramIdString = messageParts.at(1); QString paramValueString = messageParts.at(2); QString timestampString = messageParts.at(3); int paramId; qlonglong timestamp; bool ok = false; paramId = paramIdString.toInt(&ok); if (ok == false || (paramDescriptionFromId(paramId) == 0)) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } timestamp = timestampString.toLongLong(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } switch (paramDescriptionFromId(paramId)->type) { case PARAM_TYPE_BOOL: { bool paramVal; if (paramValueString.compare("0") == 0) { paramVal = false; } else if (paramValueString.compare("1") == 0) { paramVal = true; } else { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } case PARAM_TYPE_INT: { int paramVal = paramValueString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } case PARAM_TYPE_FLOAT: { double paramVal = paramValueString.toDouble(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } case PARAM_TYPE_ENUM: { int paramVal = paramValueString.toInt(&ok); if (ok == false) { emit protocolError( "Bogus SET message received (" + messageString + ")"); return; } emit notifyParamUpdate(paramId, paramVal, timestamp); break; } default: emit protocolError( "Bogus SET message received (" + messageString + ")"); } qDebug() << "CommunicationManager : SET successfully parsed in LOOP (" << messageString + ")"; } void CommunicationManager::parseDebugEnabledMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 2) { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); return; } QString debugEnabledString = messageParts.at(1); if (debugEnabledString.compare(_inMessageStrings.key(COM_MSG_IN_DEBUG_ON)) == 0) { qDebug() << "CommunicationManager : DEBUG ON received (" << messageString + ")"; emit notifyDebugEnabled(true); } else if (debugEnabledString.compare( _inMessageStrings.key(COM_MSG_IN_DEBUG_OFF)) == 0) { qDebug() << "CommunicationManager : DEBUG OFF received (" << messageString + ")"; emit notifyDebugEnabled(false); } else { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); } } void CommunicationManager::parseDebugMessageMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 2) { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); return; } QString debugMessageString = messageParts.at(1); emit notifyDebugMessage(debugMessageString); qDebug() << "CommunicationManager : DEBUG MESSAGE received (" << messageString + ")"; } void CommunicationManager::parseDebugLockMessage(QString messageString) { QStringList messageParts = messageString.split(COM_MSG_SEPARATOR); if (messageParts.count() != 2) { emit protocolError( "Bogus DEBUG message received (" + messageString + ")"); return; } QString lockMessageString = messageParts.at(1); emit notifyDebugLock(lockMessageString); qDebug() << "CommunicationManager : DEBUG LOCK received (" << messageString + ")"; } /* -------------------------------------------------------------------------- */ /* Send messages */ /* -------------------------------------------------------------------------- */ void CommunicationManager::sendMessage(QString messageString) { messageString.append(COM_MSG_ENDL); write(messageString.toAscii()); } void CommunicationManager::sendGoMessage() { sendMessage( buildGoMessage()); } void CommunicationManager::sendDataEnableMessage(int dataId) { sendMessage(buildDataEnableMessage(dataId)); } void CommunicationManager::sendDataDisableMessage(int dataId) { sendMessage(buildDataDisableMessage(dataId)); } void CommunicationManager::sendParamSetMessage(int paramId, bool paramValue) { sendMessage(buildParamSetMessage(paramId, paramValue)); } void CommunicationManager::sendParamSetMessage(int paramId, int paramValue) { sendMessage(buildParamSetMessage(paramId, paramValue)); } void CommunicationManager::sendParamSetMessage(int paramId, double paramValue) { sendMessage(buildParamSetMessage(paramId, paramValue)); } void CommunicationManager::sendDebugEnabledMessage(bool enabled) { sendMessage(buildDebugEnabledMessage(enabled)); } void CommunicationManager::sendStepMessage() { sendMessage( buildStepMessage()); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ CommunicationState CommunicationManager::state() const { return _state; } bool CommunicationManager::isInitCompleted() const { return (_initServerInfoCompleted && _initDataCompleted && _initParamsCompleted && _initDevCompleted); } /* -------------------------------------------------------------------------- */ /* Build messages */ /* -------------------------------------------------------------------------- */ QString CommunicationManager::buildGoMessage() { QString messageString = _outMessageStrings.value(COM_MSG_OUT_GO); return messageString; } QString CommunicationManager::buildDataEnableMessage(int dataId) { QString head = _outMessageStrings.value(COM_MSG_OUT_ENABLE); QString dataIdString = QString::number(dataId); QString messageString = head.append(COM_MSG_SEPARATOR).append(dataIdString); return messageString; } QString CommunicationManager::buildDataDisableMessage(int dataId) { QString head = _outMessageStrings.value(COM_MSG_OUT_DISABLE); QString dataIdString = QString::number(dataId); QString messageString = head.append(COM_MSG_SEPARATOR).append(dataIdString); return messageString; } QString CommunicationManager::buildParamSetMessage(int paramId, bool paramValue) { QString head = _outMessageStrings.value(COM_MSG_OUT_SET); QString paramIdString = QString::number(paramId); QString paramValueString = QString::number(paramValue ? 1 : 0); QString messageString = head.append(COM_MSG_SEPARATOR).append(paramIdString).append( COM_MSG_SEPARATOR) .append(paramValueString); return messageString; } QString CommunicationManager::buildParamSetMessage(int paramId, int paramValue) { QString head = _outMessageStrings.value(COM_MSG_OUT_SET); QString paramIdString = QString::number(paramId); QString paramValueString = QString::number(paramValue); QString messageString = head.append(COM_MSG_SEPARATOR).append(paramIdString).append( COM_MSG_SEPARATOR) .append(paramValueString); return messageString; } QString CommunicationManager::buildParamSetMessage(int paramId, double paramValue) { QString head = _outMessageStrings.value(COM_MSG_OUT_SET); QString paramIdString = QString::number(paramId); QString paramValueString = QString::number(paramValue); QString messageString = head.append(COM_MSG_SEPARATOR).append(paramIdString).append( COM_MSG_SEPARATOR) .append(paramValueString); return messageString; } QString CommunicationManager::buildDebugEnabledMessage(bool enabled) { QString head = _outMessageStrings.value(COM_MSG_OUT_DEBUG); QString debugEnabledString = (enabled ? _outMessageStrings.value( COM_MSG_OUT_DEBUG_ON) : _outMessageStrings.value( COM_MSG_OUT_DEBUG_OFF)); QString messageString = head.append(COM_MSG_SEPARATOR).append( debugEnabledString); return messageString; } QString CommunicationManager::buildStepMessage() { QString messageString = _outMessageStrings.value(COM_MSG_OUT_DEBUG_STEP); return messageString; } DataDescription *CommunicationManager::dataDescriptionFromId(int dataId) const { for (int i = 0; i < _dataDescriptions->count(); i++) { if (_dataDescriptions->at(i)->id == dataId) return _dataDescriptions->at(i); } return 0; } ParamDescription *CommunicationManager::paramDescriptionFromId(int paramId) const { for (int i = 0; i < _paramDescriptions->count(); i++) { if (_paramDescriptions->at(i)->id == paramId) return _paramDescriptions->at(i); } return 0; } void CommunicationManager::clearDescriptions() { _dataDescriptions->clear(); _paramDescriptions->clear(); } /* -------------------------------------------------------------------------- */ /* Init message strings */ /* -------------------------------------------------------------------------- */ void CommunicationManager::initInMessageStrings() { // Types _inMessageStrings.insert("BOOL", COM_MSG_IN_TYPE_BOOL); _inMessageStrings.insert("INT", COM_MSG_IN_TYPE_INT); _inMessageStrings.insert("FLOAT", COM_MSG_IN_TYPE_FLOAT); _inMessageStrings.insert("ENUM", COM_MSG_IN_TYPE_ENUM); _typeMessageStrings.insert("BOOL"); _typeMessageStrings.insert("INT"); _typeMessageStrings.insert("FLOAT"); _typeMessageStrings.insert("ENUM"); // Init server ID _inMessageStrings.insert("SERVERINFO", COM_MSG_IN_SERVERINFO_BEGIN); _inMessageStrings.insert("/SERVERINFO", COM_MSG_IN_SERVERINFO_END); _beginEndMessageStrings.insert("SERVERINFO"); _beginEndMessageStrings.insert("/SERVERINFO"); // Init data _inMessageStrings.insert("DATA", COM_MSG_IN_DATA_BEGIN); _inMessageStrings.insert("/DATA", COM_MSG_IN_DATA_END); _beginEndMessageStrings.insert("DATA"); _beginEndMessageStrings.insert("/DATA"); // Init parameters _inMessageStrings.insert("PARAMS", COM_MSG_IN_PARAMS_BEGIN); _inMessageStrings.insert("/PARAMS", COM_MSG_IN_PARAMS_END); _beginEndMessageStrings.insert("PARAMS"); _beginEndMessageStrings.insert("/PARAMS"); // Init devices _inMessageStrings.insert("DEV", COM_MSG_IN_DEV_BEGIN); _inMessageStrings.insert("/DEV", COM_MSG_IN_DEV_END); _inMessageStrings.insert("CPU", COM_MSG_IN_DEV_CPU); _inMessageStrings.insert("GPU", COM_MSG_IN_DEV_CUDA); _inMessageStrings.insert("OPENCL", COM_MSG_IN_DEV_OPENCL); _beginEndMessageStrings.insert("DEV"); _beginEndMessageStrings.insert("/DEV"); // Server ready _inMessageStrings.insert("READY", COM_MSG_IN_READY); // Widget status _inMessageStrings.insert("SET", COM_MSG_IN_SET); _widgetStatusChangeMessageStrings.insert("SET"); // Loop messages // Complete versions _inMessageStrings.insert("PREV", COM_MSG_IN_PREV); _inMessageStrings.insert("START", COM_MSG_IN_START); _inMessageStrings.insert("END", COM_MSG_IN_END); _inMessageStrings.insert("UPDATE", COM_MSG_IN_UPDATE); // Short versions _inMessageStrings.insert("P", COM_MSG_IN_SHORT_PREV); _inMessageStrings.insert("S", COM_MSG_IN_SHORT_START); _inMessageStrings.insert("E", COM_MSG_IN_SHORT_END); _inMessageStrings.insert("U", COM_MSG_IN_SHORT_UPDATE); // Complete versions _loopMessageStrings.insert("PREV"); _loopMessageStrings.insert("START"); _loopMessageStrings.insert("END"); _loopMessageStrings.insert("UPDATE"); // Short versions _loopMessageStrings.insert("P"); _loopMessageStrings.insert("S"); _loopMessageStrings.insert("E"); _loopMessageStrings.insert("U"); // Debug messages _inMessageStrings.insert("DEBUG", COM_MSG_IN_DEBUG); _inMessageStrings.insert("ON", COM_MSG_IN_DEBUG_ON); _inMessageStrings.insert("OFF", COM_MSG_IN_DEBUG_OFF); _inMessageStrings.insert("MESSAGE", COM_MSG_IN_DEBUG_MESSAGE); _inMessageStrings.insert("LOCK", COM_MSG_IN_DEBUG_LOCK); _debugMessageStrings.insert("DEBUG"); _debugMessageStrings.insert("MESSAGE"); _debugMessageStrings.insert("LOCK"); } void CommunicationManager::initOutMessageStrings() { // Launch session on server _outMessageStrings.insert(COM_MSG_OUT_GO, "GO"); // Widget status change _outMessageStrings.insert(COM_MSG_OUT_ENABLE, "ENABLE"); _outMessageStrings.insert(COM_MSG_OUT_DISABLE, "DISABLE"); _outMessageStrings.insert(COM_MSG_OUT_SET, "SET"); // Debug mode _outMessageStrings.insert(COM_MSG_OUT_DEBUG, "DEBUG"); _outMessageStrings.insert(COM_MSG_OUT_DEBUG_ON, "ON"); _outMessageStrings.insert(COM_MSG_OUT_DEBUG_OFF, "OFF"); _outMessageStrings.insert(COM_MSG_OUT_DEBUG_STEP, "STEP"); } starpu-1.1.5/starpu-top/sessionsetupmanager.cpp0000644000373600000000000003666612571536557016730 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "sessionsetupmanager.h" #include "mainwindow.h" #include "widgetwindowsmanager.h" #include "abstractwidgetwindow.h" #include "datawidget.h" #include "dataaggregatorwidget.h" #include #include #include #include SessionSetupManager::SessionSetupManager(MainWindow *mainWindow) { static bool instanciated = false; Q_ASSERT_X(instanciated == false, "SessionSetupManager's' constructor", "Singleton pattern violated - " "SessionSetupManager instanciated more than once"); qDebug() << "SessionSetupManager : initializing"; _mainWindow = mainWindow; _sessionStateSettings = 0; instanciated = true; } SessionSetupManager::~SessionSetupManager() { delete _sessionStateSettings; } bool SessionSetupManager::saveSessionSetup(QString sessionSetupName) { QString fileName = SESSION_SETUPS_DIR + "/" + sessionSetupName + SESSION_SETUPS_FILEEXT; if (QFile(fileName).exists() == true) { if (QFile(fileName).remove() == false) { qDebug() << "SessionSetupManager : " "coudln't reinitialize session setup file before saving !"; return false; } } // Init settings delete _sessionStateSettings; _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat); qDebug() << "SessionSetupManager : saving session setup to" << _sessionStateSettings->fileName(); // Save data setup _sessionStateSettings->beginWriteArray("datadescriptions", _mainWindow->dataDescriptions()->count()); for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++) { _sessionStateSettings->setArrayIndex(i); int dataId = _mainWindow->dataDescriptions()->at(i)->id; DataType type = _mainWindow->dataDescriptions()->at(i)->type; DataWidgetType widget = _mainWindow->dataDescriptions()->at(i)->widget; _sessionStateSettings->setValue("id", dataId); _sessionStateSettings->setValue("type", (int) type); _sessionStateSettings->setValue("widget", (int) widget); } _sessionStateSettings->endArray(); // Save parameters setup _sessionStateSettings->beginWriteArray("paramdescriptions", _mainWindow->paramDescriptions()->count()); for (int i = 0; i < _mainWindow->paramDescriptions()->count(); i++) { _sessionStateSettings->setArrayIndex(i); int paramId = _mainWindow->paramDescriptions()->at(i)->id; ParamType type = _mainWindow->paramDescriptions()->at(i)->type; InteractiveWidgetType widget = _mainWindow->paramDescriptions()->at(i)->widget; _sessionStateSettings->setValue("id", paramId); _sessionStateSettings->setValue("type", (int) type); _sessionStateSettings->setValue("widget", (int) widget); } _sessionStateSettings->endArray(); // Save main window setup _sessionStateSettings->beginGroup("mainwindow"); _sessionStateSettings->setValue("displaymode", (int) _mainWindow->displayMode()); _sessionStateSettings->setValue("geometry", _mainWindow->saveGeometry()); _sessionStateSettings->endGroup(); // Save parameters dock setup _sessionStateSettings->beginGroup("parametersdock"); _sessionStateSettings->setValue("floating", _mainWindow->parametersDock()->isFloating()); _sessionStateSettings->setValue("geometry", _mainWindow->parametersDock()->saveGeometry()); _sessionStateSettings->endGroup(); // Save widget windows setup _sessionStateSettings->beginWriteArray("widgetwindows", _mainWindow->widgetWindowsManager() ->widgetWindows().count()); for (int i = 0; i < _mainWindow->widgetWindowsManager()->widgetWindows().count(); i++) { _sessionStateSettings->setArrayIndex(i); // Retrive general information to save bool inside = _mainWindow->widgetWindowsManager()->widgetWindows().at( i)->isInside(); QByteArray windowGeometry; if (inside == false) { windowGeometry = _mainWindow->widgetWindowsManager() ->widgetWindows().at(i)->saveGeometry(); } else { // Save the geometry of the parent subwindow, not the widget itself windowGeometry = _mainWindow->widgetWindowsManager() ->widgetWindows().at(i)->parentWidget()->saveGeometry(); } DataWidget *dataWidget = qobject_cast ( _mainWindow->widgetWindowsManager()->widgetWindows().at(i)); if (dataWidget != 0) { // Data widgets // Retrieve specific information to save int dataId = dataWidget->description()->id; // Save information _sessionStateSettings->beginGroup("datawidget"); _sessionStateSettings->setValue("inside", inside); _sessionStateSettings->setValue("geometry", windowGeometry); _sessionStateSettings->setValue("dataid", dataId); _sessionStateSettings->endGroup(); } else { // Data aggregator widgets DataAggregatorWidget *dataAggregatorWidget = qobject_cast< DataAggregatorWidget*> ( _mainWindow->widgetWindowsManager()->widgetWindows().at(i)); // Retrieve specific information to save QList aggregatedData = dataAggregatorWidget->aggregatedData(); QString aggregatedDataString; for (int i = 0; i < aggregatedData.count(); i++) { aggregatedDataString.append( QString::number(aggregatedData.at(i)) + ","); } // Save information _sessionStateSettings->beginGroup("dataaggregatorwidget"); _sessionStateSettings->setValue("inside", inside); _sessionStateSettings->setValue("geometry", windowGeometry); _sessionStateSettings->setValue("dataids", aggregatedDataString); _sessionStateSettings->endGroup(); } } _sessionStateSettings->endArray(); // Write the session setup _sessionStateSettings->sync(); return true; } bool SessionSetupManager::loadSessionSetup(QString sessionName) { QString fileName = SESSION_SETUPS_DIR + "/" + sessionName + SESSION_SETUPS_FILEEXT; if (QFile(fileName).exists() == false) { qDebug() << "SessionSetupManager : session setup file doesn't exist !"; return false; } delete _sessionStateSettings; _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat); qDebug() << "SessionSetupManager : loading session setup from" << _sessionStateSettings->fileName(); // Load data descriptions setup QList < DataDescriptionSetup > dataDescriptionsSetup; int size = _sessionStateSettings->beginReadArray("datadescriptions"); for (int i = 0; i < size; i++) { _sessionStateSettings->setArrayIndex(i); DataDescriptionSetup dataDescriptionSetup; bool ok = false; dataDescriptionSetup.id = _sessionStateSettings->value("id").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data widget !"; return false; } dataDescriptionSetup.type = (DataType) _sessionStateSettings->value( "type").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data widget !"; return false; } if (dataDescriptionSetup.type != _mainWindow->dataDescriptionFromId( dataDescriptionSetup.id)->type) { qDebug() << "SessionSetupManager : " "incompatible data types between the sessions !"; return false; } dataDescriptionSetup.widget = (DataWidgetType) _sessionStateSettings->value("widget").toInt( &ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data widget !"; return false; } dataDescriptionsSetup.append(dataDescriptionSetup); } _sessionStateSettings->endArray(); // Load param descriptions setup QList < ParamDescriptionSetup > paramDescriptionsSetup; size = _sessionStateSettings->beginReadArray("paramdescriptions"); for (int i = 0; i < size; i++) { _sessionStateSettings->setArrayIndex(i); ParamDescriptionSetup paramDescriptionSetup; bool ok = false; paramDescriptionSetup.id = _sessionStateSettings->value("id").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect param id !"; return false; } paramDescriptionSetup.type = (ParamType) _sessionStateSettings->value( "type").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect param type !"; return false; } if (paramDescriptionSetup.type != _mainWindow->paramDescriptionFromId( paramDescriptionSetup.id)->type) { qDebug() << "SessionSetupManager : " "incompatible data types between the sessions !"; return false; } paramDescriptionSetup.widget = (InteractiveWidgetType) _sessionStateSettings ->value("widget").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect param widget !"; return false; } paramDescriptionsSetup.append(paramDescriptionSetup); } _sessionStateSettings->endArray(); emit descriptionsSetupLoaded(dataDescriptionsSetup, paramDescriptionsSetup); // Load main window setup MainWindowSetup mainWindowSetup; _sessionStateSettings->beginGroup("mainwindow"); mainWindowSetup.geometry = _sessionStateSettings->value("geometry").toByteArray(); bool ok = false; mainWindowSetup.displayMode = (DisplayMode) _sessionStateSettings->value( "displaymode").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect main window display mode !"; return false; } _sessionStateSettings->endGroup(); emit mainWindowSetupLoaded(mainWindowSetup); // Load main window setup ParametersDockSetup parametersDockSetup; _sessionStateSettings->beginGroup("mainwindow"); parametersDockSetup.floating = _sessionStateSettings->value("floating").toBool(); parametersDockSetup.geometry = _sessionStateSettings->value("geometry").toByteArray(); _sessionStateSettings->endGroup(); emit parametersDockSetupLoaded(parametersDockSetup); // Load widget windows setup QList < DataWidgetSetup > dataWidgetsSetup; QList < DataAggregatorWidgetSetup > dataAggregatorWidgetsSetup; size = _sessionStateSettings->beginReadArray("widgetwindows"); for (int i = 0; i < size; i++) { _sessionStateSettings->setArrayIndex(i); QString currentGroup = _sessionStateSettings->childGroups().at(0); if (currentGroup.compare("datawidget") == 0) { _sessionStateSettings->beginGroup("datawidget"); DataWidgetSetup dataWidgetSetup; dataWidgetSetup.inside = _sessionStateSettings->value("inside").toBool(); dataWidgetSetup.geometry = _sessionStateSettings->value("geometry").toByteArray(); bool ok = false; dataWidgetSetup.dataId = _sessionStateSettings->value("dataid").toInt(&ok); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data id for the data widget !"; return false; } dataWidgetsSetup.append(dataWidgetSetup); _sessionStateSettings->endGroup(); } else if (currentGroup.compare("dataaggregatorwidget") == 0) { _sessionStateSettings->beginGroup("dataaggregatorwidget"); DataAggregatorWidgetSetup dataAggregatorWidgetSetup; dataAggregatorWidgetSetup.inside = _sessionStateSettings->value( "inside").toBool(); dataAggregatorWidgetSetup.geometry = _sessionStateSettings->value( "geometry").toByteArray(); QString dataIdsString = _sessionStateSettings->value("dataids").toString(); QStringList dataIdsStringParts = dataIdsString.split(",", QString::SkipEmptyParts); QList dataIds; for (int i = 0; i < dataIdsStringParts.count(); i++) { QString dataIdsStringPart = dataIdsStringParts.at(i); bool ok = false; dataIds.append(dataIdsStringPart.toInt(&ok)); if (ok == false) { qDebug() << "SessionSetupManager : " "attempted to load incorrect data id for data aggregator widget !"; return false; } } dataAggregatorWidgetSetup.dataIds = dataIds; dataAggregatorWidgetsSetup.append(dataAggregatorWidgetSetup); _sessionStateSettings->endGroup(); } else { qDebug() << "SessionSetupManager : " "attempted to load unknow window widget type !"; return false; } } _sessionStateSettings->endArray(); emit widgetWindowsSetupLoaded(dataWidgetsSetup, dataAggregatorWidgetsSetup); return true; } starpu-1.1.5/starpu-top/datawidget.cpp0000644000373600000000000003136512571536555014733 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "datawidget.h" #include "mainwindow.h" #include "widgetwindowsmanager.h" #include "configurationmanager.h" #include #include #include #include #include #include #include "qledindicator/qledindicator.h" #include #include #include #include #include #include DataWidget::DataWidget(DataDescription *dataDescription, WidgetWindowsManager *widgetWindowsManager, MainWindow *mainWindow, bool inside) : AbstractWidgetWindow(widgetWindowsManager, mainWindow, inside) { _dataDescription = dataDescription; _internalWidget = 0; // For the plot widget _curve = 0; _curveData = 0; _dataWidgetNames = _mainWindow->dataWidgetNames(); _dataWidgetPossibilities = _mainWindow->dataWidgetPossibilities() ->value( _dataDescription->type).values(); // Init context menu actions QActionGroup *actionGroup = new QActionGroup(this); for (int i = 0; i < _dataWidgetPossibilities.count(); i++) { QAction *action = new QAction( _dataWidgetNames ->value(_dataWidgetPossibilities.at(i)), actionGroup); action->setCheckable(true); if (_dataWidgetPossibilities.at(i) == _dataDescription->widget) { action->setChecked(true); } QObject::connect(action, SIGNAL(triggered()), this, SLOT(widgetTypeChanged())); actionGroup->addAction(action); } addActions(actionGroup->actions()); // Set attributes setContextMenuPolicy(Qt::ActionsContextMenu); // Init GUI setWindowTitle(_dataDescription->descriptionString); setWindowIcon(QIcon(":/images/widget.png")); // Set layout QVBoxLayout *globalLayout = new QVBoxLayout(); setLayout(globalLayout); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout->addWidget(_inOutButton); QString labelText = _dataDescription->descriptionString; if (_dataDescription->descriptionString.size() > 14) { labelText.truncate(12); labelText.append("..."); } QLabel *dataTitle = new QLabel(labelText); dataTitle->setToolTip(_dataDescription->descriptionString); topLayout->addWidget(dataTitle, 0, Qt::AlignHCenter); dataTitle->setFixedHeight(dataTitle->sizeHint().height()); globalLayout->addLayout(topLayout); // Create internal widget createInternalWidget(); setParent(0); // Needed if it is a flying window // Will be updated anyway if it goes into the MDI area // However the object HAS to be constructed with the main window as parent // so it can connect to its slots. // Setup automatic cleanup QObject::connect(this, SIGNAL(destroyed()), _mainWindow, SLOT(removeDestroyedDataWidgets())); qDebug() << "DataWidget : initializing [desc" << _dataDescription->descriptionString << "; id" << _dataDescription->id << "; type" << _dataDescription->type << "; min" << _dataDescription->valMin << "; max" << _dataDescription->valMax << "; widget" << _dataDescription->widget << "]"; } DataWidget::~DataWidget() { qDebug() << "DataWidget" << _dataDescription->id << ": terminating"; delete _internalWidget; } void DataWidget::closeEvent(QCloseEvent *ce) { if (isEnabled() == true) {// The widget is alive (session active) _mainWindow->updateDataWidgetType(_dataDescription->id, DATA_WIDGET_NONE); } ce->accept(); } void DataWidget::recreateInternalWidget() { if (_internalWidget != 0) { _internalWidget->close(); _internalWidget = 0; } createInternalWidget(); adjustSize(); if (isInside() == true) { parentWidget()->resize(minimumInternalWidgetSize() + QSize(85, 85)); } updateAction(_dataDescription->widget); } void DataWidget::updateAction(DataWidgetType newWidget) { for (int i = 0; i < actions().count(); i++) { if (actions().at(i)->text().compare(_dataWidgetNames->value(newWidget)) == 0) { actions().at(i)->setChecked(true); return; } } } void DataWidget::createInternalWidget() { qDebug() << "Creating the data widget for data id" << _dataDescription->id; switch (_dataDescription->widget) { case DATA_WIDGET_LCD: { _internalWidget = new QLCDNumber(this); _internalWidget->setMinimumSize(50, 50); break; } case DATA_WIDGET_PLOT: { _internalWidget = new QwtPlot(this); _curve = new QwtPlotCurve(_dataDescription->descriptionString); if (_mainWindow->configurationManager()->antialiasing() == true) { _curve->setRenderHint(QwtPlotItem::RenderAntialiased); } _curve->attach((QwtPlot*) _internalWidget); _curveData = new CurveData; _curveData->xData = new QVector (); _curveData->yData = new QVector (); _internalWidget->setMinimumSize(300, 200); break; } case DATA_WIDGET_LEVEL: { _internalWidget = new QwtThermo(this); QwtThermo *widget = (QwtThermo*) _internalWidget; widget->setRange(_dataDescription->valMin, _dataDescription->valMax); _internalWidget->setMinimumSize(100, 200); break; } case DATA_WIDGET_LED: { _internalWidget = new QLedIndicator(this); _internalWidget->setMinimumSize(50, 50); break; } case DATA_WIDGET_DIAL: { _internalWidget = new QwtDial(this); _internalWidget->setMinimumSize(250, 250); QwtDial *widget = (QwtDial*) _internalWidget; widget->setReadOnly(true); widget->setWrapping(false); widget->setOrigin(135.0); widget->setRange(_dataDescription->valMin, _dataDescription->valMax); widget->setScaleArc(0.0, 270.0); widget->scaleDraw()->setSpacing(8); QwtDialSimpleNeedle *needle = new QwtDialSimpleNeedle( QwtDialSimpleNeedle::Arrow, true, Qt::red, QColor(Qt::gray).light(130)); widget->setNeedle(needle); widget->setScaleOptions(QwtDial::ScaleTicks | QwtDial::ScaleLabel); widget->setScaleTicks(0, 4, 8); } default: ; } _internalWidget->setAttribute(Qt::WA_DeleteOnClose); layout()->addWidget(_internalWidget); } /* -------------------------------------------------------------------------- */ /* Getters */ /* -------------------------------------------------------------------------- */ DataDescription *DataWidget::description() const { return _dataDescription; } QSize DataWidget::minimumInternalWidgetSize() const { return _internalWidget->minimumSize(); } /* -------------------------------------------------------------------------- */ /* Setters */ /* -------------------------------------------------------------------------- */ void DataWidget::setValue(bool value) { switch (_dataDescription->widget) { case DATA_WIDGET_LED: { QLedIndicator *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setChecked(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } default: ; } emit valueChanged(value, _dataDescription->id); } void DataWidget::setValue(int value) { switch (_dataDescription->widget) { case DATA_WIDGET_PLOT: { QwtPlot *widget = qobject_cast (_internalWidget); if (widget != 0) { _curveData->xData->append(_mainWindow->effectiveRunningTime()); _curveData->yData->append(value); #if QWT_VERSION >= 0x060000 _curve->setRawSamples(_curveData->xData->data(), _curveData->yData->data(), _curveData->xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif widget->replot(); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LCD: { QLCDNumber *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->display(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LEVEL: { QwtThermo *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_DIAL: { QwtDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } default: ; } emit valueChanged(value, _dataDescription->id); } void DataWidget::setValue(double value) { switch (_dataDescription->widget) { case DATA_WIDGET_PLOT: { QwtPlot *widget = qobject_cast (_internalWidget); if (widget != 0) { _curveData->xData->append(_mainWindow->effectiveRunningTime()); _curveData->yData->append(value); #if QWT_VERSION >= 0x060000 _curve->setRawSamples(_curveData->xData->data(), _curveData->yData->data(), _curveData->xData->size()); #else # warning Old version of qwt being used, data aggregator will not work. #endif widget->replot(); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LCD: { QLCDNumber *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->display(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_LEVEL: { QwtThermo *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } case DATA_WIDGET_DIAL: { QwtDial *widget = qobject_cast (_internalWidget); if (widget != 0) { widget->setValue(value); } else { qDebug() << "Bad data widget cast (DataWidget::setValue()) !"; } break; } default: ; } emit valueChanged(value, _dataDescription->id); } void DataWidget::widgetTypeChanged() { QAction *action = (QAction*) QObject::sender(); if(_dataDescription->widget != _dataWidgetNames->key(action->text())) { _mainWindow->updateDataWidgetType(_dataDescription->id, _dataWidgetNames->key(action->text())); } } starpu-1.1.5/starpu-top/StarPU-Top.pro.user.1.30000644000373600000000000002573312571536560016025 00000000000000 RunConfiguration0-BaseEnvironmentBase 2 RunConfiguration0-CommandLineArguments RunConfiguration0-ProFile StarPU-Top.pro RunConfiguration0-RunConfiguration.name StarPU-Top RunConfiguration0-UseDyldImageSuffix false RunConfiguration0-UseTerminal false RunConfiguration0-UserEnvironmentChanges RunConfiguration0-UserSetName false RunConfiguration0-UserSetWorkingDirectory false RunConfiguration0-UserWorkingDirectory RunConfiguration0-type Qt4ProjectManager.Qt4RunConfiguration activeRunConfiguration 0 activebuildconfiguration Debug buildConfiguration-Debug Debug 0 0 2 buildConfiguration-Release Release 0 0 buildconfiguration-Debug-buildstep0 Debug DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xjteyoVy4U,guid=2ff41d777326f17fae0e40cc4d946e56 DESKTOP_SESSION=gnome DISPLAY=:0.0 DM_CONTROL=/var/run/xdmctl FLUENT_EDUCATIONAL=yes GNOME_DESKTOP_SESSION_ID=this-is-deprecated GNOME_KEYRING_CONTROL=/tmp/keyring-rP2qY8 GPG_AGENT_INFO=/tmp/gpg-G3amdS/S.gpg-agent:4516:1 GTK_MODULES=canberra-gtk-module HOME=/net/cremi/wbraik HOOPS_DRIVER=X11 JAVA=/usr/lib/jvm/java-6-sun/bin/java JAVA_HOME=/usr/lib/jvm/java-6-sun KRB5CCNAME=FILE:/tmp/krb5cc_18733_aqBO3a LANG=fr_FR.UTF-8 LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=wbraik ORBIT_SOCKETDIR=/tmp/orbit-wbraik PATH=/usr/bin:/usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/net/cremi/wbraik QTDIR=/usr/share/qt4 SESSION_MANAGER=local/lebris:@/tmp/.ICE-unix/3965,unix/lebris:/tmp/.ICE-unix/3965 SHELL=/bin/bash SHLVL=0 SPEECHD_PORT=25293 SSH_AGENT_PID=4515 SSH_AUTH_SOCK=/tmp/keyring-rP2qY8/ssh UDEdir= USER=wbraik USERCACHE=/tmp/cache-wbraik WINDOWPATH=8 XDG_CONFIG_DIRS=/usr/share/ubuntustudio-menu/:/etc/xdg/ XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ XDG_SESSION_COOKIE=a3e0486a642ad65955ad302d4ce13336-1301573197.240134-346611465 XDM_MANAGED=method=classic /autofs/netapp/account/cremi/wbraik/Dropbox/Projets/Projets partagés/StarPU-Top/StarPU-Top.pro -spec linux-g++ -r CONFIG+=debug /usr/bin/qmake-qt4 true /autofs/netapp/account/cremi/wbraik/Dropbox/Projets/Projets partagés/StarPU-Top buildconfiguration-Debug-buildstep1 Debug DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xjteyoVy4U,guid=2ff41d777326f17fae0e40cc4d946e56 DESKTOP_SESSION=gnome DISPLAY=:0.0 DM_CONTROL=/var/run/xdmctl FLUENT_EDUCATIONAL=yes GNOME_DESKTOP_SESSION_ID=this-is-deprecated GNOME_KEYRING_CONTROL=/tmp/keyring-rP2qY8 GPG_AGENT_INFO=/tmp/gpg-G3amdS/S.gpg-agent:4516:1 GTK_MODULES=canberra-gtk-module HOME=/net/cremi/wbraik HOOPS_DRIVER=X11 JAVA=/usr/lib/jvm/java-6-sun/bin/java JAVA_HOME=/usr/lib/jvm/java-6-sun KRB5CCNAME=FILE:/tmp/krb5cc_18733_aqBO3a LANG=fr_FR.UTF-8 LD_LIBRARY_PATH=/usr/lib/qtcreator LOGNAME=wbraik ORBIT_SOCKETDIR=/tmp/orbit-wbraik PATH=/usr/bin:/usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/net/cremi/wbraik QTDIR=/usr/share/qt4 SESSION_MANAGER=local/lebris:@/tmp/.ICE-unix/3965,unix/lebris:/tmp/.ICE-unix/3965 SHELL=/bin/bash SHLVL=0 SPEECHD_PORT=25293 SSH_AGENT_PID=4515 SSH_AUTH_SOCK=/tmp/keyring-rP2qY8/ssh UDEdir= USER=wbraik USERCACHE=/tmp/cache-wbraik WINDOWPATH=8 XDG_CONFIG_DIRS=/usr/share/ubuntustudio-menu/:/etc/xdg/ XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ XDG_SESSION_COOKIE=a3e0486a642ad65955ad302d4ce13336-1301573197.240134-346611465 XDM_MANAGED=method=classic false -w /usr/bin/make true /autofs/netapp/account/cremi/wbraik/Dropbox/Projets/Projets partagés/StarPU-Top buildconfiguration-Debug-cleanstep0 Debug true clean buildconfiguration-Release-buildstep0 Release buildconfiguration-Release-buildstep1 Release buildconfiguration-Release-cleanstep0 Release buildconfigurations Debug Release buildstep0 buildstep1 buildsteps trolltech.qt4projectmanager.qmake trolltech.qt4projectmanager.make cleanstep0 true cleansteps trolltech.qt4projectmanager.make defaultFileEncoding System project starpu-1.1.5/starpu-top/debugconsole.cpp0000644000373600000000000000313312571536560015253 00000000000000/* = StarPU-Top for StarPU = Copyright (C) 2011 William Braik Yann Courtois Jean-Marie Couteyen Anthony Roy This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "debugconsole.h" #include "ui_debugconsole.h" DebugConsole::DebugConsole(QWidget *parent) : QWidget(parent), ui(new Ui::DebugConsole) { ui->setupUi(this); ui->stepButton->setEnabled(false); QObject::connect(ui->stepButton, SIGNAL(clicked()), this, SLOT(step())); } DebugConsole::~DebugConsole() { delete ui; } void DebugConsole::appendDebugLogMessage(QString debugMessage) { ui->console->append("INFO : " + debugMessage); } void DebugConsole::appendDebugLockMessage(QString lockMessage) { ui->stepButton->setEnabled(true); ui->console->append("LOCK : " + lockMessage); } void DebugConsole::clearConsole() { ui->console->clear(); } void DebugConsole::step() { ui->stepButton->setEnabled(false); emit stepped(); } starpu-1.1.5/starpu-1.1.pc.in0000644000373600000000000000255212571536567012537 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012, 2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ pkglibdir=@pkglibdir@ includedir=@includedir@ # When the GCC plug-in is available, the following lines indicate # where it is installed. @GCC_PLUGIN_DIR_PKGCONFIG@ @GCC_PLUGIN_PKGCONFIG@ Name: starpu Description: offers support for heterogeneous multicore architecture Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/starpu/@STARPU_EFFECTIVE_VERSION@ @STARPU_CUDA_CPPFLAGS@ @SIMGRID_CFLAGS@ Libs: -L${libdir} -lstarpu-@STARPU_EFFECTIVE_VERSION@ @STARPU_OPENCL_LDFLAGS@ @STARPU_CUDA_LDFLAGS@ @STARPU_SC_HYPERVISOR@ Libs.private: @LDFLAGS@ @LIBS@ @LIBSTARPU_LDFLAGS@ Requires: @HWLOC_REQUIRES@ starpu-1.1.5/INSTALL0000644000373600000000000001752412571536554011025 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2012 Université de Bordeaux # Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even 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 * Running StarPU Applications on Microsoft Visual C 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 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/mvsc. To execute a StarPU application, you first need to set the environment variable STARPUPATH. c:\....> cd c:\cygwin\home\ci\starpu\ c:\....> set STARPUPATH=c:\cygwin\home\ci\starpu\ c:\....> cd bin\mvsc 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 STARPUPATH=c:\cygwin\home\ci\starpu\ c:\....> cd bin\mvsc c:\....> starpu_exec.bat ..\..\..\..\examples\basic_examples\hello_world.c MVSC StarPU Execution ... /out:hello_world.exe ... Hello world (params = {1, 2.00000}) Callback function got argument 0000042 c:\....> starpu-1.1.5/Makefile.am0000644000373600000000000001252012571536554012017 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. ACLOCAL_AMFLAGS=-I m4 CLEANFILES = *.gcno *.gcda *.linkinfo SUBDIRS = src SUBDIRS += tools tests SUBDIRS += doc if USE_MPI SUBDIRS += mpi endif if BUILD_EXAMPLES SUBDIRS += examples endif if BUILD_SOCL SUBDIRS += socl endif if BUILD_GCC_PLUGIN SUBDIRS += gcc-plugin endif if BUILD_STARPUFFT SUBDIRS += starpufft endif if STARPU_BUILD_SC_HYPERVISOR SUBDIRS += sc_hypervisor endif pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstarpu.pc starpu-1.0.pc starpu-1.1.pc versincludedir = $(includedir)/starpu/$(STARPU_EFFECTIVE_VERSION) versinclude_HEADERS = \ include/starpu.h \ include/starpu_bitmap.h \ include/starpu_data_filters.h \ include/starpu_data_interfaces.h \ include/starpu_worker.h \ include/starpu_task.h \ include/starpu_task_bundle.h \ include/starpu_task_list.h \ include/starpu_task_util.h \ include/starpu_data.h \ include/starpu_perfmodel.h \ include/starpu_util.h \ include/starpu_fxt.h \ include/starpu_cuda.h \ include/starpu_opencl.h \ include/starpu_expert.h \ include/starpu_profiling.h \ include/starpu_bound.h \ include/starpu_scheduler.h \ include/starpu_sched_ctx.h \ include/starpu_sched_ctx_hypervisor.h \ include/starpu_top.h \ include/starpu_deprecated_api.h \ include/starpu_hash.h \ include/starpu_rand.h \ include/starpu_cublas.h \ include/starpu_driver.h \ include/starpu_stdlib.h \ include/starpu_thread.h \ include/starpu_thread_util.h \ include/starpu_simgrid_wrap.h \ include/starpu_mod.f90 nodist_versinclude_HEADERS = \ include/starpu_config.h noinst_HEADERS = \ include/pthread_win32/pthread.h \ include/pthread_win32/semaphore.h all-local: if STARPU_DEVEL @if grep -r sys/time.h $$( find $(srcdir)/examples $(srcdir)/tests $(srcdir)/src $(srcdir)/mpi/src $(srcdir)/include -name \*.[ch] -a \! -name starpu_util.h -a \! -name timer.h -a \! -name loader.c ) ; \ then \ echo "Please do not include sys/time, it is not available on Windows, include starpu_util.h and use starpu_timing_now() instead" ; \ false ; \ fi @if grep -re '\' $$( find $(srcdir)/src $(srcdir)/mpi/src $(srcdir)/include -name \*.[ch] -a \! -name starpu_util.h -a \! -name utils.c) ; \ then \ echo "Please do not use getenv, use starpu_getenv instead, which catches unsafe uses"; \ false ; \ fi endif if BUILD_STARPU_TOP all-local: starpu-top/starpu_top$(EXEEXT) starpu-top/starpu_top$(EXEEXT): cd starpu-top ; $(QMAKE) ; $(MAKE) clean-local: cd starpu-top ; $(QMAKE) ; $(MAKE) clean ; $(RM) Makefile $(RM) starpu-top/starpu_top.1 starpu-top/starpu_top$(EXEEXT) # TODO: resources install-exec-local: $(MKDIR_P) $(DESTDIR)$(bindir) -$(INSTALL_STRIP_PROGRAM) starpu-top/starpu_top$(EXEEXT) $(DESTDIR)$(bindir) uninstall-local: $(RM) $(DESTDIR)$(bindir)/starpu_top$(EXEEXT) $(RM) starpu-top/starpu_top$(EXEEXT) $(RM) starpu-top/Makefile if STARPU_HAVE_HELP2MAN starpu-top/starpu_top.1: starpu-top/starpu_top$(EXEEXT) help2man --no-discard-stderr -N --output=$@ starpu-top/starpu_top$(EXEEXT) dist_man1_MANS =\ starpu-top/starpu_top.1 endif endif if STARPU_HAVE_WINDOWS txtdir = ${prefix} else txtdir = ${docdir} endif txt_DATA = AUTHORS COPYING.LGPL README STARPU-REVISION EXTRA_DIST = AUTHORS COPYING.LGPL README STARPU-VERSION STARPU-REVISION build-aux/svn2cl.xsl DISTCLEANFILES = STARPU-REVISION include starpu-top/extradist showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET ctags-local: $(CTAGS) -R -I LIST_TYPE # Cyclomatic complexity reports. # The pmccabe tool, see . PMCCABE = pmccabe VC_URL = "https://gforge.inria.fr/scm/viewvc.php/trunk/%FILENAME%?view=markup&root=starpu" # Generate a cyclomatic complexity report. Note that examples and tests are # excluded because they're not particularly relevant, and more importantly # they all have a function called `main', which clobbers the report. cyclomatic-complexity.html: $(PMCCABE) \ `find \( -name examples -o -name tests -o -path ./tools/dev/experimental \) -prune -o -name \*.c` \ | sort -nr \ | $(AWK) -f ${top_srcdir}/build-aux/pmccabe2html \ -v lang=html -v name="$(PACKAGE_NAME)" \ -v vcurl=$(VC_URL) \ -v url="$(PACKAGE_URL)" \ -v css=${top_srcdir}/build-aux/pmccabe.css \ -v cut_dir=${top_srcdir}/ \ > $@-tmp mv $@-tmp $@ starpu-1.1.5/src/0002755000373600000000000000000012571541161010622 500000000000000starpu-1.1.5/src/profiling/0002755000373600000000000000000012571541161012613 500000000000000starpu-1.1.5/src/profiling/profiling.c0000644000373600000000000003112612571536574014705 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include static struct starpu_profiling_worker_info worker_info[STARPU_NMAXWORKERS]; static starpu_pthread_mutex_t worker_info_mutex[STARPU_NMAXWORKERS]; /* In case the worker is still sleeping when the user request profiling info, * we need to account for the time elasped while sleeping. */ static unsigned worker_registered_sleeping_start[STARPU_NMAXWORKERS]; static struct timespec sleeping_start_date[STARPU_NMAXWORKERS]; static unsigned worker_registered_executing_start[STARPU_NMAXWORKERS]; static struct timespec executing_start_date[STARPU_NMAXWORKERS]; /* Store the busid of the different (src, dst) pairs. busid_matrix[src][dst] * contains the busid of (src, dst) or -1 if the bus was not registered. */ struct node_pair { int src; int dst; struct starpu_profiling_bus_info *bus_info; }; static int busid_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; static struct starpu_profiling_bus_info bus_profiling_info[STARPU_MAXNODES][STARPU_MAXNODES]; static struct node_pair busid_to_node_pair[STARPU_MAXNODES*STARPU_MAXNODES]; static unsigned busid_cnt = 0; static void _starpu_bus_reset_profiling_info(struct starpu_profiling_bus_info *bus_info); /* * 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(); } void _starpu_profiling_reset_counters() { int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { _starpu_worker_reset_profiling_info(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) { 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(); } return prev_value; } void _starpu_profiling_init(void) { const char *env; int worker; for (worker = 0; worker < STARPU_NMAXWORKERS; worker++) { STARPU_PTHREAD_MUTEX_INIT(&worker_info_mutex[worker], NULL); } _starpu_profiling_reset_counters(); if ((env = starpu_getenv("STARPU_PROFILING")) && atoi(env)) { ANNOTATE_HAPPENS_AFTER(&_starpu_profiling); _starpu_profiling = STARPU_PROFILING_ENABLE; ANNOTATE_HAPPENS_BEFORE(&_starpu_profiling); } } void _starpu_profiling_terminate(void) { } /* * Task profiling */ struct starpu_profiling_task_info *_starpu_allocate_profiling_info_if_needed(struct starpu_task *task) { struct starpu_profiling_task_info *info = NULL; /* If we are benchmarking, we need room for the power consumption */ if (starpu_profiling_status_get() || (task->cl && task->cl->power_model && (task->cl->power_model->benchmarking || _starpu_get_calibrate_flag()))) { info = (struct starpu_profiling_task_info *) calloc(1, sizeof(struct starpu_profiling_task_info)); STARPU_ASSERT(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].power_consumed = 0; /* We detect if the worker is already sleeping or doing some * computation */ enum _starpu_worker_status status = _starpu_worker_get_status(workerid); if (status == STATUS_SLEEPING) { 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_reset_profiling_info(int workerid) { STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); _starpu_worker_reset_profiling_info_with_lock(workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } 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]); 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]); 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_update_profiling_info_executing(int workerid, struct timespec *executing_time, int executed_tasks, uint64_t used_cycles, uint64_t stall_cycles, double power_consumed) { if (starpu_profiling_status_get()) { STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); if (executing_time) starpu_timespec_accumulate(&worker_info[workerid].executing_time, executing_time); worker_info[workerid].used_cycles += used_cycles; worker_info[workerid].stall_cycles += stall_cycles; worker_info[workerid].power_consumed += power_consumed; worker_info[workerid].executed_tasks += executed_tasks; STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); } else /* Not thread safe, shouldn't be too much a problem */ worker_info[workerid].executed_tasks += executed_tasks; } int starpu_profiling_worker_get_info(int workerid, struct starpu_profiling_worker_info *info) { if (!starpu_profiling_status_get()) { /* Not thread safe, shouldn't be too much a problem */ info->executed_tasks = worker_info[workerid].executed_tasks; } STARPU_PTHREAD_MUTEX_LOCK(&worker_info_mutex[workerid]); if (info) { /* The total time is computed in a lazy fashion */ struct timespec now; _starpu_clock_gettime(&now); /* In case some worker is currently sleeping, we take into * account the time spent since it registered. */ if (worker_registered_sleeping_start[workerid]) { struct timespec sleeping_time; starpu_timespec_sub(&now, &sleeping_start_date[workerid], &sleeping_time); starpu_timespec_accumulate(&worker_info[workerid].sleeping_time, &sleeping_time); } if (worker_registered_executing_start[workerid]) { struct timespec executing_time; starpu_timespec_sub(&now, &executing_start_date[workerid], &executing_time); starpu_timespec_accumulate(&worker_info[workerid].executing_time, &executing_time); } /* total_time = now - start_time */ starpu_timespec_sub(&now, &worker_info[workerid].start_time, &worker_info[workerid].total_time); memcpy(info, &worker_info[workerid], sizeof(struct starpu_profiling_worker_info)); } _starpu_worker_reset_profiling_info_with_lock(workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&worker_info_mutex[workerid]); return 0; } /* When did the task reach the scheduler ? */ void _starpu_profiling_set_task_push_start_time(struct starpu_task *task) { if (!starpu_profiling_status_get()) return; struct starpu_profiling_task_info *profiling_info; profiling_info = task->profiling_info; if (profiling_info) _starpu_clock_gettime(&profiling_info->push_start_time); } void _starpu_profiling_set_task_push_end_time(struct starpu_task *task) { if (!starpu_profiling_status_get()) return; struct starpu_profiling_task_info *profiling_info; profiling_info = task->profiling_info; if (profiling_info) _starpu_clock_gettime(&profiling_info->push_end_time); } /* * Bus profiling */ void _starpu_initialize_busid_matrix(void) { int i, j; for (j = 0; j < STARPU_MAXNODES; j++) for (i = 0; i < STARPU_MAXNODES; i++) busid_matrix[i][j] = -1; busid_cnt = 0; } static void _starpu_bus_reset_profiling_info(struct starpu_profiling_bus_info *bus_info) { _starpu_clock_gettime(&bus_info->start_time); bus_info->transferred_bytes = 0; bus_info->transfer_count = 0; } int _starpu_register_bus(int src_node, int dst_node) { if (busid_matrix[src_node][dst_node] != -1) return -EBUSY; int busid = STARPU_ATOMIC_ADD(&busid_cnt, 1) - 1; busid_matrix[src_node][dst_node] = busid; busid_to_node_pair[busid].src = src_node; busid_to_node_pair[busid].dst = dst_node; busid_to_node_pair[busid].bus_info = &bus_profiling_info[src_node][dst_node]; _starpu_bus_reset_profiling_info(&bus_profiling_info[src_node][dst_node]); return busid; } int starpu_bus_get_count(void) { return busid_cnt; } int starpu_bus_get_id(int src, int dst) { return busid_matrix[src][dst]; } int starpu_bus_get_src(int busid) { return busid_to_node_pair[busid].src; } int starpu_bus_get_dst(int busid) { return busid_to_node_pair[busid].dst; } int starpu_bus_get_profiling_info(int busid, struct starpu_profiling_bus_info *bus_info) { int src_node = busid_to_node_pair[busid].src; int dst_node = busid_to_node_pair[busid].dst; /* XXX protect all this method with a mutex */ if (bus_info) { struct timespec now; _starpu_clock_gettime(&now); /* total_time = now - start_time */ starpu_timespec_sub(&now, &bus_profiling_info[src_node][dst_node].start_time, &bus_profiling_info[src_node][dst_node].total_time); memcpy(bus_info, &bus_profiling_info[src_node][dst_node], sizeof(struct starpu_profiling_bus_info)); } _starpu_bus_reset_profiling_info(&bus_profiling_info[src_node][dst_node]); return 0; } void _starpu_bus_update_profiling_info(int src_node, int dst_node, size_t size) { bus_profiling_info[src_node][dst_node].transferred_bytes += size; bus_profiling_info[src_node][dst_node].transfer_count++; // fprintf(stderr, "PROFILE %d -> %d : %d (cnt %d)\n", src_node, dst_node, size, bus_profiling_info[src_node][dst_node].transfer_count); } #undef starpu_profiling_status_get int starpu_profiling_status_get(void) { int ret; ANNOTATE_HAPPENS_AFTER(&_starpu_profiling); ret = _starpu_profiling; ANNOTATE_HAPPENS_BEFORE(&_starpu_profiling); return ret; } starpu-1.1.5/src/profiling/profiling_helpers.c0000644000373600000000000000753112571536574016432 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_profiling_bus_helper_display_summary(void) { const char *stats; int long long sum_transferred = 0; if (!((stats = starpu_getenv("STARPU_BUS_STATS")) && atoi(stats))) return; fprintf(stderr, "\nData transfer statistics:\n"); fprintf(stderr, "*************************\n"); int busid; int bus_cnt = starpu_bus_get_count(); for (busid = 0; busid < bus_cnt; busid++) { int src, dst; src = starpu_bus_get_src(busid); dst = starpu_bus_get_dst(busid); struct starpu_profiling_bus_info bus_info; starpu_bus_get_profiling_info(busid, &bus_info); int long long transferred = bus_info.transferred_bytes; int long long transfer_cnt = bus_info.transfer_count; double elapsed_time = starpu_timing_timespec_to_us(&bus_info.total_time); fprintf(stderr, "\t%d -> %d\t%.2lf MB\t%.2lfMB/s\t(transfers : %lld - avg %.2lf MB)\n", src, dst, (1.0*transferred)/(1024*1024), transferred/elapsed_time, transfer_cnt, (1.0*transferred)/(transfer_cnt*1024*1024)); sum_transferred += transferred; } fprintf(stderr, "Total transfers: %.2lf MB\n", (1.0*sum_transferred)/(1024*1024)); } void starpu_profiling_worker_helper_display_summary(void) { const char *stats; double sum_consumed = 0.; int profiling = starpu_profiling_status_get(); double overall_time = 0; int workerid; int worker_cnt = starpu_worker_get_count(); if (!((stats = starpu_getenv("STARPU_WORKER_STATS")) && atoi(stats))) return; fprintf(stderr, "\nWorker statistics:\n"); fprintf(stderr, "******************\n"); for (workerid = 0; workerid < worker_cnt; workerid++) { struct starpu_profiling_worker_info info; starpu_profiling_worker_get_info(workerid, &info); char name[64]; starpu_worker_get_name(workerid, name, sizeof(name)); if (profiling) { double total_time = starpu_timing_timespec_to_us(&info.total_time) / 1000.; double executing_time = starpu_timing_timespec_to_us(&info.executing_time) / 1000.; double sleeping_time = starpu_timing_timespec_to_us(&info.sleeping_time) / 1000.; if (total_time > overall_time) overall_time = total_time; fprintf(stderr, "%-32s\n", name); fprintf(stderr, "\t%d task(s)\n\ttotal: %.2lf ms executing: %.2lf ms sleeping: %.2lf ms overhead %.2lf ms\n", info.executed_tasks, total_time, executing_time, sleeping_time, total_time - executing_time - sleeping_time); if (info.used_cycles || info.stall_cycles) fprintf(stderr, "\t%lu Mcy %lu Mcy stall\n", info.used_cycles/1000000, info.stall_cycles/1000000); if (info.power_consumed) fprintf(stderr, "\t%f J consumed\n", info.power_consumed); } else { fprintf(stderr, "\t%-32s\t%d task(s)\n", name, info.executed_tasks); } sum_consumed += info.power_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_consumption = idle_power * overall_time / 1000.; /* J */ fprintf(stderr, "Idle consumption: %.2lf J\n", idle_consumption); sum_consumed += idle_consumption; } } if (profiling && sum_consumed) fprintf(stderr, "Total consumption: %.2lf J\n", sum_consumed); } starpu-1.1.5/src/profiling/bound.h0000644000373600000000000000254412571536574014032 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BOUND_H__ #define __BOUND_H__ #include #include #include /* Are we recording? */ extern int _starpu_bound_recording; /* Record task for bound computation */ extern void _starpu_bound_record(struct _starpu_job *j); /* Record tag dependency: id depends on dep_id */ extern void _starpu_bound_tag_dep(starpu_tag_t id, starpu_tag_t dep_id); /* Record task dependency: j depends on dep_j */ extern void _starpu_bound_task_dep(struct _starpu_job *j, struct _starpu_job *dep_j); /* Record job id dependency: j depends on job_id */ extern void _starpu_bound_job_id_dep(starpu_data_handle_t handle, struct _starpu_job *dep_j, unsigned long job_id); #endif // __BOUND_H__ starpu-1.1.5/src/profiling/profiling.h0000644000373600000000000000641112571536574014711 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PROFILING_H__ #define __PROFILING_H__ #include #include #include #include /* Create a task profiling info structure (with the proper time stamps) in case * profiling is enabled. */ struct starpu_profiling_task_info *_starpu_allocate_profiling_info_if_needed(struct starpu_task *task); /* Clear all the profiling info related to the worker. */ void _starpu_worker_reset_profiling_info(int workerid); /* 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_power); /* 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); /* 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); void _starpu_profiling_terminate(void); void _starpu_profiling_reset_counters(); #endif // __PROFILING_H__ starpu-1.1.5/src/profiling/bound.c0000644000373600000000000007432012571536574014026 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * Record which kinds of tasks have been executed, to later on compute an upper * bound of the performance that could have theoretically been achieved */ #include #include #include #include #ifdef STARPU_HAVE_GLPK_H #include #endif /* STARPU_HAVE_GLPK_H */ /* TODO: output duration between starpu_bound_start and starpu_bound_stop */ /* * 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_VARIATIONS]; /* Other tasks */ struct bound_task *next; }; struct bound_tag_dep { starpu_tag_t tag; starpu_tag_t dep_tag; struct bound_tag_dep *next; }; static struct bound_task_pool *task_pools, *last; static struct bound_task *tasks; static struct bound_tag_dep *tag_deps; int _starpu_bound_recording; static int recorddeps; static int recordprio; static starpu_pthread_mutex_t mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; /* Initialization */ void starpu_bound_start(int deps, int prio) { struct bound_task_pool *tp; struct bound_task *t; struct bound_tag_dep *td; STARPU_PTHREAD_MUTEX_LOCK(&mutex); tp = task_pools; task_pools = NULL; last = NULL; t = tasks; tasks = NULL; td = tag_deps; tag_deps = NULL; _starpu_bound_recording = 1; recorddeps = deps; recordprio = prio; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); while (tp != NULL) { struct bound_task_pool *next = tp->next; free(tp); tp = next; } while (t != NULL) { struct bound_task *next = t->next; free(t); t = next; } while (td != NULL) { struct bound_tag_dep *next = td->next; free(td); td = next; } } /* Whether we will include it in the computation */ static int good_job(struct _starpu_job *j) { /* No codelet, nothing to measure */ if (j->exclude_from_dag) return 0; if (!j->task->cl) return 0; /* No performance model, no time duration estimation */ if (!j->task->cl->model) return 0; /* Only support history based */ if (j->task->cl->model->type != STARPU_HISTORY_BASED && j->task->cl->model->type != STARPU_NL_REGRESSION_BASED) return 0; return 1; } /* 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; t = (struct bound_task *) malloc(sizeof(*t)); memset(t, 0, sizeof(*t)); t->id = j->job_id; t->tag_id = j->task->tag_id; t->use_tag = j->task->use_tag; t->cl = j->task->cl; t->footprint = _starpu_compute_buffers_footprint(j->task->cl?j->task->cl->model:NULL, STARPU_CPU_DEFAULT, 0, j); t->priority = j->task->priority; t->deps = NULL; t->depsn = 0; 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, STARPU_CPU_DEFAULT, 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) { tp = (struct bound_task_pool *) malloc(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; } td = (struct bound_tag_dep *) malloc(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 */ t->deps = (struct task_dep *) realloc(t->deps, ++t->depsn * sizeof(t->deps[0])); t->deps[t->depsn-1].dep = dep_j->bound_task; t->deps[t->depsn-1].size = 0; /* We don't have data information in that case */ } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* Look for job with id ID among our tasks */ static struct bound_task *find_job(unsigned long id) { struct bound_task *t; for (t = tasks; t; t = t->next) if (t->id == id) return t; return NULL; } /* Job J depends on previous job of id ID (which is already finished) */ void _starpu_bound_job_id_dep(starpu_data_handle_t handle, struct _starpu_job *j, unsigned long id) { struct bound_task *t, *dep_t; int i; if (!_starpu_bound_recording || !recorddeps) return; if (!good_job(j)) return; STARPU_PTHREAD_MUTEX_LOCK(&mutex); /* Re-check, this time with mutex held */ if (!_starpu_bound_recording || !recorddeps) { STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } new_task(j); dep_t = find_job(id); if (!dep_t) { fprintf(stderr,"dependency %lu not found !\n", id); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return; } t = j->bound_task; for (i = 0; i < t->depsn; i++) if (t->deps[i].dep == dep_t) { /* Found, just add size */ t->deps[i].size += _starpu_data_get_size(handle); break; } if (i == t->depsn) { /* Not already there, add */ t->deps = (struct task_dep *) realloc(t->deps, ++t->depsn * sizeof(t->deps[0])); t->deps[t->depsn-1].dep = dep_t; t->deps[t->depsn-1].size = _starpu_data_get_size(handle); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } void starpu_bound_stop(void) { STARPU_PTHREAD_MUTEX_LOCK(&mutex); _starpu_bound_recording = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* Compute all tasks times on all workers */ static void _starpu_get_tasks_times(int nw, int nt, double *times) { struct bound_task_pool *tp; int w, t; for (w = 0; w < nw; w++) { for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { struct _starpu_job j = { .footprint = tp->footprint, .footprint_is_computed = 1, }; enum starpu_perfmodel_archtype arch = starpu_worker_get_perf_archtype(w); 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: */ fprintf(stderr, "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++) { enum starpu_perfmodel_archtype arch = starpu_worker_get_perf_archtype(w); if (_STARPU_IS_ZERO(t1->duration[arch])) { 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] = NAN; else t1->duration[arch] = 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++) { enum starpu_perfmodel_archtype arch = starpu_worker_get_perf_archtype(w); if (!isnan(t1->duration[arch])) 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++) { enum starpu_perfmodel_archtype arch = starpu_worker_get_perf_archtype(w); if (!isnan(t1->duration[arch])) fprintf(output, " + %f t%luw%d", t1->duration[arch], 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%ut%luw%u", 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%ut%luw%u >= 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%ut%luw%u >= %f - 2e5 + 1e5 t%luw%u + 1e5 t%luw%u;\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++) { enum starpu_perfmodel_archtype arch = starpu_worker_get_perf_archtype(w); if (!isnan(t1->duration[arch])) { 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])) fprintf(stderr, "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) fprintf(stderr, "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; } STARPU_PTHREAD_MUTEX_LOCK(&mutex); nw = starpu_worker_get_count(); if (!nw) /* Make llvm happy about the VLA below */ return; 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, "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[9]; snprintf(name, sizeof(name), "W%dT%d", w, t); fprintf(output," %-8s W%-7d %12f\n", name, w, times[w*nt+t]); fprintf(output," %-8s T%-7d %12d\n", name, t, 1); } fprintf(output, "*\n* Total execution time\n*\n"); for (w = 0; w < nw; w++) fprintf(output," TMAX W%-2d %12d\n", w, -1); fprintf(output," TMAX TMAX %12d\n", 1); fprintf(output, "*\nRHS\n*\n"); fprintf(output, "*\n* Total number of tasks\n*\n"); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) fprintf(output," NT%-2d T%-7d %12lu\n", t, t, tp->n); fprintf(output, "ENDATA\n"); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); } /* * Solve bound system thanks to GNU Linear Programming Kit backend */ #ifdef STARPU_HAVE_GLPK_H static glp_prob *_starpu_bound_glp_resolve(int integer) { struct bound_task_pool * tp; int nt; /* Number of different kinds of tasks */ int nw; /* Number of different workers */ int t, w; glp_prob *lp; int ret; nw = starpu_worker_get_count(); if (!nw) /* Make llvm happy about the VLA below */ return NULL; nt = 0; for (tp = task_pools; tp; tp = tp->next) nt++; if (!nt) return NULL; lp = glp_create_prob(); glp_set_prob_name(lp, "StarPU theoretical bound"); glp_set_obj_dir(lp, GLP_MIN); glp_set_obj_name(lp, "total execution time"); { double times[nw*nt]; int ne = nw * (nt+1) /* worker execution time */ + nt * nw + 1; /* glp dumbness */ int n = 1; int ia[ne], ja[ne]; double ar[ne]; _starpu_get_tasks_times(nw, nt, times); /* Variables: number of tasks i assigned to worker j, and tmax */ glp_add_cols(lp, nw*nt+1); #define colnum(w, t) ((t)*nw+(w)+1) glp_set_obj_coef(lp, nw*nt+1, 1.); for (w = 0; w < nw; w++) for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { char name[32]; snprintf(name, sizeof(name), "w%dt%dn", w, t); glp_set_col_name(lp, colnum(w, t), name); if (integer) glp_set_col_kind(lp, colnum(w, t), GLP_IV); glp_set_col_bnds(lp, colnum(w, t), GLP_LO, 0., 0.); } glp_set_col_bnds(lp, nw*nt+1, GLP_LO, 0., 0.); /* Total worker execution time */ glp_add_rows(lp, nw); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { int someone = 0; for (w = 0; w < nw; w++) if (!isnan(times[w*nt+t])) someone = 1; if (!someone) { /* This task does not have any performance model at all, abort */ glp_delete_prob(lp); return NULL; } } for (w = 0; w < nw; w++) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "worker %s", name); glp_set_row_name(lp, w+1, title); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { ia[n] = w+1; ja[n] = colnum(w, t); if (isnan(times[w*nt+t])) ar[n] = 1000000000.; else ar[n] = times[w*nt+t]; n++; } /* tmax */ ia[n] = w+1; ja[n] = nw*nt+1; ar[n] = -1; n++; glp_set_row_bnds(lp, w+1, GLP_UP, 0, 0); } /* Total task completion */ glp_add_rows(lp, nt); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { char name[32], title[64]; starpu_worker_get_name(w, name, sizeof(name)); snprintf(title, sizeof(title), "task %s key %x", _starpu_codelet_get_model_name(tp->cl), (unsigned) tp->footprint); glp_set_row_name(lp, nw+t+1, title); for (w = 0; w < nw; w++) { ia[n] = nw+t+1; ja[n] = colnum(w, t); ar[n] = 1; n++; } glp_set_row_bnds(lp, nw+t+1, GLP_FX, tp->n, tp->n); } STARPU_ASSERT(n == ne); glp_load_matrix(lp, ne-1, ia, ja, ar); } glp_smcp parm; glp_init_smcp(&parm); parm.msg_lev = GLP_MSG_OFF; ret = glp_simplex(lp, &parm); if (ret) { glp_delete_prob(lp); lp = NULL; return NULL; } if (integer) { glp_iocp iocp; glp_init_iocp(&iocp); iocp.msg_lev = GLP_MSG_OFF; glp_intopt(lp, &iocp); } return lp; } #endif /* STARPU_HAVE_GLPK_H */ /* Print the computed bound as well as the optimized distribution of tasks */ void starpu_bound_print(FILE *output, int integer STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_HAVE_GLPK_H if (recorddeps) { fprintf(output, "Not supported\n"); return; } STARPU_PTHREAD_MUTEX_LOCK(&mutex); glp_prob *lp = _starpu_bound_glp_resolve(integer); if (lp) { struct bound_task_pool * tp; int t, w; int nw; /* Number of different workers */ double tmax; nw = starpu_worker_get_count(); if (integer) tmax = glp_mip_obj_val(lp); else tmax = glp_get_obj_val(lp); fprintf(output, "Theoretical minimum execution time: %f ms\n", tmax); for (t = 0, tp = task_pools; tp; t++, tp = tp->next) { fprintf(output, "%s key %x\n", _starpu_codelet_get_model_name(tp->cl), (unsigned) tp->footprint); for (w = 0; w < nw; w++) if (integer) fprintf(output, "\tw%dt%dn %f", w, t, glp_mip_col_val(lp, colnum(w, t))); else fprintf(output, "\tw%dt%dn %f", w, t, glp_get_col_prim(lp, colnum(w, t))); fprintf(output, "\n"); } glp_delete_prob(lp); } else { fprintf(stderr, "Simplex failed\n"); } STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); #else /* STARPU_HAVE_GLPK_H */ fprintf(output, "Please rebuild StarPU with glpk installed.\n"); #endif /* STARPU_HAVE_GLPK_H */ } /* Compute and return the bound */ void starpu_bound_compute(double *res, double *integer_res STARPU_ATTRIBUTE_UNUSED, int integer STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_HAVE_GLPK_H double ret; if (recorddeps) { *res = 0.; return; } STARPU_PTHREAD_MUTEX_LOCK(&mutex); glp_prob *lp = _starpu_bound_glp_resolve(integer); if (lp) { ret = glp_get_obj_val(lp); if (integer) *integer_res = glp_mip_obj_val(lp); glp_delete_prob(lp); } else ret = 0.; STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); *res = ret; #else /* STARPU_HAVE_GLPK_H */ *res = 0.; #endif /* STARPU_HAVE_GLPK_H */ } starpu-1.1.5/src/Makefile.in0000644000373600000000000064200112571536633012620 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique # Copyright (C) 2011 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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_USE_CPU_TRUE@am__append_2 = drivers/cpu/driver_cpu.c @STARPU_USE_CUDA_TRUE@am__append_3 = drivers/cuda/driver_cuda.c @STARPU_SIMGRID_TRUE@@STARPU_USE_CUDA_FALSE@am__append_4 = drivers/cuda/driver_cuda.c @STARPU_USE_OPENCL_TRUE@am__append_5 = drivers/opencl/driver_opencl.c \ @STARPU_USE_OPENCL_TRUE@ drivers/opencl/driver_opencl_utils.c @STARPU_SIMGRID_TRUE@@STARPU_USE_OPENCL_FALSE@am__append_6 = drivers/opencl/driver_opencl.c subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/build-aux/depcomp $(noinst_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES = \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST = \ common/barrier.c common/bitmap.c common/barrier_counter.c \ common/hash.c common/rwlock.c common/starpu_spinlock.c \ common/timing.c common/fxt.c common/utils.c common/thread.c \ core/jobs.c core/task.c core/task_bundle.c core/workers.c \ core/combined_workers.c core/topology.c core/debug.c \ core/errorcheck.c core/progress_hook.c core/dependencies/cg.c \ core/dependencies/dependencies.c \ core/dependencies/implicit_data_deps.c \ core/dependencies/tags.c core/dependencies/task_deps.c \ core/dependencies/data_concurrency.c \ core/perfmodel/perfmodel_history.c \ core/perfmodel/perfmodel_bus.c core/perfmodel/perfmodel.c \ core/perfmodel/perfmodel_print.c \ core/perfmodel/perfmodel_nan.c core/perfmodel/regression.c \ core/sched_policy.c core/simgrid.c core/sched_ctx.c \ core/sched_ctx_list.c core/parallel_task.c \ core/detect_combined_workers.c \ sched_policies/eager_central_policy.c \ sched_policies/eager_central_priority_policy.c \ sched_policies/work_stealing_policy.c \ sched_policies/deque_modeling_policy_data_aware.c \ sched_policies/random_policy.c sched_policies/stack_queues.c \ sched_policies/deque_queues.c sched_policies/fifo_queues.c \ sched_policies/parallel_heft.c sched_policies/parallel_eager.c \ drivers/driver_common/driver_common.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/misc.c util/starpu_data_cpy.c \ util/starpu_insert_task.c util/starpu_insert_task_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/latency.c debug/structures_size.c profiling/profiling.c \ profiling/bound.c profiling/profiling_helpers.c \ top/starpu_top.c top/starpu_top_task.c \ top/starpu_top_message_queue.c top/starpu_top_connection.c \ worker_collection/worker_list.c drivers/cpu/driver_cpu.c \ drivers/cuda/driver_cuda.c drivers/cuda/starpu_cublas.c \ drivers/opencl/driver_opencl.c \ drivers/opencl/driver_opencl_utils.c @STARPU_USE_CPU_TRUE@am__objects_1 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.lo @STARPU_USE_CUDA_TRUE@am__objects_2 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo @STARPU_SIMGRID_TRUE@@STARPU_USE_CUDA_FALSE@am__objects_3 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.lo @STARPU_USE_OPENCL_TRUE@am__objects_4 = 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_5 = libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.lo am_libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS = \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.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-jobs.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.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-debug.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_queues.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.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-driver_common.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-misc.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_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-latency.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo \ $(am__objects_1) $(am__objects_2) $(am__objects_3) \ libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.lo \ $(am__objects_4) $(am__objects_5) 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=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/common -I$(top_builddir)/include -I$(top_builddir)/gcc-plugin/include/starpu-gcc -I$(top_builddir)/starpu-top depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES) DIST_SOURCES = \ $(am__libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = CLEANFILES = *.gcno *.gcda *.linkinfo EXTRA_DIST = dolib.c ldflags = $(am__append_1) libstarpu_so_version = $(LIBSTARPU_INTERFACE_CURRENT):$(LIBSTARPU_INTERFACE_REVISION):$(LIBSTARPU_INTERFACE_AGE) @STARPU_HAVE_WINDOWS_TRUE@LC_MESSAGES = C lib_LTLIBRARIES = libstarpu-@STARPU_EFFECTIVE_VERSION@.la libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS = -I$(top_srcdir)/include/ -DBUILDING_STARPU $(GLOBAL_AM_CFLAGS) $(HWLOC_CFLAGS) $(STARPU_CUDA_CPPFLAGS) $(STARPU_OPENCL_CPPFLAGS) $(FXT_CFLAGS) libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = -lm $(HWLOC_LIBS) $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LIBS) $(STARPU_GLPK_LDFLAGS) libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) $(FXT_LDFLAGS) -no-undefined \ -version-info $(libstarpu_so_version) noinst_HEADERS = \ core/dependencies/data_concurrency.h \ core/dependencies/cg.h \ core/dependencies/tags.h \ core/dependencies/implicit_data_deps.h \ core/progress_hook.h \ core/sched_policy.h \ core/sched_ctx.h \ core/sched_ctx_list.h \ core/perfmodel/perfmodel.h \ core/perfmodel/regression.h \ core/jobs.h \ core/task.h \ core/workers.h \ core/topology.h \ core/debug.h \ core/errorcheck.h \ core/combined_workers.h \ core/simgrid.h \ core/task_bundle.h \ core/detect_combined_workers.h \ sched_policies/fifo_queues.h \ sched_policies/deque_queues.h \ sched_policies/stack_queues.h \ datawizard/footprint.h \ datawizard/datawizard.h \ datawizard/data_request.h \ datawizard/filters.h \ datawizard/write_back.h \ datawizard/datastats.h \ datawizard/malloc.h \ datawizard/memstats.h \ datawizard/memory_manager.h \ datawizard/memalloc.h \ datawizard/copy_driver.h \ datawizard/coherency.h \ datawizard/sort_data_handles.h \ datawizard/memory_nodes.h \ datawizard/interfaces/data_interface.h \ common/barrier.h \ common/timing.h \ common/list.h \ common/rwlock.h \ common/starpu_spinlock.h \ common/fxt.h \ common/utils.h \ common/thread.h \ common/barrier.h \ common/uthash.h \ common/barrier_counter.h \ drivers/driver_common/driver_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 \ debug/traces/starpu_fxt.h \ profiling/bound.h \ profiling/profiling.h \ util/starpu_insert_task_utils.h \ util/starpu_data_cpy.h \ starpu_parameters.h \ top/starpu_top_message_queue.h \ top/starpu_top_connection.h \ top/starpu_top_core.h libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = common/barrier.c \ common/bitmap.c common/barrier_counter.c common/hash.c \ common/rwlock.c common/starpu_spinlock.c common/timing.c \ common/fxt.c common/utils.c common/thread.c core/jobs.c \ core/task.c core/task_bundle.c core/workers.c \ core/combined_workers.c core/topology.c core/debug.c \ core/errorcheck.c core/progress_hook.c core/dependencies/cg.c \ core/dependencies/dependencies.c \ core/dependencies/implicit_data_deps.c \ core/dependencies/tags.c core/dependencies/task_deps.c \ core/dependencies/data_concurrency.c \ core/perfmodel/perfmodel_history.c \ core/perfmodel/perfmodel_bus.c core/perfmodel/perfmodel.c \ core/perfmodel/perfmodel_print.c \ core/perfmodel/perfmodel_nan.c core/perfmodel/regression.c \ core/sched_policy.c core/simgrid.c core/sched_ctx.c \ core/sched_ctx_list.c core/parallel_task.c \ core/detect_combined_workers.c \ sched_policies/eager_central_policy.c \ sched_policies/eager_central_priority_policy.c \ sched_policies/work_stealing_policy.c \ sched_policies/deque_modeling_policy_data_aware.c \ sched_policies/random_policy.c sched_policies/stack_queues.c \ sched_policies/deque_queues.c sched_policies/fifo_queues.c \ sched_policies/parallel_heft.c sched_policies/parallel_eager.c \ drivers/driver_common/driver_common.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/misc.c util/starpu_data_cpy.c \ util/starpu_insert_task.c util/starpu_insert_task_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/latency.c debug/structures_size.c profiling/profiling.c \ profiling/bound.c profiling/profiling_helpers.c \ top/starpu_top.c top/starpu_top_task.c \ top/starpu_top_message_queue.c top/starpu_top_connection.c \ worker_collection/worker_list.c $(am__append_2) \ $(am__append_3) $(am__append_4) drivers/cuda/starpu_cublas.c \ $(am__append_5) $(am__append_6) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstarpu-@STARPU_EFFECTIVE_VERSION@.la: $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_OBJECTS) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(EXTRA_libstarpu_@STARPU_EFFECTIVE_VERSION@_la_DEPENDENCIES) $(AM_V_CCLD)$(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-barrier.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier_counter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bcsr_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-block_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coherency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-combined_workers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-coo_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-copy_driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-csr_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_request.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datastats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-datawizard.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_modeling_policy_data_aware.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cpu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_cuda.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-driver_opencl_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-execute_on_all.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fifo_queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-footprint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-fxt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-jobs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-malloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-matrix_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memalloc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_manager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memory_nodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-memstats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-multiformat_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_eager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_heft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-random_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-reduction.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-rwlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sort_data_handles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_queues.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_create_sync_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_cublas.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_data_cpy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_dag.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_fxt_mpi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_paje.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_spinlock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_bundle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-thread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-timing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-topology.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-user_interactions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-variable_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_filters.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-vector_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-void_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-workers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-write_back.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo: common/barrier.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo `test -f 'common/barrier.c' || echo '$(srcdir)/'`common/barrier.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/barrier.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-barrier.lo `test -f 'common/barrier.c' || echo '$(srcdir)/'`common/barrier.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-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-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-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-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-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-debug.lo: core/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo `test -f 'core/debug.c' || echo '$(srcdir)/'`core/debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/debug.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-debug.lo `test -f 'core/debug.c' || echo '$(srcdir)/'`core/debug.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo: core/errorcheck.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo `test -f 'core/errorcheck.c' || echo '$(srcdir)/'`core/errorcheck.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/errorcheck.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-errorcheck.lo `test -f 'core/errorcheck.c' || echo '$(srcdir)/'`core/errorcheck.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo: core/progress_hook.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo `test -f 'core/progress_hook.c' || echo '$(srcdir)/'`core/progress_hook.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/progress_hook.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-progress_hook.lo `test -f 'core/progress_hook.c' || echo '$(srcdir)/'`core/progress_hook.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo: core/dependencies/cg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo `test -f 'core/dependencies/cg.c' || echo '$(srcdir)/'`core/dependencies/cg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/cg.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-cg.lo `test -f 'core/dependencies/cg.c' || echo '$(srcdir)/'`core/dependencies/cg.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo: core/dependencies/dependencies.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo `test -f 'core/dependencies/dependencies.c' || echo '$(srcdir)/'`core/dependencies/dependencies.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/dependencies.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-dependencies.lo `test -f 'core/dependencies/dependencies.c' || echo '$(srcdir)/'`core/dependencies/dependencies.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo: core/dependencies/implicit_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo `test -f 'core/dependencies/implicit_data_deps.c' || echo '$(srcdir)/'`core/dependencies/implicit_data_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/implicit_data_deps.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-implicit_data_deps.lo `test -f 'core/dependencies/implicit_data_deps.c' || echo '$(srcdir)/'`core/dependencies/implicit_data_deps.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo: core/dependencies/tags.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo `test -f 'core/dependencies/tags.c' || echo '$(srcdir)/'`core/dependencies/tags.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/tags.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-tags.lo `test -f 'core/dependencies/tags.c' || echo '$(srcdir)/'`core/dependencies/tags.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo: core/dependencies/task_deps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo `test -f 'core/dependencies/task_deps.c' || echo '$(srcdir)/'`core/dependencies/task_deps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/task_deps.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-task_deps.lo `test -f 'core/dependencies/task_deps.c' || echo '$(srcdir)/'`core/dependencies/task_deps.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo: core/dependencies/data_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo `test -f 'core/dependencies/data_concurrency.c' || echo '$(srcdir)/'`core/dependencies/data_concurrency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/dependencies/data_concurrency.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-data_concurrency.lo `test -f 'core/dependencies/data_concurrency.c' || echo '$(srcdir)/'`core/dependencies/data_concurrency.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo: core/perfmodel/perfmodel_history.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo `test -f 'core/perfmodel/perfmodel_history.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_history.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_history.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_history.lo `test -f 'core/perfmodel/perfmodel_history.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_history.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo: core/perfmodel/perfmodel_bus.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo `test -f 'core/perfmodel/perfmodel_bus.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_bus.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_bus.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_bus.lo `test -f 'core/perfmodel/perfmodel_bus.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_bus.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo: core/perfmodel/perfmodel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo `test -f 'core/perfmodel/perfmodel.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel.lo `test -f 'core/perfmodel/perfmodel.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo: core/perfmodel/perfmodel_print.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo `test -f 'core/perfmodel/perfmodel_print.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_print.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_print.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_print.lo `test -f 'core/perfmodel/perfmodel_print.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_print.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo: core/perfmodel/perfmodel_nan.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo `test -f 'core/perfmodel/perfmodel_nan.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_nan.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/perfmodel_nan.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-perfmodel_nan.lo `test -f 'core/perfmodel/perfmodel_nan.c' || echo '$(srcdir)/'`core/perfmodel/perfmodel_nan.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo: core/perfmodel/regression.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo `test -f 'core/perfmodel/regression.c' || echo '$(srcdir)/'`core/perfmodel/regression.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/perfmodel/regression.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-regression.lo `test -f 'core/perfmodel/regression.c' || echo '$(srcdir)/'`core/perfmodel/regression.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo: core/sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo `test -f 'core/sched_policy.c' || echo '$(srcdir)/'`core/sched_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/sched_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_policy.lo `test -f 'core/sched_policy.c' || echo '$(srcdir)/'`core/sched_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo: core/simgrid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo `test -f 'core/simgrid.c' || echo '$(srcdir)/'`core/simgrid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/simgrid.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-simgrid.lo `test -f 'core/simgrid.c' || echo '$(srcdir)/'`core/simgrid.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo: core/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo `test -f 'core/sched_ctx.c' || echo '$(srcdir)/'`core/sched_ctx.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/sched_ctx.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx.lo `test -f 'core/sched_ctx.c' || echo '$(srcdir)/'`core/sched_ctx.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo: core/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo `test -f 'core/sched_ctx_list.c' || echo '$(srcdir)/'`core/sched_ctx_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/sched_ctx_list.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-sched_ctx_list.lo `test -f 'core/sched_ctx_list.c' || echo '$(srcdir)/'`core/sched_ctx_list.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo: core/parallel_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo `test -f 'core/parallel_task.c' || echo '$(srcdir)/'`core/parallel_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/parallel_task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-parallel_task.lo `test -f 'core/parallel_task.c' || echo '$(srcdir)/'`core/parallel_task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo: core/detect_combined_workers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo `test -f 'core/detect_combined_workers.c' || echo '$(srcdir)/'`core/detect_combined_workers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='core/detect_combined_workers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-detect_combined_workers.lo `test -f 'core/detect_combined_workers.c' || echo '$(srcdir)/'`core/detect_combined_workers.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo: sched_policies/eager_central_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo `test -f 'sched_policies/eager_central_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/eager_central_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_policy.lo `test -f 'sched_policies/eager_central_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo: sched_policies/eager_central_priority_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo `test -f 'sched_policies/eager_central_priority_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_priority_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/eager_central_priority_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-eager_central_priority_policy.lo `test -f 'sched_policies/eager_central_priority_policy.c' || echo '$(srcdir)/'`sched_policies/eager_central_priority_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo: sched_policies/work_stealing_policy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo `test -f 'sched_policies/work_stealing_policy.c' || echo '$(srcdir)/'`sched_policies/work_stealing_policy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/work_stealing_policy.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-work_stealing_policy.lo `test -f 'sched_policies/work_stealing_policy.c' || echo '$(srcdir)/'`sched_policies/work_stealing_policy.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-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-stack_queues.lo: sched_policies/stack_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-stack_queues.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_queues.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_queues.lo `test -f 'sched_policies/stack_queues.c' || echo '$(srcdir)/'`sched_policies/stack_queues.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_queues.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_queues.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/stack_queues.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-stack_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-stack_queues.lo `test -f 'sched_policies/stack_queues.c' || echo '$(srcdir)/'`sched_policies/stack_queues.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.lo: sched_policies/deque_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-deque_queues.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.lo `test -f 'sched_policies/deque_queues.c' || echo '$(srcdir)/'`sched_policies/deque_queues.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_queues.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sched_policies/deque_queues.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-deque_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-deque_queues.lo `test -f 'sched_policies/deque_queues.c' || echo '$(srcdir)/'`sched_policies/deque_queues.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-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-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-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-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_insert_task.lo: util/starpu_insert_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_insert_task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task.lo `test -f 'util/starpu_insert_task.c' || echo '$(srcdir)/'`util/starpu_insert_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_insert_task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_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_insert_task.lo `test -f 'util/starpu_insert_task.c' || echo '$(srcdir)/'`util/starpu_insert_task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_utils.lo: util/starpu_insert_task_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_insert_task_utils.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_utils.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_utils.lo `test -f 'util/starpu_insert_task_utils.c' || echo '$(srcdir)/'`util/starpu_insert_task_utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_utils.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_utils.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util/starpu_insert_task_utils.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_insert_task_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_insert_task_utils.lo `test -f 'util/starpu_insert_task_utils.c' || echo '$(srcdir)/'`util/starpu_insert_task_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-latency.lo: debug/latency.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo `test -f 'debug/latency.c' || echo '$(srcdir)/'`debug/latency.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/latency.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-latency.lo `test -f 'debug/latency.c' || echo '$(srcdir)/'`debug/latency.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo: debug/structures_size.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo `test -f 'debug/structures_size.c' || echo '$(srcdir)/'`debug/structures_size.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='debug/structures_size.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-structures_size.lo `test -f 'debug/structures_size.c' || echo '$(srcdir)/'`debug/structures_size.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo: profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo `test -f 'profiling/profiling.c' || echo '$(srcdir)/'`profiling/profiling.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/profiling.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling.lo `test -f 'profiling/profiling.c' || echo '$(srcdir)/'`profiling/profiling.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo: profiling/bound.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo `test -f 'profiling/bound.c' || echo '$(srcdir)/'`profiling/bound.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/bound.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-bound.lo `test -f 'profiling/bound.c' || echo '$(srcdir)/'`profiling/bound.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo: profiling/profiling_helpers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo `test -f 'profiling/profiling_helpers.c' || echo '$(srcdir)/'`profiling/profiling_helpers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='profiling/profiling_helpers.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-profiling_helpers.lo `test -f 'profiling/profiling_helpers.c' || echo '$(srcdir)/'`profiling/profiling_helpers.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo: top/starpu_top.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo `test -f 'top/starpu_top.c' || echo '$(srcdir)/'`top/starpu_top.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top.lo `test -f 'top/starpu_top.c' || echo '$(srcdir)/'`top/starpu_top.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo: top/starpu_top_task.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo `test -f 'top/starpu_top_task.c' || echo '$(srcdir)/'`top/starpu_top_task.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top_task.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_task.lo `test -f 'top/starpu_top_task.c' || echo '$(srcdir)/'`top/starpu_top_task.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo: top/starpu_top_message_queue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo `test -f 'top/starpu_top_message_queue.c' || echo '$(srcdir)/'`top/starpu_top_message_queue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top_message_queue.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_message_queue.lo `test -f 'top/starpu_top_message_queue.c' || echo '$(srcdir)/'`top/starpu_top_message_queue.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo: top/starpu_top_connection.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo `test -f 'top/starpu_top_connection.c' || echo '$(srcdir)/'`top/starpu_top_connection.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='top/starpu_top_connection.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-starpu_top_connection.lo `test -f 'top/starpu_top_connection.c' || echo '$(srcdir)/'`top/starpu_top_connection.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo: worker_collection/worker_list.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo -MD -MP -MF $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Tpo -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo `test -f 'worker_collection/worker_list.c' || echo '$(srcdir)/'`worker_collection/worker_list.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Tpo $(DEPDIR)/libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worker_collection/worker_list.c' object='libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstarpu_@STARPU_EFFECTIVE_VERSION@_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstarpu_@STARPU_EFFECTIVE_VERSION@_la-worker_list.lo `test -f 'worker_collection/worker_list.c' || echo '$(srcdir)/'`worker_collection/worker_list.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la-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-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 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive @STARPU_HAVE_MS_LIB_FALSE@all-local: @STARPU_HAVE_WINDOWS_FALSE@all-local: all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @STARPU_HAVE_WINDOWS_FALSE@install-exec-hook: clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: $(am__recursive_targets) install-am install-exec-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ check check-am clean clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES @STARPU_HAVE_WINDOWS_TRUE@export LC_MESSAGES @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@.libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib: libstarpu-@STARPU_EFFECTIVE_VERSION@.la dolib @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ ./dolib "$(STARPU_MS_LIB)" $(STARPU_MS_LIB_ARCH) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def @STARPU_EFFECTIVE_VERSION@ $(libstarpu_so_version) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@all-local: .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib @STARPU_HAVE_WINDOWS_TRUE@install-exec-hook: @STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def $(DESTDIR)$(libdir) @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib $(DESTDIR)$(libdir) @STARPU_HAVE_MS_LIB_TRUE@@STARPU_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.exp $(DESTDIR)$(libdir) showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.1.5/src/common/0002755000373600000000000000000012571541161012112 500000000000000starpu-1.1.5/src/common/utils.c0000644000373600000000000001326512571536572013355 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 HAVE_UNISTD_H #include #endif #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #include #define mkdir(path, mode) mkdir(path) #if !defined(__MINGW32__) #define ftruncate(fd, length) _chsize(fd, length) #endif #endif int _starpu_silent; void _starpu_util_init(void) { _starpu_silent = starpu_get_env_number_default("STARPU_SILENT", 0); STARPU_HG_DISABLE_CHECKING(_starpu_silent); } #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MINGW32__) #include static char * dirname(char * path) { char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; /* Remove trailing slash */ while (strlen(path) > 0 && (*(path+strlen(path)-1) == '/' || *(path+strlen(path)-1) == '\\')) *(path+strlen(path)-1) = '\0'; _splitpath(path, drive, dir, NULL, NULL); _makepath(path, drive, dir, NULL, NULL); return path; } #else #include #endif /* Function with behaviour like `mkdir -p'. This function was adapted from * http://niallohiggins.com/2009/01/08/mkpath-mkdir-p-alike-in-c-for-unix/ */ int _starpu_mkpath(const char *s, mode_t mode) { int olderrno; char *q, *r = NULL, *path = NULL, *up = NULL; int rv; rv = -1; if (strcmp(s, ".") == 0 || strcmp(s, "/") == 0 #if defined(_WIN32) /* C:/ or C:\ */ || (s[0] && s[1] == ':' && (s[2] == '/' || s[2] == '\\') && !s[3]) #endif ) return 0; if ((path = strdup(s)) == NULL) STARPU_ABORT(); if ((q = strdup(s)) == NULL) STARPU_ABORT(); if ((r = dirname(q)) == NULL) goto out; if ((up = strdup(r)) == NULL) STARPU_ABORT(); if ((_starpu_mkpath(up, mode) == -1) && (errno != EEXIST)) goto out; struct stat sb; if (stat(path, &sb) == 0) { if (!S_ISDIR(sb.st_mode)) { fprintf(stderr,"Error: %s is not a directory:\n", path); STARPU_ABORT(); } /* It already exists and is a directory. */ rv = 0; } else { if ((mkdir(path, mode) == -1) && (errno != EEXIST)) rv = -1; else rv = 0; } out: olderrno = errno; if (up) free(up); free(q); free(path); errno = olderrno; return rv; } void _starpu_mkpath_and_check(const char *path, mode_t mode) { int ret; ret = _starpu_mkpath(path, mode); if (ret == -1 && errno != EEXIST) { fprintf(stderr,"Error making StarPU directory %s:\n", path); perror("mkdir"); STARPU_ABORT(); } } int _starpu_ftruncate(FILE *file) { return ftruncate(fileno(file), 0); } int _starpu_frdlock(FILE *file) { #if defined(_WIN32) && !defined(__CYGWIN__) int ret; do { ret = _locking(fileno(file), _LK_RLCK, 10); } while (ret == EDEADLOCK); return ret; #else struct flock lock = { .l_type = F_RDLCK, .l_whence = SEEK_SET, .l_start = 0, .l_len = 0 }; return fcntl(fileno(file), F_SETLKW, &lock); #endif } int _starpu_frdunlock(FILE *file) { #if defined(_WIN32) && !defined(__CYGWIN__) # ifndef _LK_UNLCK # define _LK_UNLCK _LK_UNLOCK # endif return _locking(fileno(file), _LK_UNLCK, 10); #else struct flock lock = { .l_type = F_UNLCK, .l_whence = SEEK_SET, .l_start = 0, .l_len = 0 }; return fcntl(fileno(file), F_SETLKW, &lock); #endif } int _starpu_fwrlock(FILE *file) { #if defined(_WIN32) && !defined(__CYGWIN__) int ret; do { ret = _locking(fileno(file), _LK_LOCK, 10); } while (ret == EDEADLOCK); return ret; #else struct flock lock = { .l_type = F_WRLCK, .l_whence = SEEK_SET, .l_start = 0, .l_len = 0 }; return fcntl(fileno(file), F_SETLKW, &lock); #endif } int _starpu_fwrunlock(FILE *file) { return _starpu_frdunlock(file); } int _starpu_check_mutex_deadlock(starpu_pthread_mutex_t *mutex) { int ret; ret = starpu_pthread_mutex_trylock(mutex); if (!ret) { STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return 0; } if (ret == EBUSY) return 0; STARPU_ASSERT (ret != EDEADLK); return 1; } char *_starpu_get_home_path(void) { char *path = starpu_getenv("XDG_CACHE_HOME"); if (!path) path = starpu_getenv("STARPU_HOME"); if (!path) path = starpu_getenv("HOME"); if (!path) path = starpu_getenv("USERPROFILE"); if (!path) _STARPU_ERROR("couldn't find a home place to put starpu data\n"); return path; } void _starpu_gethostname(char *hostname, size_t size) { char *forced_hostname = starpu_getenv("STARPU_HOSTNAME"); if (forced_hostname && forced_hostname[0]) { snprintf(hostname, size-1, "%s", forced_hostname); hostname[size-1] = 0; } else { char *c; gethostname(hostname, size-1); hostname[size-1] = 0; c = strchr(hostname, '.'); if (c) *c = 0; } } char *starpu_getenv(const char *str) { #ifndef STARPU_SIMGRID #if defined(STARPU_DEVEL) || defined(STARPU_DEBUG) struct _starpu_worker * worker; worker = _starpu_get_local_worker_key(); if (worker && worker->worker_is_initialized) _STARPU_DISP( "getenv should not be called from running workers, only for main() or worker initialization, since it is not reentrant\n"); #endif #endif return getenv(str); } starpu-1.1.5/src/common/uthash.h0000644000373600000000000017731412571536572013524 00000000000000/* Copyright (c) 2003-2010, Troy D. Hanson http://uthash.sourceforge.net All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UTHASH_H #define UTHASH_H #include /* memcmp,strlen */ #include /* ptrdiff_t */ /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #ifdef _MSC_VER /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define DECLTYPE(x) (decltype(x)) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #define DECLTYPE(x) #endif #else /* GNU, Sun and other compilers */ #define DECLTYPE(x) (__typeof(x)) #endif #ifdef NO_DECLTYPE #define DECLTYPE_ASSIGN(dst,src) \ do { \ char **_da_dst = (char**)(&(dst)); \ *_da_dst = (char*)(src); \ } while(0) #else #define DECLTYPE_ASSIGN(dst,src) \ do { \ (dst) = DECLTYPE(dst)(src); \ } while(0) #endif /* a number of the hash function use uint32_t which isn't defined on win32 */ #ifdef _MSC_VER typedef unsigned int uint32_t; #else #include /* uint32_t */ #endif #define UTHASH_VERSION 1.9.3 #define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ #define uthash_malloc(sz) malloc(sz) /* malloc fcn */ #define uthash_free(ptr,sz) free(ptr) /* free fcn */ #define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ #define uthash_expand_fyi(tbl) /* can be defined to log expands */ /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS 32 /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS_LOG2 5 /* lg2 of initial number of buckets */ #define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ /* calculate the element whose hash handle address is hhe */ #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) #define HASH_FIND(hh,head,keyptr,keylen,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) { \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ keyptr,keylen,out); \ } \ } \ } while (0) #ifdef HASH_BLOOM #define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM) #define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0) #define HASH_BLOOM_MAKE(tbl) \ do { \ (tbl)->bloom_nbits = HASH_BLOOM; \ (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ if (!((tbl)->bloom_bv)) { uthash_fatal( "out of memory"); } \ memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN); \ (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ } while (0); #define HASH_BLOOM_FREE(tbl) \ do { \ uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ } while (0); #define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8))) #define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8))) #define HASH_BLOOM_ADD(tbl,hashv) \ HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) #define HASH_BLOOM_TEST(tbl,hashv) \ HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1))) #else #define HASH_BLOOM_MAKE(tbl) #define HASH_BLOOM_FREE(tbl) #define HASH_BLOOM_ADD(tbl,hashv) #define HASH_BLOOM_TEST(tbl,hashv) (1) #endif #define HASH_MAKE_TABLE(hh,head) \ do { \ (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ sizeof(UT_hash_table)); \ if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ (head)->hh.tbl->tail = &((head)->hh); \ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl->buckets, 0, \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ HASH_BLOOM_MAKE((head)->hh.tbl); \ (head)->hh.tbl->signature = HASH_SIGNATURE; \ } while(0) #define HASH_ADD(hh,head,fieldname,keylen_in,add) \ HASH_ADD_KEYPTR(hh,head,&add->fieldname,keylen_in,add) #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ do { \ unsigned _ha_bkt; \ (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 %d, actual %d\n", \ (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ } \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid hh item count %d, actual %d\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 %d, actual %d\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 ); \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ case 5: _hj_j += _hj_key[4]; \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ case 1: _hj_i += _hj_key[0]; \ } \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ bkt = hashv & (num_bkts-1); \ } while(0) /* The Paul Hsieh hash function */ #undef get16bits #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) #define get16bits(d) (*((const uint16_t *) (d))) #endif #if !defined (get16bits) #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endif #define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \ do { \ char *_sfh_key=(char*)(key); \ uint32_t _sfh_tmp, _sfh_len = keylen; \ \ int _sfh_rem = _sfh_len & 3; \ _sfh_len >>= 2; \ hashv = 0xcafebabe; \ \ /* Main loop */ \ for (;_sfh_len > 0; _sfh_len--) { \ hashv += get16bits (_sfh_key); \ _sfh_tmp = (get16bits (_sfh_key+2) << 11) ^ hashv; \ hashv = (hashv << 16) ^ _sfh_tmp; \ _sfh_key += 2*sizeof (uint16_t); \ hashv += hashv >> 11; \ } \ \ /* Handle end cases */ \ switch (_sfh_rem) { \ case 3: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 16; \ hashv ^= _sfh_key[sizeof (uint16_t)] << 18; \ hashv += hashv >> 11; \ break; \ case 2: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 11; \ hashv += hashv >> 17; \ break; \ case 1: hashv += *_sfh_key; \ hashv ^= hashv << 10; \ hashv += hashv >> 1; \ } \ \ /* Force "avalanching" of final 127 bits */ \ hashv ^= hashv << 3; \ hashv += hashv >> 5; \ hashv ^= hashv << 4; \ hashv += hashv >> 17; \ hashv ^= hashv << 25; \ hashv += hashv >> 6; \ bkt = hashv & (num_bkts-1); \ } while(0); #ifdef HASH_USING_NO_STRICT_ALIASING /* The MurmurHash exploits some CPU's (e.g. x86) tolerance for unaligned reads. * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. * So MurmurHash comes in two versions, the faster unaligned one and the slower * aligned one. We only use the faster one on CPU's where we know it's safe. * * Note the preprocessor built-in defines can be emitted using: * * gcc -m64 -dM -E - < /dev/null (on gcc) * cc -## a.c (where a.c is a simple test file) (Sun Studio) */ #if (defined(__i386__) || defined(__x86_64__)) #define HASH_MUR HASH_MUR_UNALIGNED #else #define HASH_MUR HASH_MUR_ALIGNED #endif /* Appleby's MurmurHash fast version for unaligned-tolerant archs like i386 */ #define HASH_MUR_UNALIGNED(key,keylen,num_bkts,hashv,bkt) \ do { \ const unsigned int _mur_m = 0x5bd1e995; \ const int _mur_r = 24; \ hashv = 0xcafebabe ^ keylen; \ char *_mur_key = (char *)(key); \ uint32_t _mur_tmp, _mur_len = keylen; \ \ for (;_mur_len >= 4; _mur_len-=4) { \ _mur_tmp = *(uint32_t *)_mur_key; \ _mur_tmp *= _mur_m; \ _mur_tmp ^= _mur_tmp >> _mur_r; \ _mur_tmp *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_tmp; \ _mur_key += 4; \ } \ \ switch(_mur_len) \ { \ case 3: hashv ^= _mur_key[2] << 16; \ case 2: hashv ^= _mur_key[1] << 8; \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ }; \ \ hashv ^= hashv >> 13; \ hashv *= _mur_m; \ hashv ^= hashv >> 15; \ \ bkt = hashv & (num_bkts-1); \ } while(0) /* Appleby's MurmurHash version for alignment-sensitive archs like Sparc */ #define HASH_MUR_ALIGNED(key,keylen,num_bkts,hashv,bkt) \ do { \ const unsigned int _mur_m = 0x5bd1e995; \ const int _mur_r = 24; \ hashv = 0xcafebabe ^ (keylen); \ char *_mur_key = (char *)(key); \ uint32_t _mur_len = keylen; \ int _mur_align = (int)_mur_key & 3; \ \ if (_mur_align && (_mur_len >= 4)) { \ unsigned _mur_t = 0, _mur_d = 0; \ switch(_mur_align) { \ case 1: _mur_t |= _mur_key[2] << 16; \ case 2: _mur_t |= _mur_key[1] << 8; \ case 3: _mur_t |= _mur_key[0]; \ } \ _mur_t <<= (8 * _mur_align); \ _mur_key += 4-_mur_align; \ _mur_len -= 4-_mur_align; \ int _mur_sl = 8 * (4-_mur_align); \ int _mur_sr = 8 * _mur_align; \ \ for (;_mur_len >= 4; _mur_len-=4) { \ _mur_d = *(unsigned *)_mur_key; \ _mur_t = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ unsigned _mur_k = _mur_t; \ _mur_k *= _mur_m; \ _mur_k ^= _mur_k >> _mur_r; \ _mur_k *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_k; \ _mur_t = _mur_d; \ _mur_key += 4; \ } \ _mur_d = 0; \ if(_mur_len >= _mur_align) { \ switch(_mur_align) { \ case 3: _mur_d |= _mur_key[2] << 16; \ case 2: _mur_d |= _mur_key[1] << 8; \ case 1: _mur_d |= _mur_key[0]; \ } \ unsigned _mur_k = (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ _mur_k *= _mur_m; \ _mur_k ^= _mur_k >> _mur_r; \ _mur_k *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_k; \ _mur_k += _mur_align; \ _mur_len -= _mur_align; \ \ switch(_mur_len) \ { \ case 3: hashv ^= _mur_key[2] << 16; \ case 2: hashv ^= _mur_key[1] << 8; \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ } \ } else { \ switch(_mur_len) \ { \ case 3: _mur_d ^= _mur_key[2] << 16; \ case 2: _mur_d ^= _mur_key[1] << 8; \ case 1: _mur_d ^= _mur_key[0]; \ case 0: hashv ^= (_mur_t >> _mur_sr) | (_mur_d << _mur_sl); \ hashv *= _mur_m; \ } \ } \ \ hashv ^= hashv >> 13; \ hashv *= _mur_m; \ hashv ^= hashv >> 15; \ } else { \ for (;_mur_len >= 4; _mur_len-=4) { \ unsigned _mur_k = *(unsigned*)_mur_key; \ _mur_k *= _mur_m; \ _mur_k ^= _mur_k >> _mur_r; \ _mur_k *= _mur_m; \ hashv *= _mur_m; \ hashv ^= _mur_k; \ _mur_key += 4; \ } \ switch(_mur_len) \ { \ case 3: hashv ^= _mur_key[2] << 16; \ case 2: hashv ^= _mur_key[1] << 8; \ case 1: hashv ^= _mur_key[0]; \ hashv *= _mur_m; \ } \ \ hashv ^= hashv >> 13; \ hashv *= _mur_m; \ hashv ^= hashv >> 15; \ } \ bkt = hashv & (num_bkts-1); \ } while(0) #endif /* HASH_USING_NO_STRICT_ALIASING */ /* key comparison function; return 0 if keys equal */ #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ do { \ if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ else out=NULL; \ while (out) { \ if (out->hh.keylen == keylen_in) { \ if ((HASH_KEYCMP(out->hh.key,keyptr,keylen_in)) == 0) break; \ } \ if (out->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,out->hh.hh_next)); \ else out = NULL; \ } \ } while(0) /* add an item to a bucket */ #define HASH_ADD_TO_BKT(head,addhh) \ do { \ head.count++; \ (addhh)->hh_next = head.hh_head; \ (addhh)->hh_prev = NULL; \ if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ (head).hh_head=addhh; \ if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ && (addhh)->tbl->noexpand != 1) { \ HASH_EXPAND_BUCKETS((addhh)->tbl); \ } \ } while(0) /* remove an item from a given bucket */ #define HASH_DEL_IN_BKT(hh,head,hh_del) \ (head).count--; \ if ((head).hh_head == hh_del) { \ (head).hh_head = hh_del->hh_next; \ } \ if (hh_del->hh_prev) { \ hh_del->hh_prev->hh_next = hh_del->hh_next; \ } \ if (hh_del->hh_next) { \ hh_del->hh_next->hh_prev = hh_del->hh_prev; \ } /* Bucket expansion has the effect of doubling the number of buckets * and redistributing the items into the new buckets. Ideally the * items will distribute more or less evenly into the new buckets * (the extent to which this is true is a measure of the quality of * the hash function as it applies to the key domain). * * With the items distributed into more buckets, the chain length * (item count) in each bucket is reduced. Thus by expanding buckets * the hash keeps a bound on the chain length. This bounded chain * length is the essence of how a hash provides constant time lookup. * * The calculation of tbl->ideal_chain_maxlen below deserves some * explanation. First, keep in mind that we're calculating the ideal * maximum chain length based on the *new* (doubled) bucket count. * In fractions this is just n/b (n=number of items,b=new num buckets). * Since the ideal chain length is an integer, we want to calculate * ceil(n/b). We don't depend on floating point arithmetic in this * hash, so to calculate ceil(n/b) with integers we could write * * ceil(n/b) = (n/b) + ((n%b)?1:0) * * and in fact a previous version of this hash did just that. * But now we have improved things a bit by recognizing that b is * always a power of two. We keep its base 2 log handy (call it lb), * so now we can write this with a bit shift and logical AND: * * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) * */ #define HASH_EXPAND_BUCKETS(tbl) \ do { \ unsigned _he_bkt; \ unsigned _he_bkt_i; \ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ memset(_he_new_buckets, 0, \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ tbl->ideal_chain_maxlen = \ (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ tbl->nonideal_items = 0; \ for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ { \ _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ while (_he_thh) { \ _he_hh_nxt = _he_thh->hh_next; \ HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ tbl->nonideal_items++; \ _he_newbkt->expand_mult = _he_newbkt->count / \ tbl->ideal_chain_maxlen; \ } \ _he_thh->hh_prev = NULL; \ _he_thh->hh_next = _he_newbkt->hh_head; \ if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ _he_thh; \ _he_newbkt->hh_head = _he_thh; \ _he_thh = _he_hh_nxt; \ } \ } \ uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ tbl->num_buckets *= 2; \ tbl->log2_num_buckets++; \ tbl->buckets = _he_new_buckets; \ tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ (tbl->ineff_expands+1) : 0; \ if (tbl->ineff_expands > 1) { \ tbl->noexpand=1; \ uthash_noexpand_fyi(tbl); \ } \ uthash_expand_fyi(tbl); \ } while(0) /* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ /* Note that HASH_SORT assumes the hash handle name to be hh. * HASH_SRT was added to allow the hash handle name to be passed in. */ #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) #define HASH_SRT(hh,head,cmpfcn) \ do { \ unsigned _hs_i; \ unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ if (head) { \ _hs_insize = 1; \ _hs_looping = 1; \ _hs_list = &((head)->hh); \ while (_hs_looping) { \ _hs_p = _hs_list; \ _hs_list = NULL; \ _hs_tail = NULL; \ _hs_nmerges = 0; \ while (_hs_p) { \ _hs_nmerges++; \ _hs_q = _hs_p; \ _hs_psize = 0; \ for ( _hs_i = 0; _hs_i < _hs_insize; _hs_i++ ) { \ _hs_psize++; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ if (! (_hs_q) ) break; \ } \ _hs_qsize = _hs_insize; \ while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) { \ if (_hs_psize == 0) { \ _hs_e = _hs_q; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_qsize--; \ } else if ( (_hs_qsize == 0) || !(_hs_q) ) { \ _hs_e = _hs_p; \ _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ ((void*)((char*)(_hs_p->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_psize--; \ } else if (( \ cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \ ) <= 0) { \ _hs_e = _hs_p; \ _hs_p = (UT_hash_handle*)((_hs_p->next) ? \ ((void*)((char*)(_hs_p->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_psize--; \ } else { \ _hs_e = _hs_q; \ _hs_q = (UT_hash_handle*)((_hs_q->next) ? \ ((void*)((char*)(_hs_q->next) + \ (head)->hh.tbl->hho)) : NULL); \ _hs_qsize--; \ } \ if ( _hs_tail ) { \ _hs_tail->next = ((_hs_e) ? \ ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL); \ } else { \ _hs_list = _hs_e; \ } \ _hs_e->prev = ((_hs_tail) ? \ ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL); \ _hs_tail = _hs_e; \ } \ _hs_p = _hs_q; \ } \ _hs_tail->next = NULL; \ if ( _hs_nmerges <= 1 ) { \ _hs_looping=0; \ (head)->hh.tbl->tail = _hs_tail; \ DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ } \ _hs_insize *= 2; \ } \ HASH_FSCK(hh,head); \ } \ } while (0) /* This function selects items from one hash into another hash. * The end result is that the selected items have dual presence * in both hashes. There is no copy of the items made; rather * they are added into the new hash through a secondary hash * hash handle that must be present in the structure. */ #define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ do { \ unsigned _src_bkt, _dst_bkt; \ void *_last_elt=NULL, *_elt; \ UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ if (src) { \ for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ _src_hh; \ _src_hh = _src_hh->hh_next) { \ _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ if (cond(_elt)) { \ _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ _dst_hh->key = _src_hh->key; \ _dst_hh->keylen = _src_hh->keylen; \ _dst_hh->hashv = _src_hh->hashv; \ _dst_hh->prev = _last_elt; \ _dst_hh->next = NULL; \ if (_last_elt_hh) { _last_elt_hh->next = _elt; } \ if (!dst) { \ DECLTYPE_ASSIGN(dst,_elt); \ HASH_MAKE_TABLE(hh_dst,dst); \ } else { \ _dst_hh->tbl = (dst)->hh_dst.tbl; \ } \ HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh); \ (dst)->hh_dst.tbl->num_items++; \ _last_elt = _elt; \ _last_elt_hh = _dst_hh; \ } \ } \ } \ } \ HASH_FSCK(hh_dst,dst); \ } while (0) #define HASH_CLEAR(hh,head) \ do { \ if (head) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head)=NULL; \ } \ } while(0) #ifdef NO_DECLTYPE #define HASH_ITER(hh,head,el,tmp) \ for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL); \ el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL)) #else #define HASH_ITER(hh,head,el,tmp) \ for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL); \ el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL)) #endif /* obtain a count of items in the hash */ #define HASH_COUNT(head) HASH_CNT(hh,head) #define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0) typedef struct UT_hash_bucket { struct UT_hash_handle *hh_head; unsigned count; /* expand_mult is normally set to 0. In this situation, the max chain length * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If * the bucket's chain exceeds this length, bucket expansion is triggered). * However, setting expand_mult to a non-zero value delays bucket expansion * (that would be triggered by additions to this particular bucket) * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. * (The multiplier is simply expand_mult+1). The whole idea of this * multiplier is to reduce bucket expansions, since they are expensive, in * situations where we know that a particular bucket tends to be overused. * It is better to let its chain length grow to a longer yet-still-bounded * value, than to do an O(n) bucket expansion too often. */ unsigned expand_mult; } UT_hash_bucket; /* random signature used only to find hash tables in external analysis */ #define HASH_SIGNATURE 0xa0111fe1 #define HASH_BLOOM_SIGNATURE 0xb12220f2 typedef struct UT_hash_table { UT_hash_bucket *buckets; unsigned num_buckets, log2_num_buckets; unsigned num_items; struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ /* in an ideal situation (all buckets used equally), no bucket would have * more than ceil(#items/#buckets) items. that's the ideal chain length. */ unsigned ideal_chain_maxlen; /* nonideal_items is the number of items in the hash whose chain position * exceeds the ideal chain maxlen. these items pay the penalty for an uneven * hash distribution; reaching them in a chain traversal takes >ideal steps */ unsigned nonideal_items; /* ineffective expands occur when a bucket doubling was performed, but * afterward, more than half the items in the hash had nonideal chain * positions. If this happens on two consecutive expansions we inhibit any * further expansion, as it's not helping; this happens when the hash * function isn't a good fit for the key domain. When expansion is inhibited * the hash will still work, albeit no longer in constant time. */ unsigned ineff_expands, noexpand; uint32_t signature; /* used only to find hash tables in external analysis */ #ifdef HASH_BLOOM uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ uint8_t *bloom_bv; char bloom_nbits; #endif } UT_hash_table; typedef struct UT_hash_handle { struct UT_hash_table *tbl; void *prev; /* prev element in app order */ void *next; /* next element in app order */ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ struct UT_hash_handle *hh_next; /* next hh in bucket order */ void *key; /* ptr to enclosing struct's key */ unsigned keylen; /* enclosing struct's key len */ unsigned hashv; /* result of hash-fcn(key) */ } UT_hash_handle; #endif /* UTHASH_H */ starpu-1.1.5/src/common/rwlock.h0000644000373600000000000000320112571536572013510 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __RWLOCKS_H__ #define __RWLOCKS_H__ #include #include /* Dummy implementation of a RW-lock using a spinlock. */ struct _starpu_rw_lock { uint32_t busy; uint8_t writer; uint16_t readercnt; }; /* Initialize the RW-lock */ void _starpu_init_rw_lock(struct _starpu_rw_lock *lock); /* Grab the RW-lock in a write mode */ void _starpu_take_rw_lock_write(struct _starpu_rw_lock *lock); /* Grab the RW-lock in a read mode */ void _starpu_take_rw_lock_read(struct _starpu_rw_lock *lock); /* Try to grab the RW-lock in a write mode. Returns 0 in case of success, -1 * otherwise. */ int _starpu_take_rw_lock_write_try(struct _starpu_rw_lock *lock); /* Try to grab the RW-lock in a read mode. Returns 0 in case of success, -1 * otherwise. */ int _starpu_take_rw_lock_read_try(struct _starpu_rw_lock *lock); /* Unlock the RW-lock. */ void _starpu_release_rw_lock(struct _starpu_rw_lock *lock); #endif starpu-1.1.5/src/common/barrier.c0000644000373600000000000000507012571536572013636 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010,2011,2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 %d\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.1.5/src/common/barrier.h0000644000373600000000000000227412571536572013646 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMMON_BARRIER_H__ #define __COMMON_BARRIER_H__ #include struct _starpu_barrier { unsigned count; unsigned reached_start; unsigned reached_exit; double reached_flops; starpu_pthread_mutex_t mutex; starpu_pthread_mutex_t mutex_exit; starpu_pthread_cond_t cond; }; int _starpu_barrier_init(struct _starpu_barrier *barrier, int count); int _starpu_barrier_destroy(struct _starpu_barrier *barrier); int _starpu_barrier_wait(struct _starpu_barrier *barrier); #endif // __COMMON_BARRIER_H__ starpu-1.1.5/src/common/thread.c0000644000373600000000000001526712571536572013470 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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 #include #endif #ifdef STARPU_SIMGRID extern int _starpu_simgrid_thread_start(int argc, char *argv[]); int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg, msg_host_t host) { struct _starpu_pthread_args *_args = malloc(sizeof(*_args)); _args->f = start_routine; _args->arg = arg; if (!host) host = MSG_get_host_by_name("MAIN"); *thread = MSG_process_create(name, _starpu_simgrid_thread_start, _args, host); 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, void **retval) { #ifdef STARPU_DEVEL #warning TODO: use a simgrid_join when it becomes available #endif MSG_process_sleep(1); return 0; } int starpu_pthread_attr_init(starpu_pthread_attr_t *attr) { return 0; } int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr) { return 0; } int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate) { return 0; } int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr) { *mutex = xbt_mutex_init(); return 0; } int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex) { if (*mutex) xbt_mutex_destroy(*mutex); return 0; } int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex) { if (!*mutex) STARPU_PTHREAD_MUTEX_INIT(mutex, NULL); xbt_mutex_acquire(*mutex); return 0; } int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex) { xbt_mutex_release(*mutex); return 0; } int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex) { int ret; #ifdef HAVE_XBT_MUTEX_TRY_ACQUIRE ret = xbt_mutex_try_acquire(*mutex); #else ret = simcall_mutex_trylock((smx_mutex_t)*mutex); #endif ret = ret ? 0 : EBUSY; return ret; } static int used_key[MAX_TSD]; int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *)) { 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 = i; return 0; } int starpu_pthread_key_delete(starpu_pthread_key_t key) { used_key[key] = 0; return 0; } int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer) { void **array = MSG_host_get_data(MSG_host_self()); array[key] = pointer; return 0; } void* starpu_pthread_getspecific(starpu_pthread_key_t key) { void **array = MSG_host_get_data(MSG_host_self()); return array[key]; } int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr) { *cond = xbt_cond_init(); return 0; } int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond) { if (!*cond) STARPU_PTHREAD_COND_INIT(cond, NULL); xbt_cond_signal(*cond); return 0; } int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond) { if (!*cond) STARPU_PTHREAD_COND_INIT(cond, NULL); xbt_cond_broadcast(*cond); return 0; } int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) { if (!*cond) STARPU_PTHREAD_COND_INIT(cond, NULL); xbt_cond_wait(*cond, *mutex); return 0; } int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond) { if (*cond) xbt_cond_destroy(*cond); return 0; } int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *restrict rwlock, const starpu_pthread_rwlockattr_t *restrict attr) { 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) { return starpu_pthread_mutex_lock(rwlock); } int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock) { return starpu_pthread_mutex_trylock(rwlock); } int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock) { return starpu_pthread_mutex_lock(rwlock); } int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock) { return starpu_pthread_mutex_trylock(rwlock); } int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock) { return starpu_pthread_mutex_unlock(rwlock); } #endif /* STARPU_SIMGRID */ #if defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_BARRIER) int starpu_pthread_barrier_init(starpu_pthread_barrier_t *restrict barrier, const starpu_pthread_barrierattr_t *restrict attr, unsigned count) { int ret = starpu_pthread_mutex_init(&barrier->mutex, NULL); if (!ret) ret = starpu_pthread_cond_init(&barrier->cond, NULL); if (!ret) ret = starpu_pthread_cond_init(&barrier->cond_destroy, NULL); barrier->count = count; barrier->done = 0; barrier->busy = 0; return ret; } int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier) { starpu_pthread_mutex_lock(&barrier->mutex); while (barrier->busy) { starpu_pthread_cond_wait(&barrier->cond_destroy, &barrier->mutex); } starpu_pthread_mutex_unlock(&barrier->mutex); int ret = starpu_pthread_mutex_destroy(&barrier->mutex); if (!ret) ret = starpu_pthread_cond_destroy(&barrier->cond); if (!ret) ret = starpu_pthread_cond_destroy(&barrier->cond_destroy); return ret; } int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier) { int ret = 0; starpu_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); return ret; } #endif /* defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_BARRIER) */ starpu-1.1.5/src/common/timing.c0000644000373600000000000001370212571536572013500 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) #include #endif #ifdef STARPU_SIMGRID void _starpu_timing_init(void) { } void _starpu_clock_gettime(struct timespec *ts) { double now = MSG_get_clock(); ts->tv_sec = floor(now); ts->tv_nsec = floor((now - ts->tv_sec) * 1000000000); } #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) #include #ifndef _POSIX_C_SOURCE /* for clock_gettime */ #define _POSIX_C_SOURCE 199309L #endif #ifdef __linux__ #ifndef CLOCK_MONOTONIC_RAW #define CLOCK_MONOTONIC_RAW 4 #endif #endif static struct timespec _starpu_reference_start_time_ts; /* Modern CPUs' clocks are usually not synchronized so we use a monotonic clock * to have consistent timing measurements. 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). */ static void _starpu_clock_readtime(struct timespec *ts) { #ifdef CLOCK_MONOTONIC_RAW 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__) #define usleep(mu) Sleep(mu/1000) 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); usleep(500000); STARPU_GET_TICK(t2); mygettimeofday(&tv2,0); _starpu_scale = ((tv2.tv_sec*1e6 + tv2.tv_usec) - (tv1.tv_sec*1e6 + tv1.tv_usec)) / (double)(STARPU_TICK_DIFF(t1, t2)); } STARPU_GET_TICK(_starpu_reference_start_tick); _starpu_inited = 1; } void _starpu_clock_gettime(struct timespec *ts) { union starpu_u_tick tick_now; STARPU_GET_TICK(tick_now); uint64_t elapsed_ticks = STARPU_TICK_DIFF(_starpu_reference_start_tick, tick_now); /* We convert this number into nano-seconds so that we can fill the * timespec structure. */ uint64_t elapsed_ns = (uint64_t)(((double)elapsed_ticks)*(_starpu_scale*1000.0)); long tv_nsec = (elapsed_ns % 1000000000); time_t tv_sec = (elapsed_ns / 1000000000); ts->tv_sec = tv_sec; ts->tv_nsec = tv_nsec; } #else // !HAVE_CLOCK_GETTIME & no rdtsc #warning StarPU could not find a timer, clock will always return 0 void _starpu_timing_init(void) { } void _starpu_clock_gettime(struct timespec *ts) { timerclear(ts); } #endif #endif // HAVE_CLOCK_GETTIME /* Returns the time elapsed between start and end in microseconds */ double starpu_timing_timespec_delay_us(struct timespec *start, struct timespec *end) { struct timespec diff; starpu_timespec_sub(end, start, &diff); double us = (diff.tv_sec*1e6) + (diff.tv_nsec*1e-3); return us; } double starpu_timing_timespec_to_us(struct timespec *ts) { return (1000000.0*ts->tv_sec) + (0.001*ts->tv_nsec); } double starpu_timing_now(void) { #ifdef STARPU_SIMGRID return MSG_get_clock()*1000000; #else struct timespec now; _starpu_clock_gettime(&now); return starpu_timing_timespec_to_us(&now); #endif } starpu-1.1.5/src/common/barrier_counter.h0000644000373600000000000000407412571536572015405 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __BARRIER_COUNTER_H__ #define __BARRIER_COUNTER_H__ #include #include struct _starpu_barrier_counter { struct _starpu_barrier barrier; unsigned min_threshold; unsigned max_threshold; starpu_pthread_cond_t cond2; }; int _starpu_barrier_counter_init(struct _starpu_barrier_counter *barrier_c, unsigned count); int _starpu_barrier_counter_destroy(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_wait_for_empty_counter(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n); int _starpu_barrier_counter_wait_until_counter_reaches_up_to_n(struct _starpu_barrier_counter *barrier_c, unsigned n); int _starpu_barrier_counter_wait_for_full_counter(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_decrement_until_empty_counter(struct _starpu_barrier_counter *barrier_c, double flops); int _starpu_barrier_counter_increment_until_full_counter(struct _starpu_barrier_counter *barrier_c, double flops); int _starpu_barrier_counter_increment(struct _starpu_barrier_counter *barrier_c, double flops); int _starpu_barrier_counter_check(struct _starpu_barrier_counter *barrier_c); int _starpu_barrier_counter_get_reached_start(struct _starpu_barrier_counter *barrier_c); double _starpu_barrier_counter_get_reached_flops(struct _starpu_barrier_counter *barrier_c); #endif starpu-1.1.5/src/common/config.h.in0000644000373600000000000003306212571536630014064 00000000000000/* src/common/config.h.in. Generated from configure.ac by autoheader. */ /* enable FUT traces */ #undef CONFIG_FUT /* Define to 1 when `struct attribute_spec' has the `affects_type_identity' field. */ #undef HAVE_ATTRIBUTE_SPEC_AFFECTS_TYPE_IDENTITY /* Define to 1 if you have the header file. */ #undef HAVE_AYUDAME_H /* Define to 1 if you have the `clGetExtensionFunctionAddressForPlatform' function. */ #undef HAVE_CLGETEXTENSIONFUNCTIONADDRESSFORPLATFORM /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if you have the header file. */ #undef HAVE_CL_CL_EXT_H /* Define to 1 if you have the header file. */ #undef HAVE_CUDA_GL_INTEROP_H /* Peer transfers are supported in CUDA */ #undef HAVE_CUDA_MEMCPY_PEER /* Define to 1 if you have the header file. */ #undef HAVE_C_COMMON_H /* Define to 1 if you have the header file. */ #undef HAVE_C_FAMILY_C_COMMON_H /* Define to 1 if you have the header file. */ #undef HAVE_C_FAMILY_C_PRAGMA_H /* Define to 1 if you have the header file. */ #undef HAVE_C_PRAGMA_H /* Define to 1 if you have the declaration of `build_array_ref', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_ARRAY_REF /* Define to 1 if you have the declaration of `build_call_expr_loc_array', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_CALL_EXPR_LOC_ARRAY /* Define to 1 if you have the declaration of `build_call_expr_loc_vec', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_CALL_EXPR_LOC_VEC /* Define to 1 if you have the declaration of `build_zero_cst', and to 0 if you don't. */ #undef HAVE_DECL_BUILD_ZERO_CST /* Define to 1 if you have the declaration of `builtin_decl_explicit', and to 0 if you don't. */ #undef HAVE_DECL_BUILTIN_DECL_EXPLICIT /* Define to 1 if you have the declaration of `enable_fut_flush', and to 0 if you don't. */ #undef HAVE_DECL_ENABLE_FUT_FLUSH /* Define to 1 if you have the declaration of `fut_set_filename', and to 0 if you don't. */ #undef HAVE_DECL_FUT_SET_FILENAME /* Define to 1 if you have the declaration of `ptr_derefs_may_alias_p', and to 0 if you don't. */ #undef HAVE_DECL_PTR_DEREFS_MAY_ALIAS_P /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `enable_fut_flush' function. */ #undef HAVE_ENABLE_FUT_FLUSH /* Define to 1 if you have the `fut_set_filename' function. */ #undef HAVE_FUT_SET_FILENAME /* Define to 1 if you have the header file. */ #undef HAVE_GLPK_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `atlas' library (-latlas). */ #undef HAVE_LIBATLAS /* Define to 1 if you have the `cblas' library (-lcblas). */ #undef HAVE_LIBCBLAS /* Define to 1 if you have the `gfortran' library (-lgfortran). */ #undef HAVE_LIBGFORTRAN /* Define to 1 if you have the `GL' library (-lGL). */ #undef HAVE_LIBGL /* Define to 1 if you have the `glpk' library (-lglpk). */ #undef HAVE_LIBGLPK /* Define to 1 if you have the `GLU' library (-lGLU). */ #undef HAVE_LIBGLU /* Define to 1 if you have the `glut' library (-lglut). */ #undef HAVE_LIBGLUT /* Define to 1 if you have the `goto' library (-lgoto). */ #undef HAVE_LIBGOTO /* Define to 1 if you have the `goto2' library (-lgoto2). */ #undef HAVE_LIBGOTO2 /* Define to 1 if you have the `ifcore' library (-lifcore). */ #undef HAVE_LIBIFCORE /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* 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 `posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* 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 header file. */ #undef HAVE_SIMGRID_MSG_H /* 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_VALGRIND_H /* Define to 1 if you have the `xbt_mutex_try_acquire' function. */ #undef HAVE_XBT_MUTEX_TRY_ACQUIRE /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* use STARPU_ATLAS library */ #undef STARPU_ATLAS /* location of StarPU build directory */ #undef STARPU_BUILD_DIR /* enable debugging statements */ #undef STARPU_DEBUG /* enable developer warnings */ #undef STARPU_DEVEL /* Define to 1 to disable asynchronous copy between CPU and GPU devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_COPY /* Define to 1 to disable asynchronous copy between CPU and CUDA devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY /* Define to 1 to disable asynchronous copy between CPU and OpenCL devices */ #undef STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY /* enable statistics */ #undef STARPU_ENABLE_STATS /* Path to the GNU debugger. */ #undef STARPU_GDB_PATH /* use STARPU_GOTO library */ #undef STARPU_GOTO /* Define to 1 if CUDA device properties include BusID */ #undef STARPU_HAVE_BUSID /* cufftDoubleComplex is available */ #undef STARPU_HAVE_CUFFTDOUBLECOMPLEX /* CURAND is available */ #undef STARPU_HAVE_CURAND /* Define to 1 if CUDA device properties include DomainID */ #undef STARPU_HAVE_DOMAINID /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_F77_H /* Define this if a Fortran compiler is available */ #undef STARPU_HAVE_FC /* Define to 1 if you have the libfftw3 library. */ #undef STARPU_HAVE_FFTW /* Define to 1 if you have the libfftw3f library. */ #undef STARPU_HAVE_FFTWF /* Define to 1 if you have the libfftw3l library. */ #undef STARPU_HAVE_FFTWL /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_GLPK_H /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_HELGRIND_H /* Define to 1 if you have the hwloc library. */ #undef STARPU_HAVE_HWLOC /* Define this if icc is available */ #undef STARPU_HAVE_ICC /* libnuma is available */ #undef STARPU_HAVE_LIBNUMA /* Define to 1 if you have the MAGMA library. */ #undef STARPU_HAVE_MAGMA /* Define to 1 if you have the header file. */ #undef STARPU_HAVE_MALLOC_H /* Define to 1 if you have the `memalign' function. */ #undef STARPU_HAVE_MEMALIGN /* Define to 1 if the function nearbyintf is available. */ #undef STARPU_HAVE_NEARBYINTF /* Define to 1 if you have the `posix_memalign' function. */ #undef STARPU_HAVE_POSIX_MEMALIGN /* Define to 1 if you have libpoti */ #undef STARPU_HAVE_POTI /* pthread_barrier is available */ #undef STARPU_HAVE_PTHREAD_BARRIER /* Define to 1 if the function rintf is available. */ #undef STARPU_HAVE_RINTF /* Define to 1 if the function sched_yield is available. */ #undef STARPU_HAVE_SCHED_YIELD /* Define to 1 if the function setenv is available. */ #undef STARPU_HAVE_SETENV /* Define to 1 if you have msg.h in simgrid/. */ #undef STARPU_HAVE_SIMGRID_MSG_H /* 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 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 the directory where StarPU's headers are installed. */ #undef STARPU_INCLUDE_DIR /* 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 memory nodes */ #undef STARPU_MAXNODES /* maximum number of OPENCL devices */ #undef STARPU_MAXOPENCLDEVS /* enable memory stats */ #undef STARPU_MEMORY_STATS /* Minor version number of StarPU. */ #undef STARPU_MINOR_VERSION /* use MKL library */ #undef STARPU_MKL /* enable performance model debug */ #undef STARPU_MODEL_DEBUG /* enable StarPU MPI activity polling method */ #undef STARPU_MPI_ACTIVITY /* Using native windows threads */ #undef STARPU_NATIVE_WINTHREADS /* 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 this to enable using an OpenCL simulator */ #undef STARPU_OPENCL_SIMULATOR /* enable OpenGL rendering of some examples */ #undef STARPU_OPENGL_RENDER /* 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 /* Define this to enable simgrid execution */ #undef STARPU_SIMGRID /* check spinlock use */ #undef STARPU_SPINLOCK_CHECK /* location of StarPU sources */ #undef STARPU_SRC_DIR /* use user defined library */ #undef STARPU_SYSTEM_BLAS /* enable data allocation cache */ #undef STARPU_USE_ALLOCATION_CACHE /* 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 /* whether the StarPU MPI library is available */ #undef STARPU_USE_MPI /* OpenCL support is activated */ #undef STARPU_USE_OPENCL /* enable sc_hypervisor lib */ #undef STARPU_USE_SC_HYPERVISOR /* StarPU-Top is activated */ #undef STARPU_USE_TOP /* Define to 1 to disable STARPU_SKIP_IF_VALGRIND when running tests. */ #undef STARPU_VALGRIND_FULL /* display verbose debug messages */ #undef STARPU_VERBOSE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif #if defined(STARPU_DEVEL) && defined(BUILDING_STARPU) # ifndef STARPU_CHECKED_UNISTD_H # define STARPU_CHECKED_UNISTD_H # ifdef _UNISTD_H # define _UNISTD_H PLEASE_DONT_INCLUDE_IT # error Please do not unconditionally include unistd.h, it is not available on Windows, include config.h and test for HAVE_UNISTD_H # endif # endif #endif starpu-1.1.5/src/common/fxt.c0000644000373600000000000001234712571536572013016 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef STARPU_USE_FXT #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef __linux__ #include /* for SYS_gettid */ #elif defined(__FreeBSD__) #include /* for thr_self() */ #endif static char _STARPU_PROF_FILE_USER[128]; static int _starpu_fxt_started = 0; static int _starpu_written = 0; static int _starpu_id; #ifdef STARPU_SIMGRID /* Give virtual time to FxT */ uint64_t fut_getstamp(void) { return starpu_timing_now()*1000.; } #endif long _starpu_gettid(void) { #ifdef STARPU_SIMGRID return (uintptr_t) MSG_process_self(); #else #if defined(__linux__) return syscall(SYS_gettid); #elif defined(__FreeBSD__) long tid; thr_self(&tid); return tid; #elif defined(_WIN32) && !defined(__CYGWIN__) return (long) GetCurrentThreadId(); #else return (long) pthread_self(); #endif #endif } static void _starpu_profile_set_tracefile(void *last, ...) { va_list vl; char *user; char *fxt_prefix = starpu_getenv("STARPU_FXT_PREFIX"); if (!fxt_prefix) fxt_prefix = "/tmp/"; va_start(vl, last); vsprintf(_STARPU_PROF_FILE_USER, fxt_prefix, vl); va_end(vl); user = starpu_getenv("USER"); if (!user) user = ""; char suffix[128]; snprintf(suffix, 128, "prof_file_%s_%d", user, _starpu_id); strcat(_STARPU_PROF_FILE_USER, 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(NULL); #ifdef HAVE_FUT_SET_FILENAME fut_set_filename(_STARPU_PROF_FILE_USER); #endif } void starpu_fxt_start_profiling() { unsigned threadid = _starpu_gettid(); fut_keychange(FUT_ENABLE, FUT_KEYMASKALL, threadid); _STARPU_TRACE_EVENT("start_profiling"); } void starpu_fxt_stop_profiling() { unsigned threadid = _starpu_gettid(); _STARPU_TRACE_EVENT("stop_profiling"); fut_keychange(FUT_DISABLE, FUT_KEYMASKALL, threadid); } void _starpu_init_fxt_profiling(unsigned trace_buffer_size) { unsigned threadid; if (!_starpu_fxt_started) { _starpu_fxt_started = 1; _starpu_written = 0; _starpu_profile_set_tracefile(NULL); } #ifdef HAVE_FUT_SET_FILENAME fut_set_filename(_STARPU_PROF_FILE_USER); #endif #ifdef HAVE_ENABLE_FUT_FLUSH // when the event buffer is full, fxt stops recording events. // The trace may thus be incomplete. // Enable the fut_flush function which is called when the // fxt event buffer is full to flush the buffer to disk, // therefore allowing to record the remaining events. enable_fut_flush(); #endif threadid = _starpu_gettid(); atexit(_starpu_stop_fxt_profiling); unsigned int key_mask = FUT_KEYMASKALL; if (fut_setup(trace_buffer_size / sizeof(unsigned long), key_mask, threadid) < 0) { perror("fut_setup"); STARPU_ABORT(); } fut_keychange(FUT_ENABLE, key_mask, threadid); return; } static void _starpu_generate_paje_trace(char *input_fxt_filename, char *output_paje_filename) { /* We take default options */ struct starpu_fxt_options options; starpu_fxt_options_init(&options); /* TODO parse some STARPU_GENERATE_TRACE_OPTIONS env variable */ options.ninputfiles = 1; options.filenames[0] = input_fxt_filename; options.out_paje_path = output_paje_filename; options.file_prefix = ""; options.file_rank = -1; starpu_fxt_generate_trace(&options); } void _starpu_stop_fxt_profiling(void) { if (!_starpu_written) { #ifdef STARPU_VERBOSE char hostname[128]; gethostname(hostname, 128); fprintf(stderr, "Writing FxT traces into file %s:%s\n", hostname, _STARPU_PROF_FILE_USER); #endif fut_endup(_STARPU_PROF_FILE_USER); /* Should we generate a Paje trace directly ? */ int generate_trace = starpu_get_env_number("STARPU_GENERATE_TRACE"); if (generate_trace == 1) _starpu_generate_paje_trace(_STARPU_PROF_FILE_USER, "paje.trace"); int ret = fut_done(); if (ret < 0) { /* Something went wrong with the FxT trace (eg. there * was too many events) */ fprintf(stderr, "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_start_profiling() { } void starpu_fxt_stop_profiling() { } #endif // STARPU_USE_FXT void starpu_trace_user_event(unsigned long code STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_USE_FXT _STARPU_TRACE_USER_EVENT(code); #endif } starpu-1.1.5/src/common/hash.c0000644000373600000000000000361612571536572013137 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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 ^ (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.1.5/src/common/starpu_spinlock.h0000644000373600000000000000406012571536572015433 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_SPINLOCK_H__ #define __STARPU_SPINLOCK_H__ #include #include #include #include #include struct _starpu_spinlock { #ifdef STARPU_SIMGRID int taken; #elif defined(STARPU_SPINLOCK_CHECK) starpu_pthread_mutexattr_t errcheck_attr; starpu_pthread_mutex_t errcheck_lock; #elif defined(HAVE_PTHREAD_SPIN_LOCK) _starpu_pthread_spinlock_t lock; #else /* we only have a trivial implementation yet ! */ uint32_t taken STARPU_ATTRIBUTE_ALIGNED(16); #endif #ifdef STARPU_SPINLOCK_CHECK const char *last_taker; #endif }; int _starpu_spin_init(struct _starpu_spinlock *lock); int _starpu_spin_destroy(struct _starpu_spinlock *lock); int _starpu_spin_lock(struct _starpu_spinlock *lock); #if defined(STARPU_SPINLOCK_CHECK) #define _starpu_spin_lock(lock) ({ \ _starpu_spin_lock(lock); \ (lock)->last_taker = __starpu_func__; \ 0; \ }) #endif int _starpu_spin_trylock(struct _starpu_spinlock *lock); #if defined(STARPU_SPINLOCK_CHECK) #define _starpu_spin_trylock(lock) ({ \ int err = _starpu_spin_trylock(lock); \ if (!err) \ (lock)->last_taker = __starpu_func__; \ err; \ }) #endif int _starpu_spin_checklocked(struct _starpu_spinlock *lock); int _starpu_spin_unlock(struct _starpu_spinlock *lock); #define STARPU_SPIN_MAXTRY 10 #endif // __STARPU_SPINLOCK_H__ starpu-1.1.5/src/common/starpu_spinlock.c0000644000373600000000000001035712571536572015434 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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_SIMGRID #include #endif int _starpu_spin_init(struct _starpu_spinlock *lock) { #ifdef STARPU_SIMGRID lock->taken = 0; return 0; #elif defined(STARPU_SPINLOCK_CHECK) // memcpy(&lock->errcheck_lock, PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, sizeof(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)); int ret; ret = pthread_mutexattr_init(&lock->errcheck_attr); STARPU_CHECK_RETURN_VALUE(ret, "pthread_mutexattr_init"); ret = pthread_mutexattr_settype(&lock->errcheck_attr, PTHREAD_MUTEX_ERRORCHECK); STARPU_ASSERT(!ret); ret = pthread_mutex_init(&lock->errcheck_lock, &lock->errcheck_attr); return ret; #elif defined(HAVE_PTHREAD_SPIN_LOCK) int ret = pthread_spin_init(&lock->lock, 0); STARPU_ASSERT(!ret); return ret; #else lock->taken = 0; return 0; #endif } int _starpu_spin_destroy(struct _starpu_spinlock *lock STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID /* we don't do anything */ return 0; #elif defined(STARPU_SPINLOCK_CHECK) pthread_mutexattr_destroy(&lock->errcheck_attr); return pthread_mutex_destroy(&lock->errcheck_lock); #elif defined(HAVE_PTHREAD_SPIN_LOCK) int ret = pthread_spin_destroy(&lock->lock); STARPU_ASSERT(!ret); return ret; #else /* we don't do anything */ return 0; #endif } #undef _starpu_spin_lock int _starpu_spin_lock(struct _starpu_spinlock *lock) { #ifdef STARPU_SIMGRID while (1) { if (!lock->taken) { lock->taken = 1; return 0; } /* Give hand to another thread, hopefully the one which has the * spinlock and probably just has also a short-lived mutex. */ MSG_process_sleep(0.000001); STARPU_UYIELD(); } #elif defined(STARPU_SPINLOCK_CHECK) int ret = pthread_mutex_lock(&lock->errcheck_lock); STARPU_ASSERT(!ret); return ret; #elif defined(HAVE_PTHREAD_SPIN_LOCK) int ret = pthread_spin_lock(&lock->lock); STARPU_ASSERT(!ret); return ret; #else uint32_t prev; do { prev = STARPU_TEST_AND_SET(&lock->taken, 1); if (prev) STARPU_UYIELD(); } while (prev); return 0; #endif } int _starpu_spin_checklocked(struct _starpu_spinlock *lock) { #ifdef STARPU_SIMGRID STARPU_ASSERT(lock->taken); return !lock->taken; #elif defined(STARPU_SPINLOCK_CHECK) int ret = starpu_pthread_mutex_trylock(&lock->errcheck_lock); STARPU_ASSERT(ret != 0); return ret == 0; #elif defined(HAVE_PTHREAD_SPIN_LOCK) int ret = pthread_spin_trylock(&lock->lock); STARPU_ASSERT(ret != 0); return ret == 0; #else STARPU_ASSERT(lock->taken); return !lock->taken; #endif } #undef _starpu_spin_trylock int _starpu_spin_trylock(struct _starpu_spinlock *lock) { #ifdef STARPU_SIMGRID if (lock->taken) return EBUSY; lock->taken = 1; return 0; #elif defined(STARPU_SPINLOCK_CHECK) int ret = starpu_pthread_mutex_trylock(&lock->errcheck_lock); STARPU_ASSERT(!ret || (ret == EBUSY)); return ret; #elif defined(HAVE_PTHREAD_SPIN_LOCK) int ret = pthread_spin_trylock(&lock->lock); STARPU_ASSERT(!ret || (ret == EBUSY)); return ret; #else uint32_t prev; prev = STARPU_TEST_AND_SET(&lock->taken, 1); return (prev == 0)?0:EBUSY; #endif } int _starpu_spin_unlock(struct _starpu_spinlock *lock STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID lock->taken = 0; return 0; #elif defined(STARPU_SPINLOCK_CHECK) int ret = pthread_mutex_unlock(&lock->errcheck_lock); STARPU_ASSERT(!ret); return ret; #elif defined(HAVE_PTHREAD_SPIN_LOCK) int ret = pthread_spin_unlock(&lock->lock); STARPU_ASSERT(!ret); return ret; #else STARPU_RELEASE(&lock->taken); return 0; #endif } starpu-1.1.5/src/common/list.h0000644000373600000000000002106412571536572013171 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 * @brief Listes doublement chainées automatiques */ /** @remarks list how-to * ********************************************************* * LIST_TYPE(FOO, contenu); * - déclare les types suivants * + pour les cellules : FOO * + pour les listes : FOO_list * + pour les itérateurs : FOO * - déclare les accesseurs suivants : * * création d'une cellule * FOO_t FOO_new(void); * * suppression d'une cellule * void FOO_delete(FOO_t); * * création d'une liste (vide) * FOO_list_t FOO_list_new(void); * * initialisation d'une liste (vide) * void FOO_list_init(struct FOO_list*); * * suppression d'une liste * void FOO_list_delete(FOO_list_t); * * teste si une liste est vide * int FOO_list_empty(FOO_list_t); * * retire un élément de la liste * void FOO_list_erase(FOO_list_t, FOO_t); * * ajoute une élément en queue de liste * void FOO_list_push_back(FOO_list_t, FOO_t); * * ajoute un élément en tête de liste * void FOO_list_push_front(FOO_list_t, FOO_t); * * ajoute un élément avant un élément * void FOO_list_insert_before(struct FOO_list*, struct FOO*new, struct FOO*); * * ajoute un élément après un élément * void FOO_list_insert_after(struct FOO_list*, struct FOO*new, struct FOO*); * * ajoute la deuxième liste à la fin de la première liste * FOO_t FOO_list_push_list_back(FOO_list_t, FOO_list_t); * * ajoute la première liste au début de la deuxième liste * FOO_t FOO_list_push_list_front(FOO_list_t, FOO_list_t); * * retire l'élément en queue de liste * FOO_t FOO_list_pop_back(FOO_list_t); * * retire l'élement en tête de liste * FOO_t FOO_list_pop_front(FOO_list_t); * * retourne l'élément en queue de liste * FOO_t FOO_list_back(FOO_list_t); * * retourne l'élement en tête de liste * FOO_t FOO_list_front(FOO_list_t); * * vérifie si la liste chainée est cohérente * int FOO_list_check(FOO_list_t); * * * FOO_t FOO_list_begin(FOO_list_t); * * * FOO_t FOO_list_end(FOO_list_t); * * * FOO_t FOO_list_next(FOO_t) * * * int FOO_list_size(FOO_list_t) * ********************************************************* * Exemples d'utilisation : * - au départ, on a : * struct ma_structure_s * { * int a; * int b; * }; * - on veut en faire une liste. On remplace la déclaration par : * LIST_TYPE(ma_structure, * int a; * int b; * ); * qui crée les types ma_structure_t et ma_structure_list_t. * - allocation d'une liste vide : * ma_structure_list_t l = ma_structure_list_new(); * - ajouter un élément 'e' en tête de la liste 'l' : * ma_structure_t e = ma_structure_new(); * e->a = 0; * e->b = 1; * ma_structure_list_push_front(l, e); * - itérateur de liste : * ma_structure i; * for(i = ma_structure_list_begin(l); * i != ma_structure_list_end(l); * i = ma_structure_list_next(i)) * { * printf("a=%d; b=%d\n", i->a, i->b); * } * ********************************************************* */ /**@hideinitializer * Generates a new type for list of elements */ #define LIST_TYPE(ENAME, DECL) \ LIST_CREATE_TYPE(ENAME, DECL) /**@hideinitializer * The effective type declaration for lists */ #define LIST_CREATE_TYPE(ENAME, DECL) \ /** from automatic type: struct ENAME */ \ struct ENAME \ { \ struct ENAME *_prev; /**< @internal previous cell */ \ struct ENAME *_next; /**< @internal next cell */ \ DECL \ }; \ /** @internal */ \ struct ENAME##_list \ { \ struct ENAME *_head; /**< @internal head of the list */ \ struct ENAME *_tail; /**< @internal tail of the list */ \ }; \ /** @internal */static inline struct ENAME *ENAME##_new(void) \ { struct ENAME *e = (struct ENAME *)malloc(sizeof(struct ENAME)); \ e->_next = NULL; e->_prev = NULL; return e; } \ /** @internal */static inline void ENAME##_delete(struct ENAME *e) \ { free(e); } \ /** @internal */static inline void ENAME##_list_push_front(struct ENAME##_list *l, struct ENAME *e) \ { if(l->_tail == NULL) l->_tail = e; else l->_head->_prev = e; \ e->_prev = NULL; e->_next = l->_head; l->_head = e; } \ /** @internal */static inline void ENAME##_list_push_back(struct ENAME##_list *l, struct ENAME *e) \ { if(l->_head == NULL) l->_head = e; else l->_tail->_next = e; \ e->_next = NULL; e->_prev = l->_tail; l->_tail = e; } \ /** @internal */static inline void ENAME##_list_insert_before(struct ENAME##_list *l, struct ENAME *e, struct ENAME *o) \ { struct ENAME *p = o->_prev; if (p) { p->_next = e; e->_prev = p; } else { l->_head = e; e->_prev = NULL; } \ e->_next = o; o->_prev = e; } \ /** @internal */static inline void ENAME##_list_insert_after(struct ENAME##_list *l, struct ENAME *e, struct ENAME *o) \ { struct ENAME *n = o->_next; if (n) { n->_prev = e; e->_next = n; } else { l->_tail = e; e->_next = NULL; } \ e->_prev = o; o->_next = e; } \ /** @internal */static inline void ENAME##_list_push_list_front(struct ENAME##_list *l1, struct ENAME##_list *l2) \ { if (l2->_head == NULL) { l2->_head = l1->_head; l2->_tail = l1->_tail; } \ else if (l1->_head != NULL) { l1->_tail->_next = l2->_head; l2->_head->_prev = l1->_tail; l2->_head = l1->_head; } } \ /** @internal */static inline void ENAME##_list_push_list_back(struct ENAME##_list *l1, struct ENAME##_list *l2) \ { if(l1->_head == NULL) { l1->_head = l2->_head; l1->_tail = l2->_tail; } \ else if (l2->_head != NULL) { l1->_tail->_next = l2->_head; l2->_head->_prev = l1->_tail; l1->_tail = l2->_tail; } } \ /** @internal */static inline struct ENAME *ENAME##_list_front(struct ENAME##_list *l) \ { return l->_head; } \ /** @internal */static inline struct ENAME *ENAME##_list_back(struct ENAME##_list *l) \ { return l->_tail; } \ /** @internal */static inline void ENAME##_list_init(struct ENAME##_list *l) \ { l->_head=NULL; l->_tail=l->_head; } \ /** @internal */static inline struct ENAME##_list *ENAME##_list_new(void) \ { struct ENAME##_list *l; l=(struct ENAME##_list *)malloc(sizeof(struct ENAME##_list)); \ ENAME##_list_init(l); return l; } \ /** @internal */static inline int ENAME##_list_empty(struct ENAME##_list *l) \ { return (l->_head == NULL); } \ /** @internal */static inline void ENAME##_list_delete(struct ENAME##_list *l) \ { free(l); } \ /** @internal */static inline void ENAME##_list_erase(struct ENAME##_list *l, struct ENAME *c) \ { struct ENAME *p = c->_prev; if(p) p->_next = c->_next; else l->_head = c->_next; \ if(c->_next) c->_next->_prev = p; else l->_tail = p; } \ /** @internal */static inline struct ENAME *ENAME##_list_pop_front(struct ENAME##_list *l) \ { struct ENAME *e = ENAME##_list_front(l); \ ENAME##_list_erase(l, e); return e; } \ /** @internal */static inline struct ENAME *ENAME##_list_pop_back(struct ENAME##_list *l) \ { struct ENAME *e = ENAME##_list_back(l); \ ENAME##_list_erase(l, e); return e; } \ /** @internal */static inline struct ENAME *ENAME##_list_begin(struct ENAME##_list *l) \ { return l->_head; } \ /** @internal */static inline struct ENAME *ENAME##_list_end(struct ENAME##_list *l STARPU_ATTRIBUTE_UNUSED) \ { return NULL; } \ /** @internal */static inline struct ENAME *ENAME##_list_next(struct ENAME *i) \ { return i->_next; } \ /** @internal */static inline int ENAME##_list_size(struct ENAME##_list *l) \ { struct ENAME *i=l->_head; int k=0; while(i!=NULL){k++;i=i->_next;} return k; } \ /** @internal */static inline int ENAME##_list_check(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; } starpu-1.1.5/src/common/utils.h0000644000373600000000000001147712571536572013365 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMMON_UTILS_H__ #define __COMMON_UTILS_H__ #include #include #include #include #include #include #include #ifdef STARPU_HAVE_SCHED_YIELD #include #endif #ifdef STARPU_HAVE_HELGRIND_H #include #endif #ifndef DO_CREQ_v_WW #define DO_CREQ_v_WW(_creqF, _ty1F, _arg1F, _ty2F, _arg2F) ((void)0) #endif #ifndef DO_CREQ_v_W #define DO_CREQ_v_W(_creqF, _ty1F, _arg1F) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_BEFORE #define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0) #endif #ifndef ANNOTATE_HAPPENS_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 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)) /* This is needed in some places to make valgrind yield to another thread to be * able to progress. */ #if defined(__i386__) || defined(__x86_64__) #define _STARPU_UYIELD() __asm__ __volatile("rep; nop") #else #define _STARPU_UYIELD() ((void)0) #endif #if defined(STARPU_HAVE_SCHED_YIELD) && defined(STARPU_HAVE_HELGRIND_H) #define STARPU_UYIELD() do { if (STARPU_RUNNING_ON_VALGRIND) sched_yield(); else _STARPU_UYIELD(); } while (0) #else #define STARPU_UYIELD() _STARPU_UYIELD() #endif #ifdef STARPU_VERBOSE # define _STARPU_DEBUG(fmt, ...) do { if (!_starpu_silent) {fprintf(stderr, "[starpu][%s] " fmt ,__starpu_func__ ,## __VA_ARGS__); fflush(stderr); }} while(0) #else # define _STARPU_DEBUG(fmt, ...) do { } while (0) #endif #ifdef STARPU_VERBOSE0 # define _STARPU_LOG_IN() do { if (!_starpu_silent) {fprintf(stderr, "[starpu][%ld][%s] -->\n", pthread_self(), __starpu_func__ ); }} while(0) # define _STARPU_LOG_OUT() do { if (!_starpu_silent) {fprintf(stderr, "[starpu][%ld][%s] <--\n", pthread_self(), __starpu_func__ ); }} while(0) # define _STARPU_LOG_OUT_TAG(outtag) do { if (!_starpu_silent) {fprintf(stderr, "[starpu][%ld][%s] <-- (%s)\n", pthread_self(), __starpu_func__, outtag); }} while(0) #else # define _STARPU_LOG_IN() # define _STARPU_LOG_OUT() # define _STARPU_LOG_OUT_TAG(outtag) #endif #define _STARPU_DISP(fmt, ...) do { if (!_starpu_silent) {fprintf(stderr, "[starpu][%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 #define _STARPU_IS_ZERO(a) (a == 0.0) #else #define _STARPU_IS_ZERO(a) (fpclassify(a) == FP_ZERO) #endif int _starpu_mkpath(const char *s, mode_t mode); void _starpu_mkpath_and_check(const char *s, mode_t mode); int _starpu_ftruncate(FILE *file); 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); 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.1.5/src/common/thread.h0000644000373600000000000000167412571536572013472 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPr is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMMON_THREAD_H__ #define __COMMON_THREAD_H__ #include #ifdef HAVE_PTHREAD_SPIN_LOCK typedef pthread_spinlock_t _starpu_pthread_spinlock_t; #endif #endif /* __COMMON_THREAD_H__ */ starpu-1.1.5/src/common/fxt.h0000644000373600000000000005030312571536572013015 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __FXT_H__ #define __FXT_H__ #ifndef _GNU_SOURCE #define _GNU_SOURCE /* ou _BSD_SOURCE ou _SVID_SOURCE */ #endif #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include /* some key to identify the worker kind */ #define _STARPU_FUT_APPS_KEY 0x100 #define _STARPU_FUT_CPU_KEY 0x101 #define _STARPU_FUT_CUDA_KEY 0x102 #define _STARPU_FUT_OPENCL_KEY 0x103 #define _STARPU_FUT_WORKER_INIT_START 0x5100 #define _STARPU_FUT_WORKER_INIT_END 0x5101 #define _STARPU_FUT_START_CODELET_BODY 0x5102 #define _STARPU_FUT_END_CODELET_BODY 0x5103 #define _STARPU_FUT_JOB_PUSH 0x5104 #define _STARPU_FUT_JOB_POP 0x5105 #define _STARPU_FUT_UPDATE_TASK_CNT 0x5106 #define _STARPU_FUT_START_FETCH_INPUT 0x5107 #define _STARPU_FUT_END_FETCH_INPUT 0x5108 #define _STARPU_FUT_START_PUSH_OUTPUT 0x5109 #define _STARPU_FUT_END_PUSH_OUTPUT 0x5110 #define _STARPU_FUT_TAG 0x5111 #define _STARPU_FUT_TAG_DEPS 0x5112 #define _STARPU_FUT_TASK_DEPS 0x5113 #define _STARPU_FUT_DATA_COPY 0x5114 #define _STARPU_FUT_WORK_STEALING 0x5115 #define _STARPU_FUT_WORKER_DEINIT_START 0x5116 #define _STARPU_FUT_WORKER_DEINIT_END 0x5117 #define _STARPU_FUT_WORKER_SLEEP_START 0x5118 #define _STARPU_FUT_WORKER_SLEEP_END 0x5119 #define _STARPU_FUT_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_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 0x5137 #define _STARPU_FUT_END_PROGRESS 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_START_UNPARTITION 0x5154 #define _STARPU_FUT_END_UNPARTITION 0x5155 #define _STARPU_FUT_START_FREE 0x5156 #define _STARPU_FUT_END_FREE 0x5157 #define _STARPU_FUT_START_WRITEBACK 0x5158 #define _STARPU_FUT_END_WRITEBACK 0x5159 #define _STARPU_FUT_HYPERVISOR_BEGIN 0x5160 #define _STARPU_FUT_HYPERVISOR_END 0x5161 #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 #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 long _starpu_gettid(void); /* Initialize the FxT library. */ void _starpu_init_fxt_profiling(unsigned trace_buffer_size); /* Stop the FxT library, and generate the trace file. */ void _starpu_stop_fxt_profiling(void); /* Associate the current processing unit to the identifier of the LWP that runs * the worker. */ void _starpu_fxt_register_thread(unsigned); #ifdef FUT_NEEDS_COMMIT #define _STARPU_FUT_COMMIT(size) fut_commitstampedbuffer(size) #else #define _STARPU_FUT_COMMIT(size) do { } while (0) #endif #ifdef FUT_DO_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 /* workerkind = _STARPU_FUT_CPU_KEY for instance */ #define _STARPU_TRACE_NEW_MEM_NODE(nodeid) \ FUT_DO_PROBE2(_STARPU_FUT_NEW_MEM_NODE, nodeid, _starpu_gettid()); #define _STARPU_TRACE_WORKER_INIT_START(workerkind, workerid, devid, memnode) \ FUT_DO_PROBE5(_STARPU_FUT_WORKER_INIT_START, workerkind, workerid, devid, memnode, _starpu_gettid()); #define _STARPU_TRACE_WORKER_INIT_END \ FUT_DO_PROBE1(_STARPU_FUT_WORKER_INIT_END, _starpu_gettid()); #define _STARPU_TRACE_START_CODELET_BODY(job) \ do { \ const char *model_name = _starpu_job_get_model_name((job)); \ if (model_name) \ { \ /* we include the symbol name */ \ _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_START_CODELET_BODY, (job), ((job)->task)->sched_ctx, _starpu_gettid(), 1, model_name); \ } \ else { \ FUT_DO_PROBE4(_STARPU_FUT_START_CODELET_BODY, (job), ((job)->task)->sched_ctx, _starpu_gettid(), 0); \ } \ } while(0); #define _STARPU_TRACE_END_CODELET_BODY(job, nimpl, archtype) \ do { \ const size_t job_size = _starpu_job_get_data_size((job)->task->cl?(job)->task->cl->model:NULL, archtype, nimpl, (job)); \ const uint32_t job_hash = _starpu_compute_buffers_footprint((job)->task->cl?(job)->task->cl->model:NULL, archtype, nimpl, (job));\ FUT_DO_PROBE5(_STARPU_FUT_END_CODELET_BODY, (job), (job_size), (job_hash), (archtype), _starpu_gettid()); \ } while(0); #define _STARPU_TRACE_START_CALLBACK(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_CALLBACK, job, _starpu_gettid()); #define _STARPU_TRACE_END_CALLBACK(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_CALLBACK, job, _starpu_gettid()); #define _STARPU_TRACE_JOB_PUSH(task, prio) \ FUT_DO_PROBE3(_STARPU_FUT_JOB_PUSH, task, prio, _starpu_gettid()); #define _STARPU_TRACE_JOB_POP(task, prio) \ FUT_DO_PROBE3(_STARPU_FUT_JOB_POP, task, prio, _starpu_gettid()); #define _STARPU_TRACE_UPDATE_TASK_CNT(counter) \ FUT_DO_PROBE2(_STARPU_FUT_UPDATE_TASK_CNT, counter, _starpu_gettid()) #define _STARPU_TRACE_START_FETCH_INPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_FETCH_INPUT, job, _starpu_gettid()); #define _STARPU_TRACE_END_FETCH_INPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_FETCH_INPUT, job, _starpu_gettid()); #define _STARPU_TRACE_START_PUSH_OUTPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_START_PUSH_OUTPUT, job, _starpu_gettid()); #define _STARPU_TRACE_END_PUSH_OUTPUT(job) \ FUT_DO_PROBE2(_STARPU_FUT_END_PUSH_OUTPUT, job, _starpu_gettid()); #define _STARPU_TRACE_TAG(tag, job) \ FUT_DO_PROBE2(_STARPU_FUT_TAG, tag, (job)->job_id) #define _STARPU_TRACE_TAG_DEPS(tag_child, tag_father) \ FUT_DO_PROBE2(_STARPU_FUT_TAG_DEPS, tag_child, tag_father) #define _STARPU_TRACE_TASK_DEPS(job_prev, job_succ) \ FUT_DO_PROBE2(_STARPU_FUT_TASK_DEPS, (job_prev)->job_id, (job_succ)->job_id) #define _STARPU_TRACE_GHOST_TASK_DEPS(ghost_prev_id, job_succ_id) \ FUT_DO_PROBE2(_STARPU_FUT_TASK_DEPS, (ghost_prev_id), (job_succ_id)) #define _STARPU_TRACE_TASK_DONE(job) \ do { \ unsigned exclude_from_dag = (job)->exclude_from_dag; \ const char *model_name = _starpu_job_get_model_name((job)); \ if (model_name) \ { \ _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_TASK_DONE, (job)->job_id, _starpu_gettid(), (long unsigned)exclude_from_dag, 1, model_name);\ } \ else { \ FUT_DO_PROBE4(_STARPU_FUT_TASK_DONE, (job)->job_id, _starpu_gettid(), (long unsigned)exclude_from_dag, 0);\ } \ } while(0); #define _STARPU_TRACE_TAG_DONE(tag) \ do { \ struct _starpu_job *job = (tag)->job; \ const char *model_name = _starpu_job_get_model_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_COPY(src_node, dst_node, size) \ FUT_DO_PROBE3(_STARPU_FUT_DATA_COPY, src_node, dst_node, size) #define _STARPU_TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id) \ FUT_DO_PROBE4(_STARPU_FUT_START_DRIVER_COPY, src_node, dst_node, size, com_id) #define _STARPU_TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id) \ FUT_DO_PROBE4(_STARPU_FUT_END_DRIVER_COPY, src_node, dst_node, size, com_id) #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_USER_DEFINED_START \ FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_START, _starpu_gettid()); #define _STARPU_TRACE_USER_DEFINED_END \ FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_END, _starpu_gettid()); #define _STARPU_TRACE_START_ALLOC(memnode, size) \ FUT_DO_PROBE3(_STARPU_FUT_START_ALLOC, memnode, _starpu_gettid(), size); #define _STARPU_TRACE_END_ALLOC(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_ALLOC_REUSE(memnode, size) \ FUT_DO_PROBE3(_STARPU_FUT_START_ALLOC_REUSE, memnode, _starpu_gettid(), size); #define _STARPU_TRACE_END_ALLOC_REUSE(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC_REUSE, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_FREE(memnode, size) \ FUT_DO_PROBE3(_STARPU_FUT_START_FREE, memnode, _starpu_gettid(), size); #define _STARPU_TRACE_END_FREE(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_FREE, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_WRITEBACK(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_START_WRITEBACK, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_WRITEBACK(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_WRITEBACK, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_MEMRECLAIM(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_START_MEMRECLAIM, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_MEMRECLAIM(memnode) \ FUT_DO_PROBE2(_STARPU_FUT_END_MEMRECLAIM, 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) \ do {} while (0); // FUT_DO_PROBE2(_STARPU_FUT_START_PROGRESS, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_PROGRESS(memnode) \ do {} while (0); //FUT_DO_PROBE2(_STARPU_FUT_END_PROGRESS, 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_HYPERVISOR_BEGIN() \ FUT_DO_PROBE1(_STARPU_FUT_HYPERVISOR_BEGIN, _starpu_gettid()); #define _STARPU_TRACE_HYPERVISOR_END() \ do {} while (0) // FUT_DO_PROBE1(_STARPU_FUT_HYPERVISOR_END, _starpu_gettid()); #define _STARPU_TRACE_START_UNPARTITION(handle, memnode) \ FUT_DO_PROBE3(_STARPU_FUT_START_UNPARTITION, memnode, _starpu_gettid(), handle); #define _STARPU_TRACE_END_UNPARTITION(handle, memnode) \ FUT_DO_PROBE3(_STARPU_FUT_END_UNPARTITION, memnode, _starpu_gettid(), handle); #else // !STARPU_USE_FXT /* Dummy macros in case FxT is disabled */ #define _STARPU_TRACE_NEW_MEM_NODE(nodeid) do {} while(0) #define _STARPU_TRACE_WORKER_INIT_START(a,b,c) do {} while(0) #define _STARPU_TRACE_WORKER_INIT_END do {} while(0) #define _STARPU_TRACE_START_CODELET_BODY(job) do {} while(0) #define _STARPU_TRACE_END_CODELET_BODY(job, nimpl, a) do {} while(0) #define _STARPU_TRACE_START_CALLBACK(job) do {} while(0) #define _STARPU_TRACE_END_CALLBACK(job) do {} while(0) #define _STARPU_TRACE_JOB_PUSH(task, prio) do {} while(0) #define _STARPU_TRACE_JOB_POP(task, prio) do {} while(0) #define _STARPU_TRACE_UPDATE_TASK_CNT(counter) do {} while(0) #define _STARPU_TRACE_START_FETCH_INPUT(job) do {} while(0) #define _STARPU_TRACE_END_FETCH_INPUT(job) do {} while(0) #define _STARPU_TRACE_START_PUSH_OUTPUT(job) do {} while(0) #define _STARPU_TRACE_END_PUSH_OUTPUT(job) do {} while(0) #define _STARPU_TRACE_TAG(tag, job) do {} while(0) #define _STARPU_TRACE_TAG_DEPS(a, b) do {} while(0) #define _STARPU_TRACE_TASK_DEPS(a, b) do {} while(0) #define _STARPU_TRACE_GHOST_TASK_DEPS(a, b) do {} while(0) #define _STARPU_TRACE_TASK_DONE(a) do {} while(0) #define _STARPU_TRACE_TAG_DONE(a) do {} while(0) #define _STARPU_TRACE_DATA_COPY(a, b, c) do {} while(0) #define _STARPU_TRACE_START_DRIVER_COPY(a,b,c,d) do {} while(0) #define _STARPU_TRACE_END_DRIVER_COPY(a,b,c,d) do {} while(0) #define _STARPU_TRACE_START_DRIVER_COPY_ASYNC(a,b) do {} while(0) #define _STARPU_TRACE_END_DRIVER_COPY_ASYNC(a,b) do {} while(0) #define _STARPU_TRACE_WORK_STEALING(a, b) do {} while(0) #define _STARPU_TRACE_WORKER_DEINIT_START do {} while(0) #define _STARPU_TRACE_WORKER_DEINIT_END(a) do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_START do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_END do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_PUSH do {} while(0) #define _STARPU_TRACE_WORKER_SCHEDULING_POP do {} while(0) #define _STARPU_TRACE_WORKER_SLEEP_START do {} while(0) #define _STARPU_TRACE_WORKER_SLEEP_END do {} while(0) #define _STARPU_TRACE_USER_DEFINED_START do {} while(0) #define _STARPU_TRACE_USER_DEFINED_END do {} while(0) #define _STARPU_TRACE_START_ALLOC(memnode, size) do {} while(0) #define _STARPU_TRACE_END_ALLOC(memnode) do {} while(0) #define _STARPU_TRACE_START_ALLOC_REUSE(a, size) do {} while(0) #define _STARPU_TRACE_END_ALLOC_REUSE(a) do {} while(0) #define _STARPU_TRACE_START_FREE(memnode, size) do {} while(0) #define _STARPU_TRACE_END_FREE(memnode) do {} while(0) #define _STARPU_TRACE_START_WRITEBACK(memnode) do {} while(0) #define _STARPU_TRACE_END_WRITEBACK(memnode) do {} while(0) #define _STARPU_TRACE_START_MEMRECLAIM(memnode) do {} while(0) #define _STARPU_TRACE_END_MEMRECLAIM(memnode) do {} while(0) #define _STARPU_TRACE_START_PROGRESS(memnode) do {} while(0) #define _STARPU_TRACE_END_PROGRESS(memnode) do {} while(0) #define _STARPU_TRACE_USER_EVENT(code) do {} while(0) #define _STARPU_TRACE_SET_PROFILING(status) do {} while(0) #define _STARPU_TRACE_TASK_WAIT_FOR_ALL do {} while(0) #define _STARPU_TRACE_START_UNPARTITION(handle, memnode) do {} while(0) #define _STARPU_TRACE_END_UNPARTITION(handle, memnode) do {} while(0) #define _STARPU_TRACE_HYPERVISOR_BEGIN() do {} while(0) #define _STARPU_TRACE_HYPERVISOR_END() do {} while(0) #endif // STARPU_USE_FXT #endif // __FXT_H__ starpu-1.1.5/src/common/barrier_counter.c0000644000373600000000000001242412571536572015376 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include 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; STARPU_PTHREAD_MUTEX_LOCK(&barrier->mutex); while (barrier->reached_start > 0) STARPU_PTHREAD_COND_WAIT(&barrier->cond, &barrier->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&barrier->mutex); return 0; } 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->cond); } 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_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.1.5/src/common/rwlock.c0000644000373600000000000000624612571536572013517 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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.1.5/src/common/timing.h0000644000373600000000000000213412571536572013502 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef TIMING_H #define TIMING_H /* * _starpu_timing_init must be called prior to using any of these timing * functions. */ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include void _starpu_timing_init(void); void _starpu_clock_gettime(struct timespec *ts); #endif /* TIMING_H */ starpu-1.1.5/src/common/bitmap.c0000644000373600000000000001310212571536572013457 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Simon Archipoff * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifndef LONG_BIT #define LONG_BIT (sizeof(unsigned long) * 8) #endif struct starpu_bitmap { unsigned long * bits; int size; /* the size of bits array in number of unsigned long */ int cardinal; }; //#define DEBUG_BITMAP #ifdef DEBUG_BITMAP static int check_bitmap(struct starpu_bitmap *b) { int card = b->cardinal; int i = starpu_bitmap_first(b); int j; for(j = 0; j < card; j++) { if(i == -1) return 0; int tmp = starpu_bitmap_next(b,i); if(tmp == i) return 0; i = tmp; } if(i != -1) return 0; return 1; } #else #define check_bitmap(b) 1 #endif static int _count_bit(unsigned long e) { #if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4) return __builtin_popcountl(e); #else int c = 0; while(e) { c += e&1; e >>= 1; } return c; #endif } struct starpu_bitmap * starpu_bitmap_create(void) { struct starpu_bitmap * b = malloc(sizeof(*b)); memset(b,0,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) { b->bits = 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); a->bits = 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) { a->bits = 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 / LONG_BIT; int nb_bit = e % LONG_BIT; unsigned long mask = (~0ul) << (nb_bit + 1); 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.1.5/src/dolib.c0000644000373600000000000000317012571536575012013 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Wrapper to avoid msys' tendency to turn / into \ and : into ; */ #include #include #if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) #include #endif int main(int argc, char *argv[]) { char *prog, *arch, *def, *effective_version, *version, *lib; char s[1024]; char name[16]; int current, age, revision; if (argc != 7) { fprintf(stderr,"bad number of arguments"); exit(EXIT_FAILURE); } prog = argv[1]; arch = argv[2]; def = argv[3]; effective_version = argv[4]; version = argv[5]; lib = argv[6]; if (sscanf(version, "%d:%d:%d", ¤t, &revision, &age) != 3) exit(EXIT_FAILURE); _snprintf(name, sizeof(name), "libstarpu-%s-%d", effective_version, current - age); printf("using soname %s\n", name); _snprintf(s, sizeof(s), "\"%s\" /machine:%s /def:%s /name:%s /out:%s", prog, arch, def, name, lib); if (system(s)) { fprintf(stderr, "%s failed\n", s); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } starpu-1.1.5/src/datawizard/0002755000373600000000000000000012571541161012754 500000000000000starpu-1.1.5/src/datawizard/memory_manager.h0000644000373600000000000000337112571536575016066 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMORY_MANAGER_H__ #define __MEMORY_MANAGER_H__ #include /** * 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); /** * Indicates if memory can be allocated on the given node * * @param size amount of memory to allocate * @param node node where the memory is to be allocated * @return 1 if the given amount of memory can be allocated on the given node */ int _starpu_memory_manager_can_allocate_size(size_t size, unsigned node) STARPU_WARN_UNUSED_RESULT; /** * Indicates the given amount of memory is going to be deallocated from the given node * * @param size amount of memory to be deallocated * @param node node where the memory is going to be deallocated */ void _starpu_memory_manager_deallocate_size(size_t size, unsigned node); #endif /* __MEMORY_MANAGER_H__ */ starpu-1.1.5/src/datawizard/data_request.c0000644000373600000000000005653412571536575015551 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #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 /* requests that have not been treated at all */ static struct _starpu_data_request_list data_requests[STARPU_MAXNODES]; static struct _starpu_data_request_list prefetch_requests[STARPU_MAXNODES]; static starpu_pthread_mutex_t data_requests_list_mutex[STARPU_MAXNODES]; /* requests that are not terminated (eg. async transfers) */ static struct _starpu_data_request_list data_requests_pending[STARPU_MAXNODES]; static unsigned data_requests_npending[STARPU_MAXNODES]; static starpu_pthread_mutex_t data_requests_pending_list_mutex[STARPU_MAXNODES]; void _starpu_init_data_request_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { _starpu_data_request_list_init(&data_requests[i]); _starpu_data_request_list_init(&prefetch_requests[i]); /* Tell helgrind that we are fine with checking for list_empty * in _starpu_handle_node_data_requests, we will call it * periodically anyway */ STARPU_HG_DISABLE_CHECKING(data_requests[i]._head); STARPU_HG_DISABLE_CHECKING(prefetch_requests[i]._head); STARPU_PTHREAD_MUTEX_INIT(&data_requests_list_mutex[i], NULL); _starpu_data_request_list_init(&data_requests_pending[i]); data_requests_npending[i] = 0; STARPU_PTHREAD_MUTEX_INIT(&data_requests_pending_list_mutex[i], NULL); } STARPU_HG_DISABLE_CHECKING(data_requests_npending); } void _starpu_deinit_data_request_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { STARPU_PTHREAD_MUTEX_DESTROY(&data_requests_pending_list_mutex[i]); STARPU_PTHREAD_MUTEX_DESTROY(&data_requests_list_mutex[i]); } } /* Unlink the request from the handle. New requests can then be made. */ /* this should be called with the lock r->handle->header_lock taken */ static void _starpu_data_request_unlink(struct _starpu_data_request *r) { unsigned node; _starpu_spin_checklocked(&r->handle->header_lock); /* If this is a write only request, then there is no source and we use * the destination node to cache the request. Otherwise we store the * pending requests between src and dst. */ if (r->mode & STARPU_R) { node = r->src_replicate->memory_node; } else { 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, unsigned handling_node, enum starpu_data_access_mode mode, unsigned ndeps, unsigned is_prefetch) { struct _starpu_data_request *r = _starpu_data_request_new(); _starpu_spin_checklocked(&handle->header_lock); _starpu_spin_init(&r->lock); r->handle = handle; r->src_replicate = src_replicate; r->dst_replicate = dst_replicate; r->mode = mode; r->handling_node = handling_node; r->completed = 0; r->prefetch = is_prefetch; r->retval = -1; r->ndeps = ndeps; r->next_req_count = 0; r->callbacks = NULL; _starpu_spin_lock(&r->lock); /* Take a reference on the target for the request to be able to write it */ dst_replicate->refcnt++; handle->busy_count++; if (mode & STARPU_R) { unsigned src_node = src_replicate->memory_node; STARPU_ASSERT(!dst_replicate->request[src_node]); dst_replicate->request[src_node] = r; /* Take a reference on the source for the request to be able to read it */ src_replicate->refcnt++; handle->busy_count++; } else { unsigned dst_node = dst_replicate->memory_node; STARPU_ASSERT(!dst_replicate->request[dst_node]); dst_replicate->request[dst_node] = r; } r->refcnt = 1; _starpu_spin_unlock(&r->lock); return r; } int _starpu_wait_data_request_completion(struct _starpu_data_request *r, unsigned may_alloc) { int retval; int do_delete = 0; int completed; unsigned local_node = _starpu_memory_node_get_local_key(); do { STARPU_SYNCHRONIZE(); if (STARPU_RUNNING_ON_VALGRIND) completed = 1; else completed = r->completed; if (completed) { _starpu_spin_lock(&r->lock); if (r->completed) break; _starpu_spin_unlock(&r->lock); } #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(r->handling_node); #endif _starpu_datawizard_progress(local_node, may_alloc); } while (1); 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) { // _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_data_request_list_push_back(&prefetch_requests[handling_node], r); else _starpu_data_request_list_push_back(&data_requests[handling_node], r); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[handling_node]); #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(handling_node); #endif } /* We assume that r->lock is taken by the caller */ void _starpu_data_request_append_callback(struct _starpu_data_request *r, void (*callback_func)(void *), void *callback_arg) { STARPU_ASSERT(r); if (callback_func) { struct _starpu_callback_list *link = (struct _starpu_callback_list *) malloc(sizeof(struct _starpu_callback_list)); STARPU_ASSERT(link); 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; #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 #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); #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, next_req->handling_node); } r->completed = 1; /* Remove a reference on the destination replicate for the request */ STARPU_ASSERT(dst_replicate->refcnt > 0); dst_replicate->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; /* In case the source was "locked" by the request too */ if (mode & STARPU_R) { STARPU_ASSERT(src_replicate->refcnt > 0); src_replicate->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; } _starpu_data_request_unlink(r); unsigned destroyed = _starpu_data_check_not_busy(handle); r->refcnt--; /* if nobody is waiting on that request, we can get rid of it */ if (r->refcnt == 0) do_delete = 1; r->retval = 0; /* In case there are one or multiple callbacks, we execute them now. */ struct _starpu_callback_list *callbacks = r->callbacks; _starpu_spin_unlock(&r->lock); if (do_delete) _starpu_data_request_destroy(r); if (!destroyed) _starpu_spin_unlock(&handle->header_lock); /* We do the callback once the lock is released so that they can do * blocking operations with the handle (eg. release it) */ while (callbacks) { callbacks->callback_func(callbacks->callback_arg); struct _starpu_callback_list *next = callbacks->next; free(callbacks); callbacks = next; } } /* TODO : accounting to see how much time was spent working for other people ... */ static int starpu_handle_data_request(struct _starpu_data_request *r, unsigned may_alloc, int prefetch STARPU_ATTRIBUTE_UNUSED) { starpu_data_handle_t handle = r->handle; if (_starpu_spin_trylock(&handle->header_lock)) return -EBUSY; if (_starpu_spin_trylock(&r->lock)) { _starpu_spin_unlock(&handle->header_lock); return -EBUSY; } 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 */ r->retval = _starpu_driver_copy_data_1_to_1(handle, src_replicate, dst_replicate, !(r_mode & STARPU_R), r, may_alloc); if (r->retval == -ENOMEM) { /* If there was not enough memory, we will try to redo the * request later. */ _starpu_spin_unlock(&handle->header_lock); return -ENOMEM; } if (r->retval == -EAGAIN) { /* The request was successful, but could not be terminated * immediately. We will handle the completion of the request * asynchronously. The request is put in the list of "pending" * requests in the meantime. */ _starpu_spin_unlock(&handle->header_lock); STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[r->handling_node]); _starpu_data_request_list_push_back(&data_requests_pending[r->handling_node], r); data_requests_npending[r->handling_node]++; STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[r->handling_node]); return -EAGAIN; } /* the request has been handled */ _starpu_spin_lock(&r->lock); starpu_handle_data_request_completion(r); return 0; } int _starpu_handle_node_data_requests(unsigned src_node, unsigned may_alloc) { struct _starpu_data_request *r; struct _starpu_data_request_list new_data_requests; int ret = 0; #ifdef STARPU_NON_BLOCKING_DRIVERS /* This is racy, but not posing problems actually, since we know we * will come back here to probe again regularly anyway. * Thus, do not expose this optimization to helgrind */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_data_request_list_empty(&data_requests[src_node])) return 0; #endif /* TODO optimize */ #ifdef STARPU_NON_BLOCKING_DRIVERS /* take all the entries from the request list */ if (STARPU_PTHREAD_MUTEX_TRYLOCK(&data_requests_list_mutex[src_node])) /* List is busy, do not bother with it */ { return -EBUSY; } #else STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); #endif if (_starpu_data_request_list_empty(&data_requests[src_node])) { /* there is no request */ STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); return 0; } /* There is an entry: we create a new empty list to replace the list of * requests, and we handle the request(s) one by one in the former * list, without concurrency issues.*/ struct _starpu_data_request_list local_list = data_requests[src_node]; _starpu_data_request_list_init(&data_requests[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); _starpu_data_request_list_init(&new_data_requests); /* for all entries of the list */ while (!_starpu_data_request_list_empty(&local_list)) { int res; if (data_requests_npending[src_node] >= MAX_PENDING_REQUESTS_PER_NODE) { /* Too many requests at the same time, skip pushing * more for now */ ret = -EBUSY; break; } r = _starpu_data_request_list_pop_front(&local_list); res = starpu_handle_data_request(r, may_alloc, 0); if (res != 0 && res != -EAGAIN) { /* handle is busy, or not enough memory, postpone for now */ ret = res; _starpu_data_request_list_push_back(&new_data_requests, r); } } while (!_starpu_data_request_list_empty(&local_list)) { r = _starpu_data_request_list_pop_front(&local_list); _starpu_data_request_list_push_back(&new_data_requests, r); } if (!_starpu_data_request_list_empty(&new_data_requests)) { STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); _starpu_data_request_list_push_list_front(&new_data_requests, &data_requests[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(src_node); #endif } return ret; } void _starpu_handle_node_prefetch_requests(unsigned src_node, unsigned may_alloc) { struct _starpu_data_request *r; struct _starpu_data_request_list new_data_requests; struct _starpu_data_request_list new_prefetch_requests; #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 valgrind */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_data_request_list_empty(&prefetch_requests[src_node])) return; #endif #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; } #else STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); #endif if (_starpu_data_request_list_empty(&prefetch_requests[src_node])) { /* there is no request */ STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); return; } /* There is an entry: we create a new empty list to replace the list of * requests, and we handle the request(s) one by one in the former * list, without concurrency issues.*/ struct _starpu_data_request_list local_list = prefetch_requests[src_node]; _starpu_data_request_list_init(&prefetch_requests[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); _starpu_data_request_list_init(&new_data_requests); _starpu_data_request_list_init(&new_prefetch_requests); /* for all entries of the list */ while (!_starpu_data_request_list_empty(&local_list)) { int res; if (data_requests_npending[src_node] >= MAX_PENDING_PREFETCH_REQUESTS_PER_NODE) { /* Too many requests at the same time, skip pushing * more for now */ break; } r = _starpu_data_request_list_pop_front(&local_list); res = starpu_handle_data_request(r, may_alloc, 1); if (res != 0 && res != -EAGAIN) { if (r->prefetch) _starpu_data_request_list_push_back(&new_prefetch_requests, r); else { /* Prefetch request promoted while in tmp list*/ _starpu_data_request_list_push_back(&new_data_requests, r); } break; } } while(!_starpu_data_request_list_empty(&local_list)) { r = _starpu_data_request_list_pop_front(&local_list); if (r->prefetch) _starpu_data_request_list_push_back(&new_prefetch_requests, r); else /* Prefetch request promoted while in tmp list*/ _starpu_data_request_list_push_back(&new_data_requests, r); } if (!(_starpu_data_request_list_empty(&new_data_requests) && _starpu_data_request_list_empty(&new_prefetch_requests))) { STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[src_node]); if (!(_starpu_data_request_list_empty(&new_data_requests))) _starpu_data_request_list_push_list_front(&new_data_requests, &data_requests[src_node]); if (!(_starpu_data_request_list_empty(&new_prefetch_requests))) _starpu_data_request_list_push_list_front(&new_prefetch_requests, &prefetch_requests[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_list_mutex[src_node]); #ifndef STARPU_NON_BLOCKING_DRIVERS _starpu_wake_all_blocked_workers_on_node(src_node); #endif } } static void _handle_pending_node_data_requests(unsigned src_node, unsigned force) { // _STARPU_DEBUG("_starpu_handle_pending_node_data_requests ...\n"); // struct _starpu_data_request_list new_data_requests_pending; unsigned taken, kept; #ifdef STARPU_NON_BLOCKING_DRIVERS /* Here helgrind would should that this is an un protected access. * We however don't care about missing an entry, we will get called * again sooner or later. */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_data_request_list_empty(&data_requests_pending[src_node])) return; #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; } } else #endif STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]); if (_starpu_data_request_list_empty(&data_requests_pending[src_node])) { /* there is no request */ STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); return; } /* for all entries of the list */ struct _starpu_data_request_list local_list = data_requests_pending[src_node]; _starpu_data_request_list_init(&data_requests_pending[src_node]); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); _starpu_data_request_list_init(&new_data_requests_pending); taken = 0; kept = 0; while (!_starpu_data_request_list_empty(&local_list)) { struct _starpu_data_request *r; r = _starpu_data_request_list_pop_front(&local_list); taken++; starpu_data_handle_t handle = r->handle; #ifndef STARPU_SIMGRID if (force) /* Have to wait for the handle, whatever it takes */ #endif /* Or when running in simgrid, in which case we can not * afford going to sleep, since nobody would wake us * up. */ _starpu_spin_lock(&handle->header_lock); #ifndef STARPU_SIMGRID else if (_starpu_spin_trylock(&handle->header_lock)) { /* Handle is busy, retry this later */ _starpu_data_request_list_push_back(&new_data_requests_pending, r); kept++; continue; } #endif /* This shouldn't be too hard to acquire */ _starpu_spin_lock(&r->lock); /* wait until the transfer is terminated */ if (force) { _starpu_driver_wait_request_completion(&r->async_channel); starpu_handle_data_request_completion(r); } else { if (_starpu_driver_test_request_completion(&r->async_channel)) { /* The request was completed */ starpu_handle_data_request_completion(r); } else { /* The request was not completed, so we put it * back again on the list of pending requests * so that it can be handled later on. */ _starpu_spin_unlock(&r->lock); _starpu_spin_unlock(&handle->header_lock); _starpu_data_request_list_push_back(&new_data_requests_pending, r); kept++; } } } STARPU_PTHREAD_MUTEX_LOCK(&data_requests_pending_list_mutex[src_node]); data_requests_npending[src_node] -= taken - kept; if (kept) _starpu_data_request_list_push_list_back(&data_requests_pending[src_node], &new_data_requests_pending); STARPU_PTHREAD_MUTEX_UNLOCK(&data_requests_pending_list_mutex[src_node]); } void _starpu_handle_pending_node_data_requests(unsigned src_node) { _handle_pending_node_data_requests(src_node, 0); } void _starpu_handle_all_pending_node_data_requests(unsigned src_node) { _handle_pending_node_data_requests(src_node, 1); } int _starpu_check_that_no_data_request_exists(unsigned node) { /* XXX lock that !!! that's a quick'n'dirty test */ int no_request; int no_pending; STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[node]); no_request = _starpu_data_request_list_empty(&data_requests[node]) && _starpu_data_request_list_empty(&prefetch_requests[node]); STARPU_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); } void _starpu_update_prefetch_status(struct _starpu_data_request *r) { STARPU_ASSERT(r->prefetch > 0); r->prefetch=0; /* 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) _starpu_update_prefetch_status(next_req); } STARPU_PTHREAD_MUTEX_LOCK(&data_requests_list_mutex[r->handling_node]); /* The request can be in a different list (handling request or the temp list) * we have to check that it is really in the prefetch list. */ struct _starpu_data_request *r_iter; for (r_iter = _starpu_data_request_list_begin(&prefetch_requests[r->handling_node]); r_iter != _starpu_data_request_list_end(&prefetch_requests[r->handling_node]); r_iter = _starpu_data_request_list_next(r_iter)) { if (r==r_iter) { _starpu_data_request_list_erase(&prefetch_requests[r->handling_node],r); _starpu_data_request_list_push_front(&data_requests[r->handling_node],r); break; } } 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.1.5/src/datawizard/copy_driver.c0000644000373600000000000004634512571536575015414 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include "copy_driver.h" #include "memalloc.h" #include #include #include #ifdef STARPU_SIMGRID #include #endif void _starpu_wake_all_blocked_workers_on_node(unsigned nodeid) { /* wake up all workers on that memory node */ unsigned cond_id; struct _starpu_memory_node_descr * const descr = _starpu_memory_node_get_description(); STARPU_PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->condition_count[nodeid]; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _starpu_cond_and_mutex *condition; condition = &descr->conditions_attached_to_node[nodeid][cond_id]; /* wake anybody waiting on that condition */ STARPU_PTHREAD_MUTEX_LOCK(condition->mutex); STARPU_PTHREAD_COND_BROADCAST(condition->cond); STARPU_PTHREAD_MUTEX_UNLOCK(condition->mutex); } STARPU_PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); } void starpu_wake_all_blocked_workers(void) { /* workers may be blocked on the various queues' conditions */ unsigned cond_id; struct _starpu_memory_node_descr * const descr = _starpu_memory_node_get_description(); STARPU_PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->total_condition_count; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _starpu_cond_and_mutex *condition; condition = &descr->conditions_all[cond_id]; /* wake anybody waiting on that condition */ STARPU_PTHREAD_MUTEX_LOCK(condition->mutex); STARPU_PTHREAD_COND_BROADCAST(condition->cond); STARPU_PTHREAD_MUTEX_UNLOCK(condition->mutex); } STARPU_PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); } #ifdef STARPU_USE_FXT /* we need to identify each communication so that we can match the beginning * and the end of a communication in the trace, so we use a unique identifier * per communication */ static unsigned 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 STARPU_ATTRIBUTE_UNUSED) { unsigned src_node = src_replicate->memory_node; unsigned dst_node = dst_replicate->memory_node; STARPU_ASSERT(src_replicate->refcnt); STARPU_ASSERT(dst_replicate->refcnt); STARPU_ASSERT(src_replicate->allocated); STARPU_ASSERT(dst_replicate->allocated); _starpu_comm_amounts_inc(src_node, dst_node, handle->ops->get_size(handle)); #ifdef STARPU_SIMGRID return _starpu_simgrid_transfer(handle->ops->get_size(handle), src_node, dst_node, req); #else /* !SIMGRID */ int ret = 0; const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); #ifdef STARPU_USE_CUDA cudaError_t cures; cudaStream_t stream; #endif void *src_interface = src_replicate->data_interface; void *dst_interface = dst_replicate->data_interface; #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) if ((src_kind == STARPU_CUDA_RAM) || (dst_kind == STARPU_CUDA_RAM)) { unsigned devid; if ((src_kind == STARPU_CUDA_RAM) && (dst_kind == STARPU_CUDA_RAM)) { /* GPU-GPU transfer, issue it from the device we are supposed to drive */ int worker = starpu_worker_get_id(); devid = starpu_worker_get_devid(worker); } else { unsigned node = (dst_kind == STARPU_CUDA_RAM)?dst_node:src_node; devid = _starpu_memory_node_get_devid(node); } starpu_cuda_set_device(devid); } #endif switch (_STARPU_MEMORY_NODE_TUPLE(src_kind,dst_kind)) { case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CPU_RAM): /* STARPU_CPU_RAM -> STARPU_CPU_RAM */ if (copy_methods->ram_to_ram) copy_methods->ram_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, req ? &req->async_channel : NULL); break; #ifdef STARPU_USE_CUDA case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CPU_RAM): /* only the proper CUBLAS thread can initiate this directly ! */ #if !defined(HAVE_CUDA_MEMCPY_PEER) STARPU_ASSERT(_starpu_memory_node_get_local_key() == src_node); #endif if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_cuda_copy_disabled() || !(copy_methods->cuda_to_ram_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->cuda_to_ram || copy_methods->any_to_any); if (copy_methods->cuda_to_ram) copy_methods->cuda_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_CUDA_RAM; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_local_out_transfer_stream(); if (copy_methods->cuda_to_ram_async) ret = copy_methods->cuda_to_ram_async(src_interface, src_node, dst_interface, dst_node, stream); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } cures = cudaEventRecord(req->async_channel.event.cuda_event, stream); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CUDA_RAM): /* STARPU_CPU_RAM -> CUBLAS_RAM */ /* only the proper CUBLAS thread can initiate this ! */ #if !defined(HAVE_CUDA_MEMCPY_PEER) STARPU_ASSERT(_starpu_memory_node_get_local_key() == dst_node); #endif if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_cuda_copy_disabled() || !(copy_methods->ram_to_cuda_async || copy_methods->any_to_any)) { /* this is not associated to a request so it's synchronous */ STARPU_ASSERT(copy_methods->ram_to_cuda || copy_methods->any_to_any); if (copy_methods->ram_to_cuda) copy_methods->ram_to_cuda(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_CUDA_RAM; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_local_in_transfer_stream(); if (copy_methods->ram_to_cuda_async) ret = copy_methods->ram_to_cuda_async(src_interface, src_node, dst_interface, dst_node, stream); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } cures = cudaEventRecord(req->async_channel.event.cuda_event, stream); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CUDA_RAM): /* CUDA - CUDA transfer */ if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_cuda_copy_disabled() || !(copy_methods->cuda_to_cuda_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->cuda_to_cuda || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->cuda_to_cuda) copy_methods->cuda_to_cuda(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_CUDA_RAM; cures = cudaEventCreateWithFlags(&req->async_channel.event.cuda_event, cudaEventDisableTiming); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); stream = starpu_cuda_get_peer_transfer_stream(src_node, dst_node); if (copy_methods->cuda_to_cuda_async) ret = copy_methods->cuda_to_cuda_async(src_interface, src_node, dst_interface, dst_node, stream); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } cures = cudaEventRecord(req->async_channel.event.cuda_event, stream); if (STARPU_UNLIKELY(cures != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(cures); } break; #endif #ifdef STARPU_USE_OPENCL case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_CPU_RAM): /* OpenCL -> RAM */ STARPU_ASSERT(_starpu_memory_node_get_local_key() == src_node); if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_opencl_copy_disabled() || !(copy_methods->opencl_to_ram_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->opencl_to_ram || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->opencl_to_ram) copy_methods->opencl_to_ram(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_OPENCL_RAM; if (copy_methods->opencl_to_ram_async) ret = copy_methods->opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, &(req->async_channel.event.opencl_event)); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_OPENCL_RAM): /* STARPU_CPU_RAM -> STARPU_OPENCL_RAM */ STARPU_ASSERT(_starpu_memory_node_get_local_key() == dst_node); if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_opencl_copy_disabled() || !(copy_methods->ram_to_opencl_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->ram_to_opencl || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->ram_to_opencl) copy_methods->ram_to_opencl(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_OPENCL_RAM; if (copy_methods->ram_to_opencl_async) ret = copy_methods->ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, &(req->async_channel.event.opencl_event)); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } } break; case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_OPENCL_RAM): /* STARPU_OPENCL_RAM -> STARPU_OPENCL_RAM */ STARPU_ASSERT(_starpu_memory_node_get_local_key() == dst_node || _starpu_memory_node_get_local_key() == src_node); if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_opencl_copy_disabled() || !(copy_methods->opencl_to_opencl_async || copy_methods->any_to_any)) { STARPU_ASSERT(copy_methods->opencl_to_opencl || copy_methods->any_to_any); /* this is not associated to a request so it's synchronous */ if (copy_methods->opencl_to_opencl) copy_methods->opencl_to_opencl(src_interface, src_node, dst_interface, dst_node); else copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL); } else { req->async_channel.type = STARPU_OPENCL_RAM; if (copy_methods->opencl_to_opencl_async) ret = copy_methods->opencl_to_opencl_async(src_interface, src_node, dst_interface, dst_node, &(req->async_channel.event.opencl_event)); else { STARPU_ASSERT(copy_methods->any_to_any); ret = copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel); } } break; #endif default: STARPU_ABORT(); break; } return ret; #endif /* !SIMGRID */ } int STARPU_ATTRIBUTE_WARN_UNUSED_RESULT _starpu_driver_copy_data_1_to_1(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, unsigned donotread, struct _starpu_data_request *req, unsigned may_alloc) { if (!donotread) { STARPU_ASSERT(src_replicate->allocated); STARPU_ASSERT(src_replicate->refcnt); } int ret_alloc, ret_copy; unsigned STARPU_ATTRIBUTE_UNUSED com_id = 0; 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; ret_alloc = _starpu_allocate_memory_on_node(handle, dst_replicate, req ? req->prefetch : 0); if (ret_alloc) return -ENOMEM; } STARPU_ASSERT(dst_replicate->allocated); STARPU_ASSERT(dst_replicate->refcnt); /* if there is no need to actually read the data, * we do not perform any transfer */ if (!donotread) { 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_ADD(&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); 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); return ret_copy; } return 0; } /* This can be used by interfaces to easily transfer a piece of data without * caring about the particular CUDA/OpenCL methods. */ 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) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) struct _starpu_async_channel *async_channel = async_data; #endif enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); switch (_STARPU_MEMORY_NODE_TUPLE(src_kind,dst_kind)) { case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CPU_RAM): memcpy((void *) (dst + dst_offset), (void *) (src + src_offset), size); return 0; #ifdef STARPU_USE_CUDA case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CPU_RAM): return starpu_cuda_copy_async_sync( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel?starpu_cuda_get_local_out_transfer_stream():NULL, cudaMemcpyDeviceToHost); case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_CUDA_RAM): return starpu_cuda_copy_async_sync( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel?starpu_cuda_get_local_in_transfer_stream():NULL, cudaMemcpyHostToDevice); case _STARPU_MEMORY_NODE_TUPLE(STARPU_CUDA_RAM,STARPU_CUDA_RAM): return starpu_cuda_copy_async_sync( (void*) (src + src_offset), src_node, (void*) (dst + dst_offset), dst_node, size, async_channel?starpu_cuda_get_peer_transfer_stream(src_node, dst_node):NULL, cudaMemcpyDeviceToDevice); #endif #ifdef STARPU_USE_OPENCL case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_CPU_RAM): case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_OPENCL_RAM): case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_OPENCL_RAM): return starpu_opencl_copy_async_sync( src, src_offset, src_node, dst, dst_offset, dst_node, size, &async_channel->event.opencl_event); #endif default: STARPU_ABORT(); return -1; } return 0; } void _starpu_driver_wait_request_completion(struct _starpu_async_channel *async_channel) { #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&async_channel->event.mutex); while (!async_channel->event.finished) STARPU_PTHREAD_COND_WAIT(&async_channel->event.cond, &async_channel->event.mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&async_channel->event.mutex); #else /* !SIMGRID */ enum starpu_node_kind kind = async_channel->type; #ifdef STARPU_USE_CUDA cudaEvent_t event; cudaError_t cures; #endif switch (kind) { #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: event = (*async_channel).event.cuda_event; cures = cudaEventSynchronize(event); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cures = cudaEventDestroy(event); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: { cl_int err; if ((*async_channel).event.opencl_event == NULL) STARPU_ABORT(); err = clWaitForEvents(1, &((*async_channel).event.opencl_event)); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseEvent((*async_channel).event.opencl_event); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); break; } #endif case STARPU_CPU_RAM: default: STARPU_ABORT(); } #endif /* !SIMGRID */ } unsigned _starpu_driver_test_request_completion(struct _starpu_async_channel *async_channel) { #ifdef STARPU_SIMGRID unsigned ret; STARPU_PTHREAD_MUTEX_LOCK(&async_channel->event.mutex); ret = async_channel->event.finished; STARPU_PTHREAD_MUTEX_UNLOCK(&async_channel->event.mutex); return ret; #else /* !SIMGRID */ enum starpu_node_kind kind = async_channel->type; unsigned success = 0; #ifdef STARPU_USE_CUDA cudaEvent_t event; #endif switch (kind) { #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: event = (*async_channel).event.cuda_event; cudaError_t cures = cudaEventQuery(event); success = (cures == cudaSuccess); if (success) cudaEventDestroy(event); else if (cures != cudaErrorNotReady) STARPU_CUDA_REPORT_ERROR(cures); break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: { cl_int event_status; cl_event opencl_event = (*async_channel).event.opencl_event; if (opencl_event == NULL) STARPU_ABORT(); cl_int err = clGetEventInfo(opencl_event, CL_EVENT_COMMAND_EXECUTION_STATUS, sizeof(event_status), &event_status, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); if (event_status < 0) STARPU_OPENCL_REPORT_ERROR(event_status); success = (event_status == CL_COMPLETE); break; } #endif case STARPU_CPU_RAM: default: STARPU_ABORT(); } return success; #endif /* !SIMGRID */ } starpu-1.1.5/src/datawizard/datastats.c0000644000373600000000000001205312571536575015044 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #ifdef STARPU_ENABLE_STATS /* measure the cache hit ratio for each node */ static unsigned hit_cnt[STARPU_MAXNODES]; static unsigned miss_cnt[STARPU_MAXNODES]; #endif void _starpu_msi_cache_hit(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(hit_cnt[node]); hit_cnt[node]++; #endif } void _starpu_msi_cache_miss(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(miss_cnt[node]); miss_cnt[node]++; #endif } void _starpu_display_msi_stats(void) { #ifdef STARPU_ENABLE_STATS unsigned node; unsigned total_hit_cnt = 0; unsigned total_miss_cnt = 0; fprintf(stderr, "\n#---------------------\n"); fprintf(stderr, "MSI cache stats :\n"); for (node = 0; node < STARPU_MAXNODES; node++) { total_hit_cnt += hit_cnt[node]; total_miss_cnt += miss_cnt[node]; } fprintf(stderr, "TOTAL MSI stats\thit %u (%2.2f \%%)\tmiss %u (%2.2f \%%)\n", total_hit_cnt, (100.0f*total_hit_cnt)/(total_hit_cnt+total_miss_cnt), total_miss_cnt, (100.0f*total_miss_cnt)/(total_hit_cnt+total_miss_cnt)); for (node = 0; node < STARPU_MAXNODES; node++) { if (hit_cnt[node]+miss_cnt[node]) { fprintf(stderr, "memory node %d\n", node); fprintf(stderr, "\thit : %u (%2.2f \%%)\n", hit_cnt[node], (100.0f*hit_cnt[node])/(hit_cnt[node]+miss_cnt[node])); fprintf(stderr, "\tmiss : %u (%2.2f \%%)\n", miss_cnt[node], (100.0f*miss_cnt[node])/(hit_cnt[node]+miss_cnt[node])); } } fprintf(stderr, "#---------------------\n"); #endif } /* measure the efficiency of our allocation cache */ #ifdef STARPU_ENABLE_STATS static unsigned alloc_cnt[STARPU_MAXNODES]; static unsigned alloc_cache_hit_cnt[STARPU_MAXNODES]; #endif void _starpu_allocation_cache_hit(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(alloc_cache_hit_cnt[node]); alloc_cache_hit_cnt[node]++; #endif } void _starpu_data_allocation_inc_stats(unsigned node STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(alloc_cnt[node]); alloc_cnt[node]++; #endif } void _starpu_display_alloc_cache_stats(void) { #ifdef STARPU_ENABLE_STATS fprintf(stderr, "\n#---------------------\n"); fprintf(stderr, "Allocation cache stats:\n"); unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { if (alloc_cnt[node]) { fprintf(stderr, "memory node %d\n", node); fprintf(stderr, "\ttotal alloc : %u\n", alloc_cnt[node]); fprintf(stderr, "\tcached alloc: %u (%2.2f \%%)\n", alloc_cache_hit_cnt[node], (100.0f*alloc_cache_hit_cnt[node])/(alloc_cnt[node])); } else fprintf(stderr, "No allocation on node %d\n", node); } fprintf(stderr, "#---------------------\n"); #endif } /* measure the amount of data transfers between each pair of nodes */ #ifdef STARPU_ENABLE_STATS static size_t comm_amount[STARPU_MAXNODES][STARPU_MAXNODES]; #endif /* STARPU_ENABLE_STATS */ void _starpu_comm_amounts_inc(unsigned src STARPU_ATTRIBUTE_UNUSED, unsigned dst STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_ENABLE_STATS STARPU_HG_DISABLE_CHECKING(comm_amount[src][dst]); comm_amount[src][dst] += size; #endif /* STARPU_ENABLE_STATS */ } void _starpu_display_comm_amounts(void) { #ifdef STARPU_DEVEL # warning TODO. The information displayed here seems to be similar to the one displayed by starpu_profiling_bus_helper_display_summary() #endif #ifdef STARPU_ENABLE_STATS unsigned src, dst; size_t sum = 0; fprintf(stderr, "\n#---------------------\n"); fprintf(stderr, "Data transfer stats:\n"); for (dst = 0; dst < STARPU_MAXNODES; dst++) for (src = 0; src < STARPU_MAXNODES; src++) { sum += comm_amount[src][dst]; sum += comm_amount[dst][src]; } fprintf(stderr, "TOTAL transfers %f MB\n", (float)sum/1024/1024); for (dst = 0; dst < STARPU_MAXNODES; dst++) for (src = dst + 1; src < STARPU_MAXNODES; src++) { if (comm_amount[src][dst]) fprintf(stderr, "\t%d <-> %d\t%f MB\n\t\t%d -> %d\t%f MB\n\t\t%d -> %d\t%f MB\n", src, dst, ((float)comm_amount[src][dst] + (float)comm_amount[dst][src])/(1024*1024), src, dst, ((float)comm_amount[src][dst])/(1024*1024), dst, src, ((float)comm_amount[dst][src])/(1024*1024)); } fprintf(stderr, "#---------------------\n"); #endif } starpu-1.1.5/src/datawizard/coherency.c0000644000373600000000000007226012571536575015041 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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_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; unsigned src_node_mask = 0; size_t size = _starpu_data_get_size(handle); double cost = INFINITY; 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<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[0].data_interface; if ((!can_copy(src_interface, i, ram_interface, 0, i) && !can_copy(src_interface, i, ram_interface, 0, 0)) || (!can_copy(ram_interface, 0, dst_interface, destination, 0) && !can_copy(ram_interface, 0, dst_interface, destination, destination))) continue; } } /* this is a potential candidate */ src_node = i; /* however GPU are expensive sources, really ! * Unless peer transfer is supported (and it would then have been selected above). * Other should be ok */ if ( #ifndef HAVE_CUDA_MEMCPY_PEER starpu_node_get_kind(i) != STARPU_CUDA_RAM && #endif starpu_node_get_kind(i) != STARPU_OPENCL_RAM) break ; } } STARPU_ASSERT(src_node != -1); return src_node; } /* this may be called once the data is fetched with header and STARPU_RW-lock hold */ void _starpu_update_data_state(starpu_data_handle_t handle, struct _starpu_data_replicate *requesting_replicate, enum starpu_data_access_mode mode) { /* There is nothing to do for relaxed coherency modes (scratch or * reductions) */ if (!(mode & STARPU_RW)) return; unsigned nnodes = starpu_memory_nodes_get_count(); /* the data is present now */ unsigned requesting_node = requesting_replicate->memory_node; requesting_replicate->requested &= ~(1UL << requesting_node); if (mode & STARPU_W) { /* the requesting node now has the only valid copy */ unsigned node; for (node = 0; node < nnodes; node++) handle->per_node[node].state = STARPU_INVALID; requesting_replicate->state = STARPU_OWNER; } else { /* read only */ if (requesting_replicate->state != STARPU_OWNER) { /* there was at least another copy of the data */ unsigned node; for (node = 0; node < nnodes; node++) { struct _starpu_data_replicate *replicate = &handle->per_node[node]; if (replicate->state != STARPU_INVALID) replicate->state = STARPU_SHARED; } requesting_replicate->state = STARPU_SHARED; } } } static int worker_supports_direct_access(unsigned node, unsigned handling_node) { if (node == handling_node) return 1; if (!_starpu_memory_node_get_nworkers(handling_node)) /* No worker to process the request from that node */ return 0; int type = starpu_node_get_kind(node); switch (type) { case STARPU_CUDA_RAM: { /* GPUs not always allow direct remote access: if CUDA4 * is enabled, we allow two CUDA devices to communicate. */ #ifdef STARPU_SIMGRID if (starpu_node_get_kind(handling_node) == STARPU_CUDA_RAM) { char name[16]; msg_host_t host; const char* cuda_memcpy_peer; snprintf(name, sizeof(name), "CUDA%d", _starpu_memory_node_get_devid(handling_node)); host = MSG_get_host_by_name(name); cuda_memcpy_peer = MSG_host_get_property_value(host, "memcpy_peer"); return cuda_memcpy_peer && atoll(cuda_memcpy_peer); } else return 0; #elif defined(HAVE_CUDA_MEMCPY_PEER) /* simgrid */ enum starpu_node_kind kind = starpu_node_get_kind(handling_node); return kind == STARPU_CUDA_RAM; #else /* HAVE_CUDA_MEMCPY_PEER */ /* Direct GPU-GPU transfers are not allowed in general */ return 0; #endif /* HAVE_CUDA_MEMCPY_PEER */ } case STARPU_OPENCL_RAM: return 0; default: return 1; } } static int link_supports_direct_transfers(starpu_data_handle_t handle, unsigned src_node, unsigned dst_node, unsigned *handling_node) { int (*can_copy)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_node) = handle->ops->copy_methods->can_copy; void *src_interface = handle->per_node[src_node].data_interface; void *dst_interface = handle->per_node[dst_node].data_interface; /* XXX That's a hack until we fix cudaMemcpy3DPeerAsync in the block interface * Perhaps not all data interface provide a direct GPU-GPU transfer * method ! */ #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (src_node != dst_node && starpu_node_get_kind(src_node) == STARPU_CUDA_RAM && starpu_node_get_kind(dst_node) == STARPU_CUDA_RAM) { const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods; if (!copy_methods->cuda_to_cuda_async && !copy_methods->any_to_any) return 0; } #endif /* Note: with CUDA, performance seems a bit better when issuing the transfer from the destination (tested without GPUDirect, but GPUDirect probably behave the same) */ if (worker_supports_direct_access(src_node, dst_node) && (!can_copy || can_copy(src_interface, src_node, dst_interface, dst_node, dst_node))) { *handling_node = dst_node; return 1; } if (worker_supports_direct_access(dst_node, src_node) && (!can_copy || can_copy(src_interface, src_node, dst_interface, dst_node, src_node))) { *handling_node = src_node; return 1; } return 0; } /* Determines the path of a request : each hop is defined by (src,dst) and the * node that handles the hop. The returned value indicates the number of hops, * and the max_len is the maximum number of hops (ie. the size of the * src_nodes, dst_nodes and handling_nodes arrays. */ static int determine_request_path(starpu_data_handle_t handle, unsigned src_node, unsigned dst_node, enum starpu_data_access_mode mode, int max_len, unsigned *src_nodes, unsigned *dst_nodes, unsigned *handling_nodes) { if (!(mode & STARPU_R)) { /* The destination node should only allocate the data, no transfer is required */ STARPU_ASSERT(max_len >= 1); src_nodes[0] = 0; // ignored dst_nodes[0] = dst_node; handling_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 *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; /* We need an intermediate hop to implement data staging * through main memory. */ STARPU_ASSERT(max_len >= 2); /* XXX we hardcode 0 as the RAM node ... */ /* GPU -> RAM */ src_nodes[0] = src_node; dst_nodes[0] = 0; 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 %u to node %u\n", handle->ops->interfaceid, src_node, dst_node); handling_nodes[0] = dst_node; } /* RAM -> GPU */ src_nodes[1] = 0; dst_nodes[1] = dst_node; 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 %u to node %u\n", handle->ops->interfaceid, src_node, dst_node); handling_nodes[1] = src_node; } return 2; } else { STARPU_ASSERT(max_len >= 1); src_nodes[0] = src_node; dst_nodes[0] = dst_node; handling_nodes[0] = handling_node; #if !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) STARPU_ASSERT(!(mode & STARPU_R) || starpu_node_get_kind(src_node) != STARPU_CUDA_RAM || starpu_node_get_kind(dst_node) != STARPU_CUDA_RAM); #endif return 1; } } /* handle->lock should be taken. r is returned locked. The node parameter * indicate either the source of the request, or the destination for a * write-only request. */ static struct _starpu_data_request *_starpu_search_existing_data_request(struct _starpu_data_replicate *replicate, unsigned node, enum starpu_data_access_mode mode, unsigned is_prefetch) { struct _starpu_data_request *r; r = replicate->request[node]; if (r) { _starpu_spin_checklocked(&r->handle->header_lock); _starpu_spin_lock(&r->lock); /* perhaps we need to "upgrade" the request */ if (is_prefetch < r->prefetch) _starpu_update_prefetch_status(r); if (mode & STARPU_R) { /* in case the exisiting request did not imply a memory * transfer yet, we have to take a second refcnt now * for the source, in addition to the refcnt for the * destination * (so that the source remains valid) */ if (!(r->mode & STARPU_R)) { replicate->refcnt++; replicate->handle->busy_count++; } r->mode = (enum starpu_data_access_mode) ((int) r->mode | (int) STARPU_R); } if (mode & STARPU_W) r->mode = (enum starpu_data_access_mode) ((int) r->mode | (int) STARPU_W); } return r; } /* * This function is called when the data is needed on the local node, this * returns a pointer to the local copy * * R STARPU_W STARPU_RW * Owner OK OK OK * Shared OK 1 1 * Invalid 2 3 4 * * case 1 : shared + (read)write : * no data copy but shared->Invalid/Owner * case 2 : invalid + read : * data copy + invalid->shared + owner->shared (STARPU_ASSERT(there is a valid)) * case 3 : invalid + write : * no data copy + invalid->owner + (owner,shared)->invalid * case 4 : invalid + R/STARPU_W : * data copy + if (STARPU_W) (invalid->owner + owner->invalid) * else (invalid,owner->shared) */ struct _starpu_data_request *_starpu_create_request_to_fetch_data(starpu_data_handle_t handle, struct _starpu_data_replicate *dst_replicate, enum starpu_data_access_mode mode, unsigned is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg) { /* This function is called with handle's header lock taken */ _starpu_spin_checklocked(&handle->header_lock); unsigned requesting_node = dst_replicate->memory_node; if (dst_replicate->state != STARPU_INVALID) { #ifdef STARPU_MEMORY_STATS enum _starpu_cache_state old_state = dst_replicate->state; #endif /* the data is already available 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 _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; } _starpu_msi_cache_miss(requesting_node); /* the only remaining situation is that the local copy was invalid */ STARPU_ASSERT(dst_replicate->state == STARPU_INVALID); /* find someone who already has the data */ int src_node = 0; if (mode & STARPU_R) { src_node = _starpu_select_src_node(handle, requesting_node); STARPU_ASSERT(src_node != (int) requesting_node); if (src_node < 0) { /* We will create it, no need to read an existing value */ mode &= ~STARPU_R; } } else { /* if the data is in write only mode (and not SCRATCH or REDUX), there is no need for a source, data will be initialized by the task itself */ if (mode & STARPU_W) dst_replicate->initialized = 1; if (requesting_node == 0) { /* And this is the main RAM, really no need for a * request, just allocate */ if (_starpu_allocate_memory_on_node(handle, dst_replicate, is_prefetch) == 0) { _starpu_update_data_state(handle, dst_replicate, mode); _starpu_spin_unlock(&handle->header_lock); if (callback_func) callback_func(callback_arg); _STARPU_LOG_OUT_TAG("data immediately allocated"); return NULL; } } } /* We can safely assume that there won't be more than 2 hops in the * current implementation */ unsigned src_nodes[4], dst_nodes[4], handling_nodes[4]; int nhops = determine_request_path(handle, src_node, requesting_node, mode, 4, src_nodes, dst_nodes, handling_nodes); STARPU_ASSERT(nhops >= 1 && nhops <= 4); struct _starpu_data_request *requests[nhops]; /* Did we reuse a request for that hop ? */ int reused_requests[nhops]; /* 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); } 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 /* 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 (!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], handling_nodes[0]); return requests[nhops - 1]; } int _starpu_fetch_data_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *dst_replicate, enum starpu_data_access_mode mode, unsigned detached, unsigned async, void (*callback_func)(void *), void *callback_arg) { unsigned local_node = _starpu_memory_node_get_local_key(); _STARPU_LOG_IN(); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(local_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); if (!detached) { /* Take a reference which will be released by _starpu_release_data_on_node */ dst_replicate->refcnt++; dst_replicate->handle->busy_count++; } struct _starpu_data_request *r; r = _starpu_create_request_to_fetch_data(handle, dst_replicate, mode, detached, async, callback_func, callback_arg); /* If no request was created, the handle was already up-to-date on the * node. In this case, _starpu_create_request_to_fetch_data has already * unlocked the header. */ if (!r) return 0; _starpu_spin_unlock(&handle->header_lock); int ret = async?0:_starpu_wait_data_request_completion(r, 1); _STARPU_LOG_OUT(); return ret; } static int prefetch_data_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode) { return _starpu_fetch_data_on_node(handle, replicate, mode, 1, 1, NULL, NULL); } static int fetch_data(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode) { return _starpu_fetch_data_on_node(handle, replicate, mode, 0, 0, NULL, NULL); } uint32_t _starpu_get_data_refcnt(starpu_data_handle_t handle, unsigned node) { return handle->per_node[node].refcnt; } size_t _starpu_data_get_size(starpu_data_handle_t handle) { return handle->ops->get_size(handle); } uint32_t _starpu_data_get_footprint(starpu_data_handle_t handle) { return handle->footprint; } /* in case the data was accessed on a write mode, do not forget to * make it accessible again once it is possible ! */ void _starpu_release_data_on_node(starpu_data_handle_t handle, uint32_t default_wt_mask, struct _starpu_data_replicate *replicate) { uint32_t wt_mask; wt_mask = default_wt_mask | handle->wt_mask; wt_mask &= (1<memory_node; if (replicate->state != STARPU_INVALID && handle->current_mode & STARPU_W) if ((wt_mask & ~(1<header_lock)) { cpt++; _starpu_datawizard_progress(local_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); /* Release refcnt taken by fetch_data_on_node */ replicate->refcnt--; STARPU_ASSERT_MSG(replicate->refcnt >= 0, "handle %p released too many times", handle); STARPU_ASSERT_MSG(handle->busy_count > 0, "handle %p released too many times", handle); handle->busy_count--; if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } static void _starpu_set_data_requested_flag_if_needed(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate) { unsigned local_node = _starpu_memory_node_get_local_key(); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(local_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); if (replicate->state == STARPU_INVALID) { unsigned dst_node = replicate->memory_node; replicate->requested |= 1UL << dst_node; } _starpu_spin_unlock(&handle->header_lock); } int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node) { unsigned nbuffers = task->cl->nbuffers; 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_CODELET_GET_MODE(task->cl, index); if (mode & (STARPU_SCRATCH|STARPU_REDUX)) continue; struct _starpu_data_replicate *replicate = &handle->per_node[node]; prefetch_data_on_node(handle, replicate, mode); _starpu_set_data_requested_flag_if_needed(handle, replicate); } return 0; } static struct _starpu_data_replicate *get_replicate(starpu_data_handle_t handle, enum starpu_data_access_mode mode, int workerid, unsigned node) { if (mode & (STARPU_SCRATCH|STARPU_REDUX)) return &handle->per_worker[workerid]; else /* That's a "normal" buffer (R/W) */ return &handle->per_node[node]; } int _starpu_fetch_task_input(struct _starpu_job *j, uint32_t mask) { _STARPU_TRACE_START_FETCH_INPUT(NULL); int profiling = starpu_profiling_status_get(); struct starpu_task *task = j->task; if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_start_time); struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); unsigned nbuffers = task->cl->nbuffers; unsigned local_memory_node = _starpu_memory_node_get_local_key(); int workerid = starpu_worker_get_id(); unsigned index; for (index = 0; index < nbuffers; index++) { int ret; starpu_data_handle_t handle = descrs[index].handle; enum starpu_data_access_mode mode = descrs[index].mode; int node = descrs[index].node; if (node == -1) node = local_memory_node; if (mode == STARPU_NONE || (mode & ((1<= STARPU_ACCESS_MODE_MAX || (mode >> STARPU_MODE_SHIFT) >= STARPU_SHIFTED_MODE_MAX) STARPU_ASSERT_MSG(0, "mode %d (0x%x) is bogus\n", mode, mode); struct _starpu_data_replicate *local_replicate; if (index && descrs[index-1].handle == descrs[index].handle) /* We have already took this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; local_replicate = get_replicate(handle, mode, workerid, node); ret = fetch_data(handle, local_replicate, mode); if (STARPU_UNLIKELY(ret)) goto enomem; } /* Now that we have taken the data locks in locking order, fill the codelet interfaces in function order. */ for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, index); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(task->cl, index); int node = descrs[index].node; if (node == -1) node = local_memory_node; struct _starpu_data_replicate *local_replicate; local_replicate = get_replicate(handle, mode, workerid, node); _STARPU_TASK_SET_INTERFACE(task , local_replicate->data_interface, index); /* If the replicate was not initialized yet, we have to do it now */ if (!(mode & STARPU_SCRATCH) && !local_replicate->initialized) _starpu_redux_init_data_replicate(handle, local_replicate, workerid); } if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->acquire_data_end_time); _STARPU_TRACE_END_FETCH_INPUT(NULL); return 0; enomem: _STARPU_TRACE_END_FETCH_INPUT(NULL); _STARPU_DISP("something went wrong with buffer %u\n", index); /* try to unreference all the input that were successfully taken */ unsigned index2; for (index2 = 0; index2 < index; index2++) { starpu_data_handle_t handle = descrs[index2].handle; enum starpu_data_access_mode mode = descrs[index2].mode; int node = descrs[index].node; if (node == -1) node = local_memory_node; struct _starpu_data_replicate *local_replicate; if (index2 && descrs[index2-1].handle == descrs[index2].handle) /* We have already released this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; local_replicate = get_replicate(handle, mode, workerid, node); _starpu_release_data_on_node(handle, mask, local_replicate); } return -1; } void _starpu_push_task_output(struct _starpu_job *j, uint32_t mask) { _STARPU_TRACE_START_PUSH_OUTPUT(NULL); 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 = task->cl->nbuffers; int workerid = starpu_worker_get_id(); unsigned local_memory_node = _starpu_memory_node_get_local_key(); unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = descrs[index].handle; enum starpu_data_access_mode mode = descrs[index].mode; int node = descrs[index].node; if (node == -1) node = local_memory_node; struct _starpu_data_replicate *local_replicate; 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; 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++; _starpu_spin_unlock(&handle->header_lock); _starpu_release_data_on_node(handle, mask, local_replicate); } if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->release_data_end_time); _STARPU_TRACE_END_PUSH_OUTPUT(NULL); } /* Version of _starpu_push_task_output used by NOWHERE tasks, for which * _starpu_fetch_task_input was not called. We just release the handle */ void _starpu_release_nowhere_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 = task->cl->nbuffers; unsigned index; 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; /* Keep a reference for future * _starpu_release_task_enforce_sequential_consistency call */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_spin_lock(&handle->header_lock); if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->release_data_end_time); } /* NB : this value can only be an indication of the status of a data at some point, but there is no strong garantee ! */ unsigned _starpu_is_data_present_or_requested(starpu_data_handle_t handle, unsigned node) { unsigned ret = 0; // XXX : this is just a hint, so we don't take the lock ... // STARPU_PTHREAD_SPIN_LOCK(&handle->header_lock); if (handle->per_node[node].state != STARPU_INVALID) { ret = 1; } else { unsigned i; unsigned nnodes = starpu_memory_nodes_get_count(); for (i = 0; i < nnodes; i++) { if ((handle->per_node[node].requested & (1UL << i)) || handle->per_node[node].request[i]) ret = 1; } } // STARPU_PTHREAD_SPIN_UNLOCK(&handle->header_lock); return ret; } void _starpu_data_set_unregister_hook(starpu_data_handle_t handle, _starpu_data_handle_unregister_hook func) { handle->unregister_hook = func; } starpu-1.1.5/src/datawizard/filters.h0000644000373600000000000000212312571536575014526 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __FILTERS_H__ #define __FILTERS_H__ #include #include #include #include #include void _starpu_filter_nparts_compute_chunk_size_and_offset(unsigned n, unsigned nparts, size_t elemsize, unsigned id, unsigned ld, unsigned *chunk_size, size_t *offset); #endif starpu-1.1.5/src/datawizard/memory_manager.c0000644000373600000000000000737712571536575016073 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include static size_t global_size[STARPU_MAXNODES]; static size_t used_size[STARPU_MAXNODES]; /* This is used as an optimization to avoid to wake up allocating threads for * each and every deallocation, only to find that there is still not enough * room. */ /* Minimum amount being waited for */ static size_t min_waiting_size[STARPU_MAXNODES]; /* Number of waiters */ static int waiters[STARPU_MAXNODES]; static starpu_pthread_mutex_t lock_nodes[STARPU_MAXNODES]; static starpu_pthread_cond_t cond_nodes[STARPU_MAXNODES]; int _starpu_memory_manager_init() { int i; for(i=0 ; i= min_waiting_size[node]) STARPU_PTHREAD_COND_BROADCAST(&cond_nodes[node]); STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); } starpu_ssize_t starpu_memory_get_total(unsigned node) { if (global_size[node] == 0) return -1; else return global_size[node]; } starpu_ssize_t starpu_memory_get_available(unsigned node) { if (global_size[node] == 0) return -1; else return global_size[node] - used_size[node]; } void starpu_memory_wait_available(unsigned node, size_t size) { STARPU_PTHREAD_MUTEX_LOCK(&lock_nodes[node]); waiters[node]++; /* Tell deallocators we need this amount */ if (!min_waiting_size[node] || size < min_waiting_size[node]) min_waiting_size[node] = size; /* Wait for it */ while (used_size[node] + size > global_size[node]) STARPU_PTHREAD_COND_WAIT(&cond_nodes[node], &lock_nodes[node]); if (!--waiters[node]) /* Nobody is waiting any more, we can reset the minimum */ min_waiting_size[node] = 0; STARPU_PTHREAD_MUTEX_UNLOCK(&lock_nodes[node]); } starpu-1.1.5/src/datawizard/malloc.c0000644000373600000000000005542312571536575014333 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 _malloc_align = sizeof(void*); static int disable_pinning; void starpu_malloc_set_align(size_t align) { STARPU_ASSERT_MSG(!(align & (align - 1)), "Alignment given to starpu_malloc_set_align (%lu) must be a power of two", (unsigned long) align); if (_malloc_align < align) _malloc_align = align; } #if (defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER))// || defined(STARPU_USE_OPENCL) struct malloc_pinned_codelet_struct { void **ptr; size_t dim; }; #endif /* Would be difficult to do it this way, we need to remember the cl_mem to be able to free it later... */ //#ifdef STARPU_USE_OPENCL //static void malloc_pinned_opencl_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) //{ // struct malloc_pinned_codelet_struct *s = arg; // // *(s->ptr) = malloc(s->dim); // starpu_opencl_allocate_memory(devid, (void **)(s->ptr), s->dim, CL_MEM_READ_WRITE|CL_MEM_ALLOC_HOST_PTR); //} //#endif #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) static void malloc_pinned_cuda_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) { struct malloc_pinned_codelet_struct *s = arg; cudaError_t cures; cures = cudaHostAlloc((void **)(s->ptr), s->dim, cudaHostAllocPortable); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } #endif #if (defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER)) && !defined(STARPU_SIMGRID)// || defined(STARPU_USE_OPENCL) static struct starpu_perfmodel malloc_pinned_model = { .type = STARPU_HISTORY_BASED, .symbol = "malloc_pinned" }; static struct starpu_codelet malloc_pinned_cl = { .cuda_funcs = {malloc_pinned_cuda_codelet}, //#ifdef STARPU_USE_OPENCL // .opencl_funcs = {malloc_pinned_opencl_codelet}, //#endif .nbuffers = 0, .model = &malloc_pinned_model }; #endif int starpu_malloc_flags(void **A, size_t dim, int flags) { int ret=0; STARPU_ASSERT(A); if (flags & STARPU_MALLOC_COUNT) { while (_starpu_memory_manager_can_allocate_size(dim, 0) == 0) { size_t freed; size_t reclaim = 2 * dim; _STARPU_DEBUG("There is not enough memory left, we are going to reclaim %ld\n", reclaim); _STARPU_TRACE_START_MEMRECLAIM(0); freed = _starpu_memory_reclaim_generic(0, 0, reclaim); _STARPU_TRACE_END_MEMRECLAIM(0); if (freed < dim) { // We could not reclaim enough memory *A = NULL; return -ENOMEM; } } } if (flags & STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { #ifdef STARPU_SIMGRID /* FIXME: CUDA seems to be taking 650µs every 1MiB. * Ideally we would simulate this batching in 1MiB requests * instead of computing an average value. */ MSG_process_sleep((float) dim * 0.000650 / 1048576.); #else /* STARPU_SIMGRID */ if (_starpu_can_submit_cuda_task()) { #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER cudaError_t cures; cures = cudaHostAlloc(A, dim, cudaHostAllocPortable); if (STARPU_UNLIKELY(cures)) { STARPU_CUDA_REPORT_ERROR(cures); ret = -ENOMEM; } goto end; #else int push_res; 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->callback_func = NULL; task->cl = &malloc_pinned_cl; task->cl_arg = &s; task->synchronous = 1; _starpu_exclude_task_from_dag(task); push_res = _starpu_task_submit_internally(task); STARPU_ASSERT(push_res != -ENODEV); goto end; #endif /* HAVE_CUDA_MEMCPY_PEER */ #endif /* STARPU_USE_CUDA */ } // else if (_starpu_can_submit_opencl_task()) // { //#ifdef STARPU_USE_OPENCL // int push_res; // // STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "pinned OpenCL allocation must not be done from task or callback"); // // struct malloc_pinned_codelet_struct s = // { // .ptr = A, // .dim = dim // }; // // malloc_pinned_cl.where = STARPU_OPENCL; // struct starpu_task *task = starpu_task_create(); // task->callback_func = NULL; // task->cl = &malloc_pinned_cl; // task->cl_arg = &s; // task->synchronous = 1; // // _starpu_exclude_task_from_dag(task); // // push_res = _starpu_task_submit_internally(task); // STARPU_ASSERT(push_res != -ENODEV); // goto end; //#endif /* STARPU_USE_OPENCL */ // } #endif /* STARPU_SIMGRID */ } #ifdef STARPU_HAVE_POSIX_MEMALIGN if (_malloc_align != sizeof(void*)) { if (posix_memalign(A, _malloc_align, dim)) { ret = -ENOMEM; *A = NULL; } } else #elif defined(STARPU_HAVE_MEMALIGN) if (_malloc_align != sizeof(void*)) { *A = memalign(_malloc_align, dim); if (!*A) ret = -ENOMEM; } else #endif /* STARPU_HAVE_POSIX_MEMALIGN */ { *A = malloc(dim); if (!*A) ret = -ENOMEM; } #if !defined(STARPU_SIMGRID) && defined(STARPU_USE_CUDA) end: #endif if (ret == 0) { STARPU_ASSERT(*A); } else if (flags & STARPU_MALLOC_COUNT) { _starpu_memory_manager_deallocate_size(dim, 0); } return ret; } int starpu_malloc(void **A, size_t dim) { return starpu_malloc_flags(A, dim, STARPU_MALLOC_PINNED); } #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) static void free_pinned_cuda_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) { cudaError_t cures; cures = cudaFreeHost(arg); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } #endif //#ifdef STARPU_USE_OPENCL //static void free_pinned_opencl_codelet(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *arg) //{ // // free(arg); // int err = clReleaseMemObject(arg); // if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); //} //#endif #if defined(STARPU_USE_CUDA) && !defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) // || defined(STARPU_USE_OPENCL) static struct starpu_perfmodel free_pinned_model = { .type = STARPU_HISTORY_BASED, .symbol = "free_pinned" }; static struct starpu_codelet free_pinned_cl = { .cuda_funcs = {free_pinned_cuda_codelet}, //#ifdef STARPU_USE_OPENCL // .opencl_funcs = {free_pinned_opencl_codelet}, //#endif .nbuffers = 0, .model = &free_pinned_model }; #endif int starpu_free_flags(void *A, size_t dim, int flags) { #ifndef STARPU_SIMGRID if (flags & STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { if (_starpu_can_submit_cuda_task()) { #ifdef STARPU_USE_CUDA #ifndef HAVE_CUDA_MEMCPY_PEER if (!_starpu_is_initialized()) { #endif /* This is especially useful when starpu_free is called from * the GCC-plugin. starpu_shutdown will probably have already * been called, so we will not be able to submit a task. */ cudaError_t err = cudaFreeHost(A); if (STARPU_UNLIKELY(err)) STARPU_CUDA_REPORT_ERROR(err); goto out; #ifndef HAVE_CUDA_MEMCPY_PEER } else { int push_res; STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "without CUDA peer allocation support, pinned deallocation must not be done from task or callback"); free_pinned_cl.where = STARPU_CUDA; struct starpu_task *task = starpu_task_create(); task->callback_func = NULL; task->cl = &free_pinned_cl; task->cl_arg = A; task->synchronous = 1; _starpu_exclude_task_from_dag(task); push_res = _starpu_task_submit_internally(task); STARPU_ASSERT(push_res != -ENODEV); goto out; } #endif /* HAVE_CUDA_MEMCPY_PEER */ #endif /* STARPU_USE_CUDA */ } // else if (_starpu_can_submit_opencl_task()) // { //#ifdef STARPU_USE_OPENCL // int push_res; // // STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "pinned OpenCL deallocation must not be done from task or callback"); // // free_pinned_cl.where = STARPU_OPENCL; // struct starpu_task *task = starpu_task_create(); // task->callback_func = NULL; // task->cl = &free_pinned_cl; // task->cl_arg = A; // task->synchronous = 1; // // _starpu_exclude_task_from_dag(task); // // push_res = starpu_task_submit(task); // STARPU_ASSERT(push_res != -ENODEV); // goto out; // } //#endif } #endif /* STARPU_SIMGRID */ free(A); #if !defined(STARPU_SIMGRID) && defined(STARPU_USE_CUDA) out: #endif if (flags & STARPU_MALLOC_COUNT) { _starpu_memory_manager_deallocate_size(dim, 0); } return 0; } int starpu_free(void *A) { return starpu_free_flags(A, 0, STARPU_MALLOC_PINNED); } #ifdef STARPU_SIMGRID static starpu_pthread_mutex_t cuda_alloc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_mutex_t opencl_alloc_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; #endif static uintptr_t _starpu_malloc_on_node(unsigned dst_node, size_t size) { uintptr_t addr = 0; #ifdef STARPU_USE_CUDA cudaError_t status; #endif if (_starpu_memory_manager_can_allocate_size(size, dst_node) == 0) return 0; switch(starpu_node_get_kind(dst_node)) { case STARPU_CPU_RAM: { addr = (uintptr_t)malloc(size); break; } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_RAM: { #ifdef STARPU_SIMGRID static uintptr_t last[STARPU_MAXNODES]; #ifdef STARPU_DEVEL #warning TODO: record used memory, using a simgrid property to know the available memory #endif /* Sleep for the allocation */ STARPU_PTHREAD_MUTEX_LOCK(&cuda_alloc_mutex); MSG_process_sleep(0.000175); if (!last[dst_node]) last[dst_node] = 1<<10; addr = last[dst_node]; last[dst_node]+=size; STARPU_ASSERT(last[dst_node] >= addr); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_alloc_mutex); #else struct _starpu_worker *worker = _starpu_get_local_worker_key(); unsigned devid = _starpu_memory_node_get_devid(dst_node); if (!worker || worker->arch != STARPU_CUDA_WORKER || worker->devid != devid) #if defined(HAVE_CUDA_MEMCPY_PEER) starpu_cuda_set_device(devid); #else STARPU_ASSERT_MSG(0, "CUDA peer access is not available with this version of CUDA"); #endif status = cudaMalloc((void **)&addr, size); if (!addr || (status != cudaSuccess)) { if (STARPU_UNLIKELY(status != cudaErrorMemoryAllocation)) STARPU_CUDA_REPORT_ERROR(status); addr = 0; } #endif break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_RAM: { #ifdef STARPU_SIMGRID static uintptr_t last[STARPU_MAXNODES]; /* Sleep for the allocation */ STARPU_PTHREAD_MUTEX_LOCK(&opencl_alloc_mutex); MSG_process_sleep(0.000175); if (!last[dst_node]) last[dst_node] = 1<<10; addr = last[dst_node]; last[dst_node]+=size; STARPU_ASSERT(last[dst_node] >= addr); STARPU_PTHREAD_MUTEX_UNLOCK(&opencl_alloc_mutex); #else int ret; cl_mem ptr; ret = starpu_opencl_allocate_memory(_starpu_memory_node_get_devid(dst_node), &ptr, size, CL_MEM_READ_WRITE); if (ret) { addr = 0; } else { addr = (uintptr_t)ptr; } break; #endif } #endif default: STARPU_ABORT(); } if (addr == 0) { // Allocation failed, gives the memory back to the memory manager _starpu_memory_manager_deallocate_size(size, dst_node); } return addr; } void _starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size) { enum starpu_node_kind kind = starpu_node_get_kind(dst_node); switch(kind) { case STARPU_CPU_RAM: free((void*)addr); break; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_RAM: { #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&cuda_alloc_mutex); /* Sleep for the free */ MSG_process_sleep(0.000750); STARPU_PTHREAD_MUTEX_UNLOCK(&cuda_alloc_mutex); #else cudaError_t err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); unsigned devid = _starpu_memory_node_get_devid(dst_node); if (!worker || worker->arch != STARPU_CUDA_WORKER || worker->devid != devid) #if defined(HAVE_CUDA_MEMCPY_PEER) starpu_cuda_set_device(devid); #else STARPU_ASSERT_MSG(0, "CUDA peer access is not available with this version of CUDA"); #endif err = cudaFree((void*)addr); if (STARPU_UNLIKELY(err != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(err); #endif break; } #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_RAM: { #ifdef STARPU_SIMGRID STARPU_PTHREAD_MUTEX_LOCK(&opencl_alloc_mutex); /* Sleep for the free */ MSG_process_sleep(0.000750); STARPU_PTHREAD_MUTEX_UNLOCK(&opencl_alloc_mutex); #else cl_int err; err = clReleaseMemObject((void*)addr); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); #endif break; } #endif default: STARPU_ABORT(); } _starpu_memory_manager_deallocate_size(size, dst_node); } int starpu_memory_pin(void *addr STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED) { if (STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) if (cudaHostRegister(addr, size, cudaHostRegisterPortable) != cudaSuccess) return -1; #endif } return 0; } int starpu_memory_unpin(void *addr STARPU_ATTRIBUTE_UNUSED, size_t size STARPU_ATTRIBUTE_UNUSED) { if (STARPU_MALLOC_PINNED && disable_pinning <= 0 && STARPU_RUNNING_ON_VALGRIND == 0) { #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) if (cudaHostUnregister(addr) != cudaSuccess) return -1; #endif } return 0; } /* * On CUDA which has very expensive malloc, for small sizes, allocate big * chunks divided in blocks, and we actually allocate segments of consecutive * blocks. * * We try to keep the list of chunks with increasing occupancy, so we can * quickly find free segments to allocate. */ /* Size of each chunk, 32MiB granularity brings 128 chunks to be allocated in * order to fill a 4GiB GPU. */ #define CHUNK_SIZE (32*1024*1024) /* Maximum segment size we will allocate in chunks */ #define CHUNK_ALLOC_MAX (CHUNK_SIZE / 8) /* Granularity of allocation, i.e. block size, StarPU will never allocate less * than this. * 16KiB (i.e. 64x64 float) granularity eats 2MiB RAM for managing a 4GiB GPU. */ #define CHUNK_ALLOC_MIN (16*1024) /* Number of blocks */ #define CHUNK_NBLOCKS (CHUNK_SIZE/CHUNK_ALLOC_MIN) /* Linked list for available segments */ struct block { int length; /* Number of consecutive free blocks */ int next; /* next free segment */ }; /* One chunk */ LIST_TYPE(_starpu_chunk, uintptr_t base; /* Available number of blocks, for debugging */ int available; /* Overestimation of the maximum size of available segments in this chunk */ int available_max; /* Bitmap describing availability of the block */ /* Block 0 is always empty, and is just the head of the free segments list */ struct block bitmap[CHUNK_NBLOCKS+1]; ) /* One list of chunks per node */ static struct _starpu_chunk_list chunks[STARPU_MAXNODES]; /* Number of completely free chunks */ static int nfreechunks[STARPU_MAXNODES]; /* This protects chunks and nfreechunks */ static starpu_pthread_mutex_t chunk_mutex[STARPU_MAXNODES]; void _starpu_malloc_init(unsigned dst_node) { _starpu_chunk_list_init(&chunks[dst_node]); nfreechunks[dst_node] = 0; STARPU_PTHREAD_MUTEX_INIT(&chunk_mutex[dst_node], NULL); disable_pinning = starpu_get_env_number("STARPU_DISABLE_PINNING"); } 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(dst_node, chunk->base, CHUNK_SIZE); _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) { struct _starpu_chunk *chunk; uintptr_t base = _starpu_malloc_on_node(dst_node, CHUNK_SIZE); if (!base) return NULL; /* Create a new chunk */ chunk = _starpu_chunk_new(); chunk->base = base; /* First block is just a fake block pointing to the free segments list */ chunk->bitmap[0].length = 0; chunk->bitmap[0].next = 1; /* At first we have only one big segment for the whole chunk */ chunk->bitmap[1].length = CHUNK_NBLOCKS; chunk->bitmap[1].next = -1; chunk->available_max = CHUNK_NBLOCKS; chunk->available = CHUNK_NBLOCKS; return chunk; } uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size) { /* Big allocation, allocate normally */ if (size > CHUNK_ALLOC_MAX || starpu_node_get_kind(dst_node) != STARPU_CUDA_RAM) return _starpu_malloc_on_node(dst_node, size); /* 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); 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(unsigned dst_node, uintptr_t addr, size_t size) { /* Big allocation, deallocate normally */ if (size > CHUNK_ALLOC_MAX || starpu_node_get_kind(dst_node) != STARPU_CUDA_RAM) { _starpu_free_on_node(dst_node, addr, size); return; } struct _starpu_chunk *chunk; /* Round up allocation to block size */ int nblocks = (size + CHUNK_ALLOC_MIN - 1) / CHUNK_ALLOC_MIN; STARPU_PTHREAD_MUTEX_LOCK(&chunk_mutex[dst_node]); for (chunk = _starpu_chunk_list_begin(&chunks[dst_node]); chunk != _starpu_chunk_list_end(&chunks[dst_node]); chunk = _starpu_chunk_list_next(chunk)) if (addr >= chunk->base && addr < chunk->base + CHUNK_SIZE) break; STARPU_ASSERT(chunk != _starpu_chunk_list_end(&chunks[dst_node])); struct block *bitmap = chunk->bitmap; int block = ((addr - chunk->base) / CHUNK_ALLOC_MIN) + 1, prevblock, nextblock; /* Look for free segment just before this one */ for (prevblock = 0; prevblock != -1; prevblock = nextblock) { STARPU_ASSERT(prevblock >= 0 && prevblock <= CHUNK_NBLOCKS); nextblock = bitmap[prevblock].next; STARPU_ASSERT_MSG(nextblock != block, "It seems data 0x%lx (size %u) on node %u is being freed a second time\n", (unsigned long) addr, (unsigned) size, dst_node); if (nextblock > block || nextblock == -1) break; } STARPU_ASSERT(prevblock != -1); chunk->available += nblocks; /* Insert in free segments list */ bitmap[block].next = nextblock; bitmap[prevblock].next = block; bitmap[block].length = nblocks; STARPU_ASSERT(nextblock >= -1 && nextblock <= CHUNK_NBLOCKS); if (nextblock == block + nblocks) { /* This freed segment is just before a free segment, merge them */ bitmap[block].next = bitmap[nextblock].next; bitmap[block].length += bitmap[nextblock].length; if (bitmap[block].length > chunk->available_max) chunk->available_max = bitmap[block].length; } if (prevblock > 0 && prevblock + bitmap[prevblock].length == block) { /* This free segment is just after a free segment, merge them */ bitmap[prevblock].next = bitmap[block].next; bitmap[prevblock].length += bitmap[block].length; if (bitmap[prevblock].length > chunk->available_max) chunk->available_max = bitmap[prevblock].length; block = prevblock; } if (chunk->available == CHUNK_NBLOCKS) { /* This chunk is now empty, but avoid chunk free/alloc * ping-pong by keeping some of these. */ if (nfreechunks[dst_node] >= 1) { /* We already have free chunks, release this one */ _starpu_free_on_node(dst_node, chunk->base, CHUNK_SIZE); _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]); } starpu-1.1.5/src/datawizard/sort_data_handles.c0000644000373600000000000000774712571536575016550 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2014 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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++) { STARPU_ASSERT(data); path[depth - level - 1] = current->sibling_index; current = data->father_handle; } } static int _compar_data_paths(const unsigned pathA[], unsigned depthA, const unsigned pathB[], unsigned depthB) { unsigned level; unsigned depth = STARPU_MIN(depthA, depthB); for (level = 0; level < depth; level++) { if (pathA[level] != pathB[level]) return (pathA[level] < pathB[level])?-1:1; } /* If this is the same path */ if (depthA == depthB) return 0; /* A is a subdata of B or B is a subdata of A, so the smallest one is * the father of the other (we take this convention). */ return (depthA < depthB)?-1:1; } /* A comparision function between two handles makes it possible to use qsort to * sort a list of handles */ static int _starpu_compar_handles(const struct _starpu_data_descr *descrA, const struct _starpu_data_descr *descrB) { struct _starpu_data_state *dataA = descrA->handle; struct _starpu_data_state *dataB = descrB->handle; /* Perhaps we have the same piece of data */ if (dataA == dataB) { /* Process write requests first, this is needed for proper * locking, see _submit_job_enforce_data_deps, * _starpu_fetch_task_input, and _starpu_push_task_output */ if (descrA->mode & STARPU_W) { if (descrB->mode & STARPU_W) /* Both A and B write, take the reader first */ if (descrA->mode & STARPU_R) return -1; else return 1; else /* Only A writes, take it first */ return -1; } else /* A doesn't write, take B before */ return 1; } /* 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 - 1]; unsigned dataB_path[dataB->depth - 1]; 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.1.5/src/datawizard/data_request.h0000644000373600000000000001075412571536575015550 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* This one includes us, so make sure to include it first */ #include #ifndef __DATA_REQUEST_H__ #define __DATA_REQUEST_H__ #include #include #include #include struct _starpu_data_replicate; struct _starpu_callback_list { void (*callback_func)(void *); void *callback_arg; struct _starpu_callback_list *next; }; /* This represents a data request, i.e. we want some data to get transferred * from a source to a destination. */ LIST_TYPE(_starpu_data_request, struct _starpu_spinlock lock; unsigned refcnt; starpu_data_handle_t handle; struct _starpu_data_replicate *src_replicate; struct _starpu_data_replicate *dst_replicate; /* Which memory node will actually perform the transfer */ 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 */ unsigned prefetch; /* The value returned by the transfer function */ int retval; /* The request will not actually be submitted until there remains * dependencies. */ unsigned ndeps; /* in case we have a chain of request (eg. for nvidia multi-GPU), this * is the list of requests which are waiting for this one. */ struct _starpu_data_request *next_req[STARPU_MAXNODES]; /* The number of requests in next_req */ unsigned next_req_count; struct _starpu_callback_list *callbacks; unsigned com_id; ) /* Everyone that wants to access some piece of data will post a request. * Not only StarPU internals, but also the application may put such requests */ LIST_TYPE(_starpu_data_requester, /* what kind of access is requested ? */ enum starpu_data_access_mode mode; /* applications may also directly manipulate data */ unsigned is_requested_by_codelet; /* in case this is a codelet that will do the access */ struct _starpu_job *j; unsigned buffer_index; /* if this is more complicated ... (eg. application request) * NB: this callback is not called with the lock taken ! */ void (*ready_data_callback)(void *argcb); void *argcb; ) void _starpu_init_data_request_lists(void); void _starpu_deinit_data_request_lists(void); void _starpu_post_data_request(struct _starpu_data_request *r, unsigned handling_node); /* returns 0 if we have pushed all requests, -EBUSY or -ENOMEM otherwise */ int _starpu_handle_node_data_requests(unsigned src_node, unsigned may_alloc); void _starpu_handle_node_prefetch_requests(unsigned src_node, unsigned may_alloc); void _starpu_handle_pending_node_data_requests(unsigned src_node); void _starpu_handle_all_pending_node_data_requests(unsigned src_node); int _starpu_check_that_no_data_request_exists(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, unsigned handling_node, enum starpu_data_access_mode mode, unsigned ndeps, unsigned is_prefetch); 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); #endif // __DATA_REQUEST_H__ starpu-1.1.5/src/datawizard/memalloc.c0000644000373600000000000007414112571536575014653 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 CPU memory has been explicitly limited by user */ static int limit_cpu_mem; /* This per-node RW-locks protect mc_list and memchunk_cache entries */ /* Note: handle header lock is always taken before this */ static struct _starpu_spinlock mc_lock[STARPU_MAXNODES]; /* Potentially in use memory chunks */ static struct _starpu_mem_chunk_list mc_list[STARPU_MAXNODES]; /* 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]; /* Whether some thread is currently reclaiming memory for this node */ static unsigned reclaiming[STARPU_MAXNODES]; int _starpu_is_reclaiming(unsigned node) { return reclaiming[node]; } /* When reclaiming memory to allocate, we reclaim MAX(what_is_to_reclaim_on_device, data_size_coefficient*data_size) */ const unsigned starpu_memstrategy_data_size_coefficient=2; 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]); } limit_cpu_mem = starpu_get_env_number("STARPU_LIMIT_CPU_MEM"); } void _starpu_deinit_mem_chunk_lists(void) { unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { struct mc_cache_entry *entry, *tmp; HASH_ITER(hh, mc_cache[i], entry, tmp) { HASH_DEL(mc_cache[i], entry); free(entry); } _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->nchildren) return 1; /* 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 transfer_subtree_to_node(starpu_data_handle_t handle, unsigned src_node, unsigned dst_node) { unsigned i; unsigned last = 0; unsigned cnt; STARPU_ASSERT(dst_node != src_node); if (handle->nchildren == 0) { struct _starpu_data_replicate *src_replicate = &handle->per_node[src_node]; struct _starpu_data_replicate *dst_replicate = &handle->per_node[dst_node]; /* this is a leaf */ while (src_replicate->state == STARPU_OWNER) { /* This is the only copy, push it to destination */ struct _starpu_data_request *r; r = _starpu_create_request_to_fetch_data(handle, dst_replicate, STARPU_R, 0, 0, NULL, NULL); /* There is no way we don't need a request, since * source is OWNER, destination can't be having it */ STARPU_ASSERT(r); /* Keep the handle alive while we are working on it */ handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_wait_data_request_completion(r, 1); _starpu_spin_lock(&handle->header_lock); handle->busy_count--; if (_starpu_data_check_not_busy(handle)) return 1; } if (src_replicate->state == STARPU_SHARED) { /* some other node may have the copy */ src_replicate->state = STARPU_INVALID; /* count the number of copies */ cnt = 0; for (i = 0; i < STARPU_MAXNODES; i++) { if (handle->per_node[i].state == STARPU_SHARED) { cnt++; last = i; } } STARPU_ASSERT(cnt > 0); if (cnt == 1) handle->per_node[last].state = STARPU_OWNER; } else STARPU_ASSERT(src_replicate->state == STARPU_INVALID); /* Already dropped by somebody, in which case there is nothing to be done */ } else { /* lock all sub-subtrees children */ unsigned child; int res; for (child = 0; child < handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); res = transfer_subtree_to_node(child_handle, src_node, dst_node); /* There is no way children have disappeared since we * keep the parent lock held */ STARPU_ASSERT(!res); } } return 0; } static void notify_handle_children(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned node) { unsigned child; replicate->allocated = 0; /* XXX why do we need that ? */ replicate->automatically_allocated = 0; for (child = 0; child < handle->nchildren; child++) { /* Notify children that their buffer has been deallocated too */ starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); notify_handle_children(child_handle, &child_handle->per_node[node], node); } } static size_t free_memory_on_node(struct _starpu_mem_chunk *mc, unsigned node) { size_t freed = 0; STARPU_ASSERT(mc->ops); STARPU_ASSERT(mc->ops->free_data_on_node); starpu_data_handle_t handle = mc->data; struct _starpu_data_replicate *replicate = mc->replicate; if (handle) _starpu_spin_checklocked(&handle->header_lock); if (mc->automatically_allocated && (!handle || replicate->refcnt == 0)) { void *data_interface; if (handle) STARPU_ASSERT(replicate->allocated); #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) if (starpu_node_get_kind(node) == STARPU_CUDA_RAM) { /* To facilitate the design of interface, we set the * proper CUDA device in case it is needed. This avoids * having to set it again in the free method of each * interface. */ starpu_cuda_set_device(_starpu_memory_node_get_devid(node)); } #endif if (handle) data_interface = replicate->data_interface; else data_interface = mc->chunk_interface; STARPU_ASSERT(data_interface); if (handle && node == 0) _starpu_data_unregister_ram_pointer(handle); _STARPU_TRACE_START_FREE(node, mc->size); mc->ops->free_data_on_node(data_interface, node); _STARPU_TRACE_END_FREE(node); if (handle) notify_handle_children(handle, replicate, node); freed = mc->size; if (handle) STARPU_ASSERT(replicate->refcnt == 0); } return freed; } static size_t do_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node) { size_t size; starpu_data_handle_t handle = mc->data; if (handle) { _starpu_spin_checklocked(&handle->header_lock); mc->size = _starpu_data_get_size(handle); } if (mc->replicate) mc->replicate->mc=NULL; /* free the actual buffer */ size = free_memory_on_node(mc, node); /* remove the mem_chunk from the list */ _starpu_mem_chunk_list_erase(&mc_list[node], mc); _starpu_mem_chunk_delete(mc); return size; } /* This function is called for memory chunks that are possibly in used (ie. not * in the cache). They should therefore still be associated to a handle. */ static size_t try_to_free_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node) { size_t freed = 0; starpu_data_handle_t handle; handle = mc->data; STARPU_ASSERT(handle); /* This data should be written through to this node, avoid dropping it! */ if (handle->wt_mask & (1<home_node) return 0; /* REDUX memchunk */ if (mc->relaxed_coherency == 2) { /* TODO: reduce it back to e.g. main memory */ } else /* Either it's a "relaxed coherency" memchunk (SCRATCH), or it's a * memchunk that could be used with filters. */ if (mc->relaxed_coherency == 1) { STARPU_ASSERT(mc->replicate); if (_starpu_spin_trylock(&handle->header_lock)) /* Handle is busy, abort */ return 0; if (mc->replicate->refcnt == 0) { /* Note that there is no need to transfer any data or * to update the status in terms of MSI protocol * because this memchunk is associated to a replicate * in "relaxed coherency" mode. */ freed = do_free_mem_chunk(mc, node); } _starpu_spin_unlock(&handle->header_lock); } /* try to lock all the subtree */ else if (lock_all_subtree(handle)) { /* check if they are all "free" */ if (may_free_subtree(handle, node)) { int target = -1; /* XXX Considering only owner to invalidate */ STARPU_ASSERT(handle->per_node[node].refcnt == 0); /* in case there was nobody using that buffer, throw it * away after writing it back to main memory */ if (handle->home_node != -1) target = handle->home_node; else /* NULL-registered data, push to RAM if it's not what we are flushing */ if (node != 0) target = 0; if (target != -1) { int res; #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); res = transfer_subtree_to_node(handle, node, target); _STARPU_TRACE_END_WRITEBACK(node); if (res) /* Oops, the handle has disappeared in the meanwhile */ return 0; #ifdef STARPU_MEMORY_STATS _starpu_memory_handle_stats_loaded_owner(handle, target); #endif if (handle->per_node[node].refcnt == 0) /* And still nobody on it, now the actual buffer may be freed */ freed = do_free_mem_chunk(mc, node); } } /* unlock the tree */ unlock_all_subtree(handle); } return freed; } #ifdef STARPU_USE_ALLOCATION_CACHE /* We assume that mc_lock[node] is taken. is_already_in_mc_list indicates * that the mc is already in the list of buffers that are possibly used, and * therefore not in the cache. */ static void reuse_mem_chunk(unsigned node, struct _starpu_data_replicate *new_replicate, struct _starpu_mem_chunk *mc, unsigned is_already_in_mc_list) { void *data_interface; /* we found an appropriate mem chunk: so we get it out * of the "to free" list, and reassign it to the new * piece of data */ struct _starpu_data_replicate *old_replicate = mc->replicate; if (old_replicate) { 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) { _starpu_mem_chunk_list_erase(&mc_list[node], mc); } free(mc); } static unsigned try_to_reuse_mem_chunk(struct _starpu_mem_chunk *mc, unsigned node, struct _starpu_data_replicate *replicate, unsigned is_already_in_mc_list) { unsigned success = 0; starpu_data_handle_t old_data; old_data = mc->data; STARPU_ASSERT(old_data); /* try to lock all the subtree */ /* and check if they are all "free" */ if (lock_all_subtree(old_data)) { if (may_free_subtree(old_data, node)) { int res; success = 1; /* in case there was nobody using that buffer, throw it * away after writing it back to main memory */ _STARPU_TRACE_START_WRITEBACK(node); res = transfer_subtree_to_node(old_data, node, 0); _STARPU_TRACE_END_WRITEBACK(node); if (res) /* Oops, the handle has disappeared in the meanwhile */ return 0; /* now replace the previous data */ reuse_mem_chunk(node, replicate, mc, is_already_in_mc_list); } /* unlock the tree */ unlock_all_subtree(old_data); } return success; } static int _starpu_data_interface_compare(void *data_interface_a, struct starpu_data_interface_ops *ops_a, void *data_interface_b, struct starpu_data_interface_ops *ops_b) { if (ops_a->interfaceid != ops_b->interfaceid) return -1; int ret = ops_a->compare(data_interface_a, data_interface_b); return ret; } /* This function must be called with mc_lock[node] taken */ static struct _starpu_mem_chunk *_starpu_memchunk_cache_lookup_locked(unsigned node, starpu_data_handle_t handle, uint32_t footprint) { /* go through all buffers in the cache */ struct mc_cache_entry *entry; HASH_FIND(hh, mc_cache[node], &footprint, sizeof(footprint), entry); if (!entry) /* No data with that footprint */ return NULL; struct _starpu_mem_chunk *mc; for (mc = _starpu_mem_chunk_list_begin(&entry->list); mc != _starpu_mem_chunk_list_end(&entry->list); mc = _starpu_mem_chunk_list_next(mc)) { /* Is that a false hit ? (this is _very_ unlikely) */ if (_starpu_data_interface_compare(handle->per_node[node].data_interface, handle->ops, mc->chunk_interface, mc->ops) != 1) continue; /* Cache hit */ /* Remove from the cache */ _starpu_mem_chunk_list_erase(&entry->list, mc); 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. This function must be called with * mc_lock[node] taken. */ static unsigned try_to_find_reusable_mem_chunk(unsigned node, starpu_data_handle_t data, struct _starpu_data_replicate *replicate, uint32_t footprint) { struct _starpu_mem_chunk *mc, *next_mc; /* 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); return 1; } if (!_starpu_has_not_important_data) return 0; /* 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]); 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 */ next_mc = _starpu_mem_chunk_list_next(mc); if (mc->data->is_not_important && (mc->footprint == footprint)) { // fprintf(stderr, "found a candidate ...\n"); if (try_to_reuse_mem_chunk(mc, node, replicate, 1)) return 1; } } return 0; } #endif /* * Free the memory chuncks that are explicitely tagged to be freed. The * mc_lock[node] rw-lock should be taken prior to calling this function. */ static size_t flush_memchunk_cache(unsigned node, size_t reclaim) { struct _starpu_mem_chunk *mc; struct _starpu_mem_chunk_list busy_mc_cache; struct mc_cache_entry *entry, *tmp; size_t freed = 0; _starpu_spin_lock(&mc_lock[node]); HASH_ITER(hh, mc_cache[node], entry, tmp) { _starpu_mem_chunk_list_init(&busy_mc_cache); while (!_starpu_mem_chunk_list_empty(&entry->list)) { mc = _starpu_mem_chunk_list_pop_front(&entry->list); starpu_data_handle_t handle = mc->data; if (handle) if (_starpu_spin_trylock(&handle->header_lock)) { /* The handle is still busy, leave this chunk for later */ _starpu_mem_chunk_list_push_back(&busy_mc_cache, mc); continue; } freed += free_memory_on_node(mc, node); if (handle) _starpu_spin_unlock(&handle->header_lock); free(mc->chunk_interface); _starpu_mem_chunk_delete(mc); if (reclaim && freed >= reclaim) break; } _starpu_mem_chunk_list_push_list_front(&busy_mc_cache, &entry->list); if (reclaim && freed >= reclaim) break; } _starpu_spin_unlock(&mc_lock[node]); 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). The * mc_lock[node] should be taken prior to calling this function. */ 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]); for (mc = _starpu_mem_chunk_list_begin(&mc_list[node]); mc != _starpu_mem_chunk_list_end(&mc_list[node]); 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) { freed += try_to_free_mem_chunk(mc, node); if (reclaim && freed >= reclaim) break; } else { 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; /* 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 && freedhandle; 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->replicate = replicate; mc->replicate->mc = mc; mc->chunk_interface = NULL; mc->size_interface = interface_size; return mc; } static void register_mem_chunk(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, automatically_allocated); _starpu_spin_lock(&mc_lock[dst_node]); _starpu_mem_chunk_list_push_back(&mc_list[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); /* 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 */ mc->chunk_interface = malloc(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 */ _starpu_mem_chunk_list_erase(&mc_list[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 (starpu_node_get_kind(node) == STARPU_CPU_RAM #ifdef STARPU_USE_ALLOCATION_CACHE && limit_cpu_mem < 0 #endif ) { 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) { entry = malloc(sizeof(*entry)); _starpu_mem_chunk_list_init(&entry->list); entry->footprint = footprint; HASH_ADD(hh, mc_cache[node], footprint, sizeof(entry->footprint), entry); } _starpu_mem_chunk_list_push_front(&entry->list, mc); _starpu_spin_unlock(&mc_lock[node]); } } /* * In order to allocate a piece of data, we try to reuse existing buffers if * its possible. * 1 - we try to reuse a memchunk that is explicitely unused. * 2 - we go through the list of memory chunks and find one that is not * referenced and that has the same footprint to reuse it. * 3 - we call the usual driver's alloc method * 4 - we go through the list of memory chunks and release those that are * not referenced (or part of those). * */ static starpu_ssize_t _starpu_allocate_interface(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned dst_node, unsigned is_prefetch) { unsigned attempts = 0; starpu_ssize_t allocated_memory; int ret; starpu_ssize_t data_size = _starpu_data_get_size(handle); int told_reclaiming = 0; _starpu_spin_checklocked(&handle->header_lock); _starpu_data_allocation_inc_stats(dst_node); #ifdef STARPU_USE_ALLOCATION_CACHE /* perhaps we can directly reuse a buffer in the free-list */ uint32_t footprint = _starpu_compute_data_footprint(handle); _STARPU_TRACE_START_ALLOC_REUSE(dst_node, data_size); _starpu_spin_lock(&mc_lock[dst_node]); if (try_to_find_reusable_mem_chunk(dst_node, handle, replicate, footprint)) { _starpu_spin_unlock(&mc_lock[dst_node]); _starpu_allocation_cache_hit(dst_node); return data_size; } _starpu_spin_unlock(&mc_lock[dst_node]); _STARPU_TRACE_END_ALLOC_REUSE(dst_node); #endif STARPU_ASSERT(handle->ops); STARPU_ASSERT(handle->ops->allocate_data_on_node); STARPU_ASSERT(replicate->data_interface); size_t size = handle->ops->interface_size; if (!size) /* nul-size VLA is undefined... */ size = 1; char data_interface[size]; memcpy(data_interface, replicate->data_interface, handle->ops->interface_size); /* Take temporary reference on the replicate */ replicate->refcnt++; handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); do { _STARPU_TRACE_START_ALLOC(dst_node, data_size); #if defined(STARPU_USE_CUDA) && defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) if (starpu_node_get_kind(dst_node) == STARPU_CUDA_RAM) { /* To facilitate the design of interface, we set the * proper CUDA device in case it is needed. This avoids * having to set it again in the malloc method of each * interface. */ starpu_cuda_set_device(_starpu_memory_node_get_devid(dst_node)); } #endif allocated_memory = handle->ops->allocate_data_on_node(data_interface, dst_node); _STARPU_TRACE_END_ALLOC(dst_node); if (allocated_memory == -ENOMEM) { if (!told_reclaiming) { /* Prevent prefetches and such from happening */ (void) STARPU_ATOMIC_ADD(&reclaiming[dst_node], 1); told_reclaiming = 1; } size_t reclaim = 0.25*_starpu_memory_manager_get_global_memory_size(dst_node); size_t handle_size = handle->ops->get_size(handle); if (starpu_memstrategy_data_size_coefficient*handle_size > reclaim) reclaim = starpu_memstrategy_data_size_coefficient*handle_size; _STARPU_TRACE_START_MEMRECLAIM(dst_node); if (is_prefetch) { flush_memchunk_cache(dst_node, reclaim); } else _starpu_memory_reclaim_generic(dst_node, 0, reclaim); _STARPU_TRACE_END_MEMRECLAIM(dst_node); } } while((allocated_memory == -ENOMEM) && attempts++ < 2); int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(_starpu_memory_node_get_local_key(), 0); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); replicate->refcnt--; STARPU_ASSERT(replicate->refcnt >= 0); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; ret = _starpu_data_check_not_busy(handle); STARPU_ASSERT(ret == 0); if (told_reclaiming) /* We've finished with reclaiming memory, let prefetches start again */ (void) STARPU_ATOMIC_ADD(&reclaiming[dst_node], -1); if (allocated_memory == -ENOMEM) { if (replicate->allocated) /* Didn't manage to allocate, but somebody else did */ allocated_memory = 0; goto out; } if (replicate->allocated) { /* Argl, somebody allocated it in between already, drop this one */ _STARPU_TRACE_START_FREE(dst_node, data_size); handle->ops->free_data_on_node(data_interface, dst_node); _STARPU_TRACE_END_FREE(dst_node); allocated_memory = 0; } else /* Install allocated interface */ memcpy(replicate->data_interface, data_interface, handle->ops->interface_size); out: return allocated_memory; } int _starpu_allocate_memory_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned is_prefetch) { starpu_ssize_t allocated_memory; unsigned dst_node = replicate->memory_node; STARPU_ASSERT(handle); /* 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(replicate, 1); replicate->allocated = 1; replicate->automatically_allocated = 1; if (replicate->relaxed_coherency == 0 && dst_node == 0) { /* We are allocating the buffer in main memory, also register it * for the gcc plugin. */ void *ptr = starpu_data_handle_to_pointer(handle, 0); if (ptr != NULL) { _starpu_data_register_ram_pointer(handle, ptr); } } return 0; } unsigned starpu_data_test_if_allocated_on_node(starpu_data_handle_t handle, unsigned memory_node) { return handle->per_node[memory_node].allocated; } void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node) { if (!mc) /* user-allocated memory */ return; _starpu_spin_lock(&mc_lock[node]); _starpu_mem_chunk_list_erase(&mc_list[node], mc); _starpu_mem_chunk_list_push_back(&mc_list[node], mc); _starpu_spin_unlock(&mc_lock[node]); } #ifdef STARPU_MEMORY_STATS void _starpu_memory_display_stats_by_node(int node) { _starpu_spin_lock(&mc_lock[node]); if (!_starpu_mem_chunk_list_empty(&mc_list[node])) { struct _starpu_mem_chunk *mc; fprintf(stderr, "#-------\n"); fprintf(stderr, "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(mc->data); } } _starpu_spin_unlock(&mc_lock[node]); } #endif void starpu_data_display_memory_stats(void) { #ifdef STARPU_MEMORY_STATS unsigned node; fprintf(stderr, "\n#---------------------\n"); fprintf(stderr, "Memory stats :\n"); for (node = 0; node < STARPU_MAXNODES; node++) { _starpu_memory_display_stats_by_node(node); } fprintf(stderr, "\n#---------------------\n"); #endif } starpu-1.1.5/src/datawizard/memalloc.h0000644000373600000000000000534512571536575014660 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMALLOC_H__ #define __MEMALLOC_H__ #include #include #include #include #include #include struct _starpu_data_replicate; LIST_TYPE(_starpu_mem_chunk, 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; unsigned automatically_allocated; /* the size of the data is only set when calling _starpu_request_mem_chunk_removal(), * it is needed by free_memory_on_node() which is called when * the handle is no longer valid. It should not be used otherwise. */ size_t size; /* A buffer that is used for SCRATCH or reduction cannnot be used with * filters. */ unsigned relaxed_coherency; struct _starpu_data_replicate *replicate; ) /* LRU list */ LIST_TYPE(_starpu_mem_chunk_lru, struct _starpu_mem_chunk *mc; ) void _starpu_init_mem_chunk_lists(void); void _starpu_deinit_mem_chunk_lists(void); void _starpu_request_mem_chunk_removal(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned node, size_t size); int _starpu_allocate_memory_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned is_prefetch); size_t _starpu_free_all_automatically_allocated_buffers(unsigned node); void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node); void _starpu_display_memory_stats_by_node(int node); size_t _starpu_memory_reclaim_generic(unsigned node, unsigned force, size_t reclaim); int _starpu_is_reclaiming(unsigned node); #endif starpu-1.1.5/src/datawizard/write_back.h0000644000373600000000000000224312571536575015173 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DW_WRITE_BACK_H__ #define __DW_WRITE_BACK_H__ #include #include /* If a write-through mask is associated to that data handle, this propagates * the the current value of the data onto the different memory nodes in the * write_through_mask. */ void _starpu_write_through_data(starpu_data_handle_t handle, unsigned requesting_node, uint32_t write_through_mask); #endif // __DW_WRITE_BACK_H__ starpu-1.1.5/src/datawizard/memory_nodes.c0000644000373600000000000001320612571536574015554 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 "copy_driver.h" #include "memalloc.h" static struct _starpu_memory_node_descr descr; static starpu_pthread_key_t memory_node_key; void _starpu_memory_nodes_init(void) { /* there is no node yet, subsequent nodes will be * added using _starpu_memory_node_register */ descr.nnodes = 0; STARPU_PTHREAD_KEY_CREATE(&memory_node_key, NULL); unsigned i; for (i = 0; i < STARPU_MAXNODES; i++) { descr.nodes[i] = STARPU_UNUSED; descr.nworkers[i] = 0; } _starpu_init_mem_chunk_lists(); _starpu_init_data_request_lists(); _starpu_memory_manager_init(); STARPU_PTHREAD_RWLOCK_INIT(&descr.conditions_rwlock, NULL); 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(&descr.conditions_rwlock); STARPU_PTHREAD_KEY_DELETE(memory_node_key); } void _starpu_memory_node_set_local_key(unsigned *node) { STARPU_PTHREAD_SETSPECIFIC(memory_node_key, node); } unsigned _starpu_memory_node_get_local_key(void) { unsigned *memory_node; memory_node = (unsigned *) STARPU_PTHREAD_GETSPECIFIC(memory_node_key); /* in case this is called by the programmer, we assume the RAM node is the appropriate memory node ... so we return 0 XXX */ if (STARPU_UNLIKELY(!memory_node)) return 0; return *memory_node; } void _starpu_memory_node_add_nworkers(unsigned node) { descr.nworkers[node]++; } unsigned _starpu_memory_node_get_nworkers(unsigned node) { return descr.nworkers[node]; } struct _starpu_memory_node_descr *_starpu_memory_node_get_description(void) { return &descr; } enum starpu_node_kind starpu_node_get_kind(unsigned node) { return descr.nodes[node]; } int _starpu_memory_node_get_devid(unsigned node) { return descr.devid[node]; } unsigned starpu_memory_nodes_get_count(void) { return descr.nnodes; } unsigned _starpu_memory_node_register(enum starpu_node_kind kind, int devid) { unsigned node; /* ATOMIC_ADD returns the new value ... */ node = STARPU_ATOMIC_ADD(&descr.nnodes, 1) - 1; STARPU_ASSERT_MSG(node < STARPU_MAXNODES,"Too many nodes (%u)!", node); descr.nodes[node] = kind; _STARPU_TRACE_NEW_MEM_NODE(node); descr.devid[node] = devid; /* for now, there is no condition associated to that newly created node */ descr.condition_count[node] = 0; return node; } #ifdef STARPU_SIMGRID void _starpu_simgrid_memory_node_set_host(unsigned node, msg_host_t host) { descr.host[node] = host; } msg_host_t _starpu_simgrid_memory_node_get_host(unsigned node) { return descr.host[node]; } #endif /* TODO move in a more appropriate file !! */ /* Register a condition variable associated to worker which is associated to a * memory node itself. */ void _starpu_memory_node_register_condition(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, unsigned nodeid) { unsigned cond_id; unsigned nconds_total, nconds; STARPU_PTHREAD_RWLOCK_WRLOCK(&descr.conditions_rwlock); /* we only insert the queue if it's not already in the list */ nconds = descr.condition_count[nodeid]; for (cond_id = 0; cond_id < nconds; cond_id++) { if (descr.conditions_attached_to_node[nodeid][cond_id].cond == cond) { STARPU_ASSERT(descr.conditions_attached_to_node[nodeid][cond_id].mutex == mutex); /* the condition is already in the list */ STARPU_PTHREAD_RWLOCK_UNLOCK(&descr.conditions_rwlock); return; } } /* it was not found locally */ descr.conditions_attached_to_node[nodeid][cond_id].cond = cond; descr.conditions_attached_to_node[nodeid][cond_id].mutex = mutex; descr.condition_count[nodeid]++; /* do we have to add it in the global list as well ? */ nconds_total = descr.total_condition_count; for (cond_id = 0; cond_id < nconds_total; cond_id++) { if (descr.conditions_all[cond_id].cond == cond) { /* the queue is already in the global list */ STARPU_PTHREAD_RWLOCK_UNLOCK(&descr.conditions_rwlock); return; } } /* it was not in the global list either */ descr.conditions_all[nconds_total].cond = cond; descr.conditions_all[nconds_total].mutex = mutex; descr.total_condition_count++; STARPU_PTHREAD_RWLOCK_UNLOCK(&descr.conditions_rwlock); } 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 = 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; } starpu-1.1.5/src/datawizard/datawizard.h0000644000373600000000000000232712571536574015215 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATAWIZARD_H__ #define __DATAWIZARD_H__ #include #include #include #include #include #include #include #include #include #include void _starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc); #endif // __DATAWIZARD_H__ starpu-1.1.5/src/datawizard/footprint.c0000644000373600000000000000462612571536575015107 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2011, 2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include uint32_t _starpu_compute_buffers_footprint(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned nimpl, struct _starpu_job *j) { if (j->footprint_is_computed) return j->footprint; uint32_t footprint = 0; unsigned buffer; struct starpu_task *task = j->task; if (model && model->per_arch[arch][nimpl].size_base) { size_t size = model->per_arch[arch][nimpl].size_base(task, arch, nimpl); footprint = starpu_hash_crc32c_be_n(&size, sizeof(size), footprint); } else if (model && model->size_base) { size_t size = model->size_base(task, nimpl); footprint = starpu_hash_crc32c_be_n(&size, sizeof(size), footprint); } else { for (buffer = 0; buffer < task->cl->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); } } j->footprint = footprint; j->footprint_is_computed = 1; return footprint; } uint32_t _starpu_compute_data_footprint(starpu_data_handle_t handle) { uint32_t interfaceid = (uint32_t)starpu_data_get_interface_id(handle); STARPU_ASSERT(handle->ops->footprint); uint32_t handle_footprint = handle->ops->footprint(handle); return starpu_hash_crc32c_be(handle_footprint, interfaceid); } uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype 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.1.5/src/datawizard/write_back.c0000644000373600000000000000557712571536575015203 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include static void wt_callback(void *arg) { starpu_data_handle_t handle = (starpu_data_handle_t) arg; _starpu_spin_lock(&handle->header_lock); if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } void _starpu_write_through_data(starpu_data_handle_t handle, unsigned requesting_node, uint32_t write_through_mask) { if ((write_through_mask & ~(1<header_lock)) { cpt++; _starpu_datawizard_progress(requesting_node, 1); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); /* We need to keep a Read lock to avoid letting writers corrupt our copy. */ STARPU_ASSERT(handle->current_mode != STARPU_REDUX); STARPU_ASSERT(handle->current_mode != STARPU_SCRATCH); handle->refcnt++; handle->busy_count++; handle->current_mode = STARPU_R; struct _starpu_data_request *r; r = _starpu_create_request_to_fetch_data(handle, &handle->per_node[node], STARPU_R, 1, 1, wt_callback, handle); /* If no request was created, the handle was already up-to-date on the * node */ if (r) _starpu_spin_unlock(&handle->header_lock); } } } } void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask) { handle->wt_mask = wt_mask; /* in case the data has some children, set their wt_mask as well */ if (handle->nchildren > 0) { unsigned child; for (child = 0; child < handle->nchildren; child++) { starpu_data_handle_t handle_child = starpu_data_get_child(handle, child); starpu_data_set_wt_mask(handle_child, wt_mask); } } } starpu-1.1.5/src/datawizard/copy_driver.h0000644000373600000000000000407012571536575015406 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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__ #include #ifdef STARPU_USE_CUDA #include #include #include #endif #ifdef STARPU_USE_OPENCL #include #endif struct _starpu_data_request; struct _starpu_data_replicate; /* this is a structure that can be queried to see whether an asynchronous * transfer has terminated or not */ union _starpu_async_channel_event { int dummy; #ifdef STARPU_SIMGRID struct { unsigned finished; starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; }; #endif #ifdef STARPU_USE_CUDA cudaEvent_t cuda_event; #endif #ifdef STARPU_USE_OPENCL cl_event opencl_event; #endif }; struct _starpu_async_channel { union _starpu_async_channel_event event; enum starpu_node_kind type; }; void _starpu_wake_all_blocked_workers_on_node(unsigned nodeid); int _starpu_driver_copy_data_1_to_1(starpu_data_handle_t handle, struct _starpu_data_replicate *src_replicate, struct _starpu_data_replicate *dst_replicate, unsigned donotread, struct _starpu_data_request *req, unsigned may_alloc); unsigned _starpu_driver_test_request_completion(struct _starpu_async_channel *async_channel); void _starpu_driver_wait_request_completion(struct _starpu_async_channel *async_channel); #endif // __COPY_DRIVER_H__ starpu-1.1.5/src/datawizard/memstats.c0000644000373600000000000000676112571536575014722 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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 handle->memory_stats = calloc(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(starpu_data_handle_t handle) { unsigned node; fprintf(stderr, "#-----\n"); fprintf(stderr, "Data : %p\n", handle); fprintf(stderr, "Size : %d\n", (int)handle->ops->get_size(handle)); fprintf(stderr, "\n"); fprintf(stderr, "#--\n"); fprintf(stderr, "Data access stats\n"); fprintf(stderr, "/!\\ 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(stderr, "Node #%d\n", node); fprintf(stderr, "\tDirect access : %d\n", handle->memory_stats->direct_access[node]); /* XXX Not Working yet. */ if (handle->memory_stats->shared_to_owner[node]) fprintf(stderr, "\t\tShared to Owner : %d\n", handle->memory_stats->shared_to_owner[node]); fprintf(stderr, "\tLoaded (Owner) : %d\n", handle->memory_stats->loaded_owner[node]); fprintf(stderr, "\tLoaded (Shared) : %d\n", handle->memory_stats->loaded_shared[node]); fprintf(stderr, "\tInvalidated (was Owner) : %d\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.1.5/src/datawizard/reduction.c0000644000373600000000000002711612571536575015056 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl) { _starpu_spin_lock(&handle->header_lock); _starpu_codelet_check_deprecated_fields(redux_cl); _starpu_codelet_check_deprecated_fields(init_cl); unsigned child; for (child = 0; child < handle->nchildren; child++) { /* make sure that the flags are applied to the children as well */ starpu_data_handle_t child_handle = starpu_data_get_child(handle, child); if (child_handle->nchildren > 0) starpu_data_set_reduction_methods(child_handle, redux_cl, init_cl); } handle->redux_cl = redux_cl; handle->init_cl = init_cl; _starpu_spin_unlock(&handle->header_lock); } void _starpu_redux_init_data_replicate(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, int workerid) { STARPU_ASSERT(replicate); STARPU_ASSERT(replicate->allocated); struct starpu_codelet *init_cl = handle->init_cl; STARPU_ASSERT(init_cl); _starpu_cl_func_t init_func = NULL; /* TODO Check that worker may execute the codelet */ switch (starpu_worker_get_type(workerid)) { case STARPU_CPU_WORKER: init_func = _starpu_task_get_cpu_nth_implementation(init_cl, 0); break; case STARPU_CUDA_WORKER: init_func = _starpu_task_get_cuda_nth_implementation(init_cl, 0); break; case STARPU_OPENCL_WORKER: init_func = _starpu_task_get_opencl_nth_implementation(init_cl, 0); break; default: STARPU_ABORT(); break; } STARPU_ASSERT(init_func); init_func(&replicate->data_interface, NULL); replicate->initialized = 1; } /* Enable reduction mode. This function must be called with the header lock * taken. */ void _starpu_data_start_reduction_mode(starpu_data_handle_t handle) { STARPU_ASSERT(handle->reduction_refcnt == 0); 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); handle->reduction_tmp_handles = malloc(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(); /* 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(); /* 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(); /* 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.1.5/src/datawizard/datawizard.c0000644000373600000000000000275412571536575015215 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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_SIMGRID #include #endif void _starpu_datawizard_progress(unsigned memory_node, unsigned may_alloc) { #if STARPU_DEVEL #warning FIXME #endif #ifdef STARPU_SIMGRID MSG_process_sleep(0.000010); #endif STARPU_UYIELD(); /* in case some other driver requested data */ _starpu_handle_pending_node_data_requests(memory_node); if (_starpu_handle_node_data_requests(memory_node, may_alloc) == 0) /* We pushed all pending requests, we can afford pushing * prefetch requests */ _starpu_handle_node_prefetch_requests(memory_node, may_alloc); _starpu_execute_registered_progression_hooks(); } starpu-1.1.5/src/datawizard/footprint.h0000644000373600000000000000237312571536575015111 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __FOOTPRINT_H__ #define __FOOTPRINT_H__ #include #include #include /* Compute the footprint that characterizes the job and cache it into the job * structure. */ uint32_t _starpu_compute_buffers_footprint(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned nimpl, struct _starpu_job *j); /* Compute the footprint that characterizes the layout of the data handle. */ uint32_t _starpu_compute_data_footprint(starpu_data_handle_t handle); #endif // __FOOTPRINT_H__ starpu-1.1.5/src/datawizard/malloc.h0000644000373600000000000000143412571536575014331 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __ALLOC_H__ #define __ALLOC_H__ void _starpu_malloc_init(unsigned dst_node); void _starpu_malloc_shutdown(unsigned dst_node); #endif starpu-1.1.5/src/datawizard/memory_nodes.h0000644000373600000000000000633312571536575015565 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMORY_NODES_H__ #define __MEMORY_NODES_H__ #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif #define _STARPU_MEMORY_NODE_TUPLE(node1,node2) (node1 | (node2 << 4)) #define _STARPU_MEMORY_NODE_TUPLE_FIRST(tuple) (tuple & 0x0F) #define _STARPU_MEMORY_NODE_TUPLE_SECOND(tuple) (tuple & 0xF0) struct _starpu_cond_and_mutex { starpu_pthread_cond_t *cond; starpu_pthread_mutex_t *mutex; }; struct _starpu_memory_node_descr { unsigned nnodes; enum starpu_node_kind nodes[STARPU_MAXNODES]; /* Get the device id associated to this node, or -1 if not applicable */ int devid[STARPU_MAXNODES]; unsigned nworkers[STARPU_MAXNODES]; #ifdef STARPU_SIMGRID msg_host_t host[STARPU_MAXNODES]; #endif // TODO move this 2 lists outside struct _starpu_memory_node_descr /* Every worker is associated to a condition variable on which the * worker waits when there is task available. It is possible that * multiple worker share the same condition variable, so we maintain a * list of all these condition variables so that we can wake up all * worker attached to a memory node that are waiting on a task. */ starpu_pthread_rwlock_t conditions_rwlock; struct _starpu_cond_and_mutex conditions_attached_to_node[STARPU_MAXNODES][STARPU_NMAXWORKERS]; struct _starpu_cond_and_mutex conditions_all[STARPU_MAXNODES*STARPU_NMAXWORKERS]; /* the number of queues attached to each node */ unsigned total_condition_count; unsigned condition_count[STARPU_MAXNODES]; }; void _starpu_memory_nodes_init(void); void _starpu_memory_nodes_deinit(void); void _starpu_memory_node_set_local_key(unsigned *node); unsigned _starpu_memory_node_get_local_key(void); void _starpu_memory_node_add_nworkers(unsigned node); unsigned _starpu_memory_node_get_nworkers(unsigned node); #ifdef STARPU_SIMGRID void _starpu_simgrid_memory_node_set_host(unsigned node, msg_host_t host); msg_host_t _starpu_simgrid_memory_node_get_host(unsigned node); #endif unsigned _starpu_memory_node_register(enum starpu_node_kind kind, int devid); //void _starpu_memory_node_attach_queue(struct starpu_jobq_s *q, unsigned nodeid); void _starpu_memory_node_register_condition(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, unsigned memory_node); int _starpu_memory_node_get_devid(unsigned node); struct _starpu_memory_node_descr *_starpu_memory_node_get_description(void); #endif // __MEMORY_NODES_H__ starpu-1.1.5/src/datawizard/interfaces/0002755000373600000000000000000012571541161015077 500000000000000starpu-1.1.5/src/datawizard/interfaces/coo_interface.c0000644000373600000000000001547412571536574020010 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { size_t size = 0; struct starpu_coo_interface *src_coo, *dst_coo; int ret = 0; src_coo = (struct starpu_coo_interface *) src_interface; dst_coo = (struct starpu_coo_interface *) dst_interface; size = src_coo->n_values * sizeof(src_coo->columns[0]); if (starpu_interface_copy( (uintptr_t) src_coo->columns, 0, src_node, (uintptr_t) dst_coo->columns, 0, dst_node, size, async_data)) ret = -EAGAIN; /* sizeof(src_coo->columns[0]) == sizeof(src_coo->rows[0]) */ if (starpu_interface_copy( (uintptr_t) src_coo->rows, 0, src_node, (uintptr_t) dst_coo->rows, 0, dst_node, size, async_data)) ret = -EAGAIN; size = src_coo->n_values * src_coo->elemsize; if (starpu_interface_copy( src_coo->values, 0, src_node, dst_coo->values, 0, dst_node, size, async_data)) ret = -EAGAIN; _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_coo->n_values * (2 * sizeof(src_coo->rows[0]) + src_coo->elemsize)); return ret; } static const struct starpu_data_copy_methods coo_copy_data_methods = { .any_to_any = copy_any_to_any, }; static void register_coo_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_coo_interface *local_interface; local_interface = (struct starpu_coo_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->values = coo_interface->values; local_interface->columns = coo_interface->columns; local_interface->rows = coo_interface->rows; } else { local_interface->values = 0; local_interface->columns = 0; local_interface->rows = 0; } local_interface->nx = coo_interface->nx; local_interface->ny = coo_interface->ny; local_interface->n_values = coo_interface->n_values; local_interface->elemsize = coo_interface->elemsize; } } static starpu_ssize_t allocate_coo_buffer_on_node(void *data_interface, unsigned dst_node) { uint32_t *addr_columns = NULL; uint32_t *addr_rows = NULL; uintptr_t addr_values = 0; struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; uint32_t n_values = coo_interface->n_values; size_t elemsize = coo_interface->elemsize; addr_columns = (void*) starpu_malloc_on_node(dst_node, n_values * sizeof(coo_interface->columns[0])); if (STARPU_UNLIKELY(addr_columns == NULL)) goto fail_columns; addr_rows = (void*) starpu_malloc_on_node(dst_node, n_values * sizeof(coo_interface->rows[0])); if (STARPU_UNLIKELY(addr_rows == NULL)) goto fail_rows; addr_values = starpu_malloc_on_node(dst_node, n_values * elemsize); if (STARPU_UNLIKELY(addr_values == (uintptr_t) NULL)) goto fail_values; coo_interface->columns = addr_columns; coo_interface->rows = addr_rows; coo_interface->values = addr_values; return n_values * (sizeof(coo_interface->columns[0]) + sizeof(coo_interface->rows[0]) + elemsize); fail_values: starpu_free_on_node(dst_node, (uintptr_t) addr_rows, n_values * sizeof(coo_interface->rows[0])); fail_rows: starpu_free_on_node(dst_node, (uintptr_t) addr_columns, n_values * sizeof(coo_interface->columns[0])); fail_columns: return -ENOMEM; } static void free_coo_buffer_on_node(void *data_interface, unsigned node) { struct starpu_coo_interface *coo_interface = (struct starpu_coo_interface *) data_interface; uint32_t n_values = coo_interface->n_values; size_t elemsize = coo_interface->elemsize; starpu_free_on_node(node, (uintptr_t) coo_interface->columns, n_values * sizeof(coo_interface->columns[0])); starpu_free_on_node(node, (uintptr_t) coo_interface->rows, n_values * sizeof(coo_interface->rows[0])); starpu_free_on_node(node, coo_interface->values, n_values * elemsize); } static size_t coo_interface_get_size(starpu_data_handle_t handle) { struct starpu_coo_interface *coo_interface; coo_interface = (struct starpu_coo_interface *) starpu_data_get_interface_on_node(handle, 0); 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, 0); 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, 0); fprintf(f, "%u\t%u", coo_interface->nx, coo_interface->ny); } struct starpu_data_interface_ops _starpu_interface_coo_ops = { .register_data_handle = register_coo_handle, .allocate_data_on_node = allocate_coo_buffer_on_node, .handle_to_pointer = NULL, .free_data_on_node = free_coo_buffer_on_node, .copy_methods = &coo_copy_data_methods, .get_size = coo_interface_get_size, .footprint = coo_interface_footprint, .compare = coo_compare, .interfaceid = STARPU_COO_INTERFACE_ID, .interface_size = sizeof(struct starpu_coo_interface), .display = display_coo_interface }; void starpu_coo_data_register(starpu_data_handle_t *handleptr, unsigned 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 = { .values = values, .columns = columns, .rows = rows, .nx = nx, .ny = ny, .n_values = n_values, .elemsize = elemsize, }; starpu_data_register(handleptr, home_node, &coo_interface, &_starpu_interface_coo_ops); } starpu-1.1.5/src/datawizard/interfaces/block_interface.c0000644000373600000000000005652712571536574020326 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static int copy_ram_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); #ifdef STARPU_USE_CUDA static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); #endif #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); #endif static const struct starpu_data_copy_methods block_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, #endif #ifdef STARPU_USE_OPENCL .ram_to_opencl = copy_ram_to_opencl, .opencl_to_ram = copy_opencl_to_ram, .opencl_to_opencl = copy_opencl_to_opencl, .ram_to_opencl_async = copy_ram_to_opencl_async, .opencl_to_ram_async = copy_opencl_to_ram_async, .opencl_to_opencl_async = copy_opencl_to_opencl_async, #endif }; static void register_block_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static void *block_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static starpu_ssize_t allocate_block_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_block_buffer_on_node(void *data_interface, unsigned node); static size_t block_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_block_interface_crc32(starpu_data_handle_t handle); static int block_compare(void *data_interface_a, void *data_interface_b); static void display_block_interface(starpu_data_handle_t handle, FILE *f); static struct starpu_data_interface_ops interface_block_ops = { .register_data_handle = register_block_handle, .allocate_data_on_node = allocate_block_buffer_on_node, .handle_to_pointer = block_handle_to_pointer, .free_data_on_node = free_block_buffer_on_node, .copy_methods = &block_copy_data_methods_s, .get_size = block_interface_get_size, .footprint = footprint_block_interface_crc32, .compare = block_compare, .interfaceid = STARPU_BLOCK_INTERFACE_ID, .interface_size = sizeof(struct starpu_block_interface), .display = display_block_interface, }; static void *block_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) block_interface->ptr; } static void register_block_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_block_interface *local_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = block_interface->ptr; local_interface->dev_handle = block_interface->dev_handle; local_interface->offset = block_interface->offset; local_interface->ldy = block_interface->ldy; local_interface->ldz = block_interface->ldz; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; local_interface->ldy = 0; local_interface->ldz = 0; } local_interface->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, unsigned 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 = { .ptr = ptr, .dev_handle = ptr, .offset = 0, .ldy = ldy, .ldz = ldz, .nx = nx, .ny = ny, .nz = nz, .elemsize = elemsize }; starpu_data_register(handleptr, home_node, &block_interface, &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, 0); fprintf(f, "%u\t%u\t%u\t", block_interface->nx, block_interface->ny, block_interface->nz); } static size_t block_interface_get_size(starpu_data_handle_t handle) { size_t size; struct starpu_block_interface *block_interface; block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, 0); 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, 0); 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, 0); 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, 0); return block_interface->nz; } uint32_t starpu_block_get_local_ldy(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); return block_interface->ldy; } uint32_t starpu_block_get_local_ldz(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); return block_interface->ldz; } uintptr_t starpu_block_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_block_interface *block_interface = (struct starpu_block_interface *) starpu_data_get_interface_on_node(handle, node); 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, 0); return block_interface->elemsize; } /* memory allocation/deallocation primitives for the BLOCK interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_block_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr = 0, handle; struct starpu_block_interface *dst_block = (struct starpu_block_interface *) data_interface_; uint32_t nx = dst_block->nx; uint32_t ny = dst_block->ny; uint32_t nz = dst_block->nz; size_t elemsize = dst_block->elemsize; starpu_ssize_t allocated_memory; handle = starpu_malloc_on_node(dst_node, nx*ny*nz*elemsize); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; allocated_memory = nx*ny*nz*elemsize; /* update the data properly in consequence */ dst_block->ptr = addr; dst_block->dev_handle = handle; dst_block->offset = 0; dst_block->ldy = nx; dst_block->ldz = nx*ny; return allocated_memory; } static void free_block_buffer_on_node(void *data_interface, unsigned node) { struct starpu_block_interface *block_interface = (struct starpu_block_interface *) data_interface; uint32_t nx = block_interface->nx; uint32_t ny = block_interface->ny; uint32_t nz = block_interface->nz; size_t elemsize = block_interface->elemsize; starpu_free_on_node(node, block_interface->dev_handle, nx*ny*nz*elemsize); } #ifdef STARPU_USE_CUDA static int copy_cuda_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, enum cudaMemcpyKind kind) { struct starpu_block_interface *src_block = src_interface; struct starpu_block_interface *dst_block = dst_interface; uint32_t nx = src_block->nx; uint32_t ny = src_block->ny; uint32_t nz = src_block->nz; size_t elemsize = src_block->elemsize; cudaError_t cures; if ((nx == src_block->ldy) && (src_block->ldy == dst_block->ldy)) { /* Is that a single contiguous buffer ? */ if (((nx*ny) == src_block->ldz) && (src_block->ldz == dst_block->ldz)) { starpu_cuda_copy_async_sync((void *)src_block->ptr, src_node, (void *)dst_block->ptr, dst_node, nx*ny*nz*elemsize, NULL, kind); } else { /* Are all plans contiguous */ cures = cudaMemcpy2D((char *)dst_block->ptr, dst_block->ldz*elemsize, (char *)src_block->ptr, src_block->ldz*elemsize, nx*ny*elemsize, nz, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } } else { /* Default case: we transfer all blocks one by one: nz transfers */ /* TODO: use cudaMemcpy3D now that it works (except on cuda 4.2) */ unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { uint8_t *src_ptr = ((uint8_t *)src_block->ptr) + layer*src_block->ldz*src_block->elemsize; uint8_t *dst_ptr = ((uint8_t *)dst_block->ptr) + layer*dst_block->ldz*dst_block->elemsize; cures = cudaMemcpy2D((char *)dst_ptr, dst_block->ldy*elemsize, (char *)src_ptr, src_block->ldy*elemsize, nx*elemsize, ny, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->elemsize*src_block->elemsize); return 0; } static int copy_cuda_async_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream, enum cudaMemcpyKind kind) { struct starpu_block_interface *src_block = src_interface; struct starpu_block_interface *dst_block = dst_interface; uint32_t nx = src_block->nx; uint32_t ny = src_block->ny; uint32_t nz = src_block->nz; size_t elemsize = src_block->elemsize; cudaError_t cures; int ret; /* We may have a contiguous buffer for the entire block, or contiguous * plans within the block, we can avoid many small transfers that way */ if ((nx == src_block->ldy) && (src_block->ldy == dst_block->ldy)) { /* Is that a single contiguous buffer ? */ if (((nx*ny) == src_block->ldz) && (src_block->ldz == dst_block->ldz)) { ret = starpu_cuda_copy_async_sync((void *)src_block->ptr, src_node, (void *)dst_block->ptr, dst_node, nx*ny*nz*elemsize, stream, kind); } else { /* Are all plans contiguous */ _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy2DAsync((char *)dst_block->ptr, dst_block->ldz*elemsize, (char *)src_block->ptr, src_block->ldz*elemsize, nx*ny*elemsize, nz, kind, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_UNLIKELY(cures)) { cures = cudaMemcpy2D((char *)dst_block->ptr, dst_block->ldz*elemsize, (char *)src_block->ptr, src_block->ldz*elemsize, nx*ny*elemsize, nz, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); ret = 0; } else { ret = -EAGAIN; } } } else { /* Default case: we transfer all blocks one by one: nz 2D transfers */ /* TODO: use cudaMemcpy3D now that it works (except on cuda 4.2) */ unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { uint8_t *src_ptr = ((uint8_t *)src_block->ptr) + layer*src_block->ldz*src_block->elemsize; uint8_t *dst_ptr = ((uint8_t *)dst_block->ptr) + layer*dst_block->ldz*dst_block->elemsize; _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy2DAsync((char *)dst_ptr, dst_block->ldy*elemsize, (char *)src_ptr, src_block->ldy*elemsize, nx*elemsize, ny, kind, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_UNLIKELY(cures)) { /* I don't know how to do that "better" */ goto no_async_default; } } ret = -EAGAIN; } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize); return ret; no_async_default: { unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { uint8_t *src_ptr = ((uint8_t *)src_block->ptr) + layer*src_block->ldz*src_block->elemsize; uint8_t *dst_ptr = ((uint8_t *)dst_block->ptr) + layer*dst_block->ldz*dst_block->elemsize; cures = cudaMemcpy2D((char *)dst_ptr, dst_block->ldy*elemsize, (char *)src_ptr, src_block->ldy*elemsize, nx*elemsize, ny, kind); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize); return 0; } } static int copy_cuda_to_ram(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost); } static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice); } static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice); } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_async_common(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToHost); } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_async_common(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyHostToDevice); } #endif // STARPU_USE_CUDA #ifdef STARPU_USE_OPENCL static int copy_opencl_common(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { struct starpu_block_interface *src_block = src_interface; struct starpu_block_interface *dst_block = dst_interface; int ret = 0; uint32_t nx = src_block->nx; uint32_t ny = src_block->ny; /* We may have a contiguous buffer for the entire block, or contiguous * plans within the block, we can avoid many small transfers that way */ if ((nx == src_block->ldy) && (src_block->ldy == dst_block->ldy)) { /* Is that a single contiguous buffer ? */ if (((nx*ny) == src_block->ldz) && (src_block->ldz == dst_block->ldz)) { ret = starpu_opencl_copy_async_sync(src_block->dev_handle, src_block->offset, src_node, dst_block->dev_handle, dst_block->offset, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize, event); } else { /* Are all plans contiguous */ STARPU_ASSERT_MSG(0, "XXX non contiguous buffers are not properly supported in OpenCL yet. (TODO)"); } } else { /* Default case: we transfer all lines one by one: ny*nz transfers */ /* TODO: rect support */ unsigned layer; for (layer = 0; layer < src_block->nz; layer++) { unsigned j; for(j=0 ; jny ; j++) { ret = starpu_opencl_copy_async_sync(src_block->dev_handle, src_block->offset + layer*src_block->ldz*src_block->elemsize + j*src_block->ldy*src_block->elemsize, src_node, dst_block->dev_handle, dst_block->offset + layer*dst_block->ldz*dst_block->elemsize + j*dst_block->ldy*dst_block->elemsize, dst_node, src_block->nx*src_block->elemsize, event); } } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize); return ret; } static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } #endif /* as not all platform easily have a BLAS lib installed ... */ 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_block_interface *src_block = (struct starpu_block_interface *) src_interface; struct starpu_block_interface *dst_block = (struct starpu_block_interface *) dst_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; 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; uintptr_t ptr_src = src_block->ptr; uintptr_t ptr_dst = dst_block->ptr; unsigned y, z; for (z = 0; z < nz; z++) { for (y = 0; y < ny; y++) { uint32_t src_offset = (y*ldy_src + z*ldz_src)*elemsize; uint32_t dst_offset = (y*ldy_dst + z*ldz_dst)*elemsize; memcpy((void *)(ptr_dst + dst_offset), (void *)(ptr_src + src_offset), nx*elemsize); } } _STARPU_TRACE_DATA_COPY(src_node, dst_node, nx*ny*nz*elemsize); return 0; } starpu-1.1.5/src/datawizard/interfaces/bcsr_filters.c0000644000373600000000000000337112571536574017662 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_bcsr_filter_canonical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, STARPU_ATTRIBUTE_UNUSED unsigned nparts) { struct starpu_bcsr_interface *bcsr_father = (struct starpu_bcsr_interface *) father_interface; /* each chunk becomes a small dense matrix */ struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; size_t elemsize = bcsr_father->elemsize; uint32_t firstentry = bcsr_father->firstentry; /* size of the tiles */ uint32_t r = bcsr_father->r; uint32_t c = bcsr_father->c; uint32_t ptr_offset = c*r*id*elemsize; matrix_child->nx = c; matrix_child->ny = r; matrix_child->ld = c; matrix_child->elemsize = elemsize; if (bcsr_father->nzval) { uint8_t *nzval = (uint8_t *)(bcsr_father->nzval); matrix_child->ptr = (uintptr_t)&nzval[firstentry + ptr_offset]; } } starpu-1.1.5/src/datawizard/interfaces/void_interface.c0000644000373600000000000000771312571536574020166 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include static int dummy_copy(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods void_copy_data_methods_s = { .any_to_any = dummy_copy, }; static void register_void_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_void_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_void_buffer_on_node(void *data_interface, unsigned node); static size_t void_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_void_interface_crc32(starpu_data_handle_t handle); static int void_compare(void *data_interface_a, void *data_interface_b); static void display_void_interface(starpu_data_handle_t handle, FILE *f); static struct starpu_data_interface_ops 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 }; 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, 0, NULL, &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 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; } starpu-1.1.5/src/datawizard/interfaces/matrix_interface.c0000644000373600000000000005064712571536574020535 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static int copy_ram_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); #ifdef STARPU_USE_CUDA /* At least CUDA 4.2 still didn't have working memcpy3D */ #if CUDART_VERSION < 5000 #define BUGGED_MEMCPY3D #endif static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); #ifndef BUGGED_MEMCPY3D static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream); #endif #endif #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED); static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cl_event *event); #endif static const struct starpu_data_copy_methods matrix_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, #ifndef BUGGED_MEMCPY3D .cuda_to_cuda_async = copy_cuda_to_cuda_async, #endif #else #ifdef STARPU_SIMGRID #ifndef BUGGED_MEMCPY3D /* Enable GPU-GPU transfers in simgrid */ .cuda_to_cuda_async = 1, #endif #endif #endif #ifdef STARPU_USE_OPENCL .ram_to_opencl = copy_ram_to_opencl, .opencl_to_ram = copy_opencl_to_ram, .opencl_to_opencl = copy_opencl_to_opencl, .ram_to_opencl_async = copy_ram_to_opencl_async, .opencl_to_ram_async = copy_opencl_to_ram_async, .opencl_to_opencl_async = copy_opencl_to_opencl_async, #endif }; static void register_matrix_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static void *matrix_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static starpu_ssize_t allocate_matrix_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_matrix_buffer_on_node(void *data_interface, unsigned node); static size_t matrix_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_matrix_interface_crc32(starpu_data_handle_t handle); static int matrix_compare(void *data_interface_a, void *data_interface_b); static void display_matrix_interface(starpu_data_handle_t handle, FILE *f); struct starpu_data_interface_ops starpu_interface_matrix_ops = { .register_data_handle = register_matrix_handle, .allocate_data_on_node = allocate_matrix_buffer_on_node, .handle_to_pointer = matrix_handle_to_pointer, .free_data_on_node = free_matrix_buffer_on_node, .copy_methods = &matrix_copy_data_methods_s, .get_size = matrix_interface_get_size, .footprint = footprint_matrix_interface_crc32, .compare = matrix_compare, .interfaceid = STARPU_MATRIX_INTERFACE_ID, .interface_size = sizeof(struct starpu_matrix_interface), .display = display_matrix_interface, }; 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->nx = matrix_interface->nx; local_interface->ny = matrix_interface->ny; local_interface->elemsize = matrix_interface->elemsize; } } static void *matrix_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) matrix_interface->ptr; } /* declare a new data with the matrix interface */ void starpu_matrix_data_register(starpu_data_handle_t *handleptr, unsigned home_node, uintptr_t ptr, uint32_t ld, uint32_t nx, uint32_t ny, size_t elemsize) { struct starpu_matrix_interface matrix_interface = { .ptr = ptr, .ld = ld, .nx = nx, .ny = ny, .elemsize = elemsize, .dev_handle = ptr, .offset = 0 }; starpu_data_register(handleptr, home_node, &matrix_interface, &starpu_interface_matrix_ops); } void starpu_matrix_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset, uint32_t ld) { struct starpu_matrix_interface *matrix_interface = starpu_data_get_interface_on_node(handle, node); starpu_data_ptr_register(handle, node); matrix_interface->ptr = ptr; matrix_interface->dev_handle = dev_handle; matrix_interface->offset = offset; matrix_interface->ld = ld; } static uint32_t footprint_matrix_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_matrix_get_nx(handle), starpu_matrix_get_ny(handle)); } static int matrix_compare(void *data_interface_a, void *data_interface_b) { struct starpu_matrix_interface *matrix_a = (struct starpu_matrix_interface *) data_interface_a; struct starpu_matrix_interface *matrix_b = (struct starpu_matrix_interface *) data_interface_b; /* Two matricess are considered compatible if they have the same size */ return ((matrix_a->nx == matrix_b->nx) && (matrix_a->ny == matrix_b->ny) && (matrix_a->elemsize == matrix_b->elemsize)); } static void display_matrix_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, 0); fprintf(f, "%u\t%u\t", matrix_interface->nx, matrix_interface->ny); } static size_t matrix_interface_get_size(starpu_data_handle_t handle) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, 0); size_t size; size = (size_t)matrix_interface->nx*matrix_interface->ny*matrix_interface->elemsize; return size; } /* offer an access to the data parameters */ uint32_t starpu_matrix_get_nx(starpu_data_handle_t handle) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, 0); 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, 0); return matrix_interface->ny; } uint32_t starpu_matrix_get_local_ld(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); return matrix_interface->ld; } uintptr_t starpu_matrix_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) starpu_data_get_interface_on_node(handle, node); 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, 0); return matrix_interface->elemsize; } /* memory allocation/deallocation primitives for the matrix interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_matrix_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr = 0, handle; struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) data_interface_; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; uint32_t ld = nx; // by default size_t elemsize = matrix_interface->elemsize; starpu_ssize_t allocated_memory; handle = starpu_malloc_on_node(dst_node, nx*ny*elemsize); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; allocated_memory = (size_t)nx*ny*elemsize; /* update the data properly in consequence */ matrix_interface->ptr = addr; matrix_interface->dev_handle = handle; matrix_interface->offset = 0; matrix_interface->ld = ld; return allocated_memory; } static void free_matrix_buffer_on_node(void *data_interface, unsigned node) { struct starpu_matrix_interface *matrix_interface = (struct starpu_matrix_interface *) data_interface; uint32_t nx = matrix_interface->nx; uint32_t ny = matrix_interface->ny; size_t elemsize = matrix_interface->elemsize; starpu_free_on_node(node, matrix_interface->dev_handle, nx*ny*elemsize); } #ifdef STARPU_USE_CUDA static int copy_cuda_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, enum cudaMemcpyKind kind, int is_async, cudaStream_t stream) { struct starpu_matrix_interface *src_matrix = src_interface; struct starpu_matrix_interface *dst_matrix = dst_interface; size_t elemsize = src_matrix->elemsize; cudaError_t cures; if (is_async) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy2DAsync((char *)dst_matrix->ptr, dst_matrix->ld*elemsize, (char *)src_matrix->ptr, src_matrix->ld*elemsize, src_matrix->nx*elemsize, src_matrix->ny, kind, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (!cures) return -EAGAIN; } cures = cudaMemcpy2D((char *)dst_matrix->ptr, dst_matrix->ld*elemsize, (char *)src_matrix->ptr, src_matrix->ld*elemsize, src_matrix->nx*elemsize, src_matrix->ny, kind); if (STARPU_UNLIKELY(cures)) { int ret = 0; unsigned y; uint32_t nx = dst_matrix->nx; uint32_t ny = dst_matrix->ny; uint32_t ld_src = src_matrix->ld; uint32_t ld_dst = dst_matrix->ld; if (ld_src == nx && ld_dst == nx) { /* Optimize unpartitioned and y-partitioned cases */ if (starpu_interface_copy(src_matrix->dev_handle, src_matrix->offset, src_node, dst_matrix->dev_handle, dst_matrix->offset, dst_node, nx*ny*elemsize, (void*)(uintptr_t)is_async)) ret = -EAGAIN; } else { for (y = 0; y < ny; y++) { uint32_t src_offset = y*ld_src*elemsize; uint32_t dst_offset = y*ld_dst*elemsize; if (starpu_interface_copy(src_matrix->dev_handle, src_matrix->offset + src_offset, src_node, dst_matrix->dev_handle, dst_matrix->offset + dst_offset, dst_node, nx*elemsize, (void*)(uintptr_t)is_async)) ret = -EAGAIN; } } if (ret == -EAGAIN) return ret; if (ret) STARPU_CUDA_REPORT_ERROR(cures); } _STARPU_TRACE_DATA_COPY(src_node, dst_node, (size_t)src_matrix->nx*src_matrix->ny*src_matrix->elemsize); return 0; } #ifndef BUGGED_MEMCPY3D static int copy_cuda_peer(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, int is_async, cudaStream_t stream) { #ifdef HAVE_CUDA_MEMCPY_PEER struct starpu_matrix_interface *src_matrix = src_interface; struct starpu_matrix_interface *dst_matrix = dst_interface; size_t elemsize = src_matrix->elemsize; cudaError_t cures; int src_dev = _starpu_memory_node_get_devid(src_node); int dst_dev = _starpu_memory_node_get_devid(dst_node); struct cudaMemcpy3DPeerParms p; memset(&p, 0, sizeof(p)); p.srcDevice = src_dev; p.dstDevice = dst_dev; p.srcPtr = make_cudaPitchedPtr((char *)src_matrix->ptr, src_matrix->ld * elemsize, src_matrix->nx, src_matrix->ny); p.dstPtr = make_cudaPitchedPtr((char *)dst_matrix->ptr, dst_matrix->ld * elemsize, dst_matrix->nx, dst_matrix->ny); p.extent = make_cudaExtent(src_matrix->nx * elemsize, src_matrix->ny, 1); if (is_async) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cures = cudaMemcpy3DPeerAsync(&p, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (!cures) return -EAGAIN; } cures = cudaMemcpy3DPeer(&p); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); _STARPU_TRACE_DATA_COPY(src_node, dst_node, (size_t)src_matrix->nx*src_matrix->ny*src_matrix->elemsize); return 0; #else STARPU_ABORT_MSG("CUDA memcpy 3D peer not available, but core triggered one ?!"); #endif } #endif static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost, 0, 0); } static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice, 0, 0); } static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { if (src_node == dst_node) return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice, 0, 0); else #ifdef BUGGED_MEMCPY3D STARPU_ABORT_MSG("CUDA memcpy 3D peer not available, but core triggered one?!"); #else return copy_cuda_peer(src_interface, src_node, dst_interface, dst_node, 0, 0); #endif } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost, 1, stream); } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice, 1, stream); } #ifndef BUGGED_MEMCPY3D static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream) { if (src_node == dst_node) return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice, 1, stream); else return copy_cuda_peer(src_interface, src_node, dst_interface, dst_node, 1, stream); } #endif #endif // STARPU_USE_CUDA #ifdef STARPU_USE_OPENCL static int copy_opencl_common(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { struct starpu_matrix_interface *src_matrix = src_interface; struct starpu_matrix_interface *dst_matrix = dst_interface; int ret; STARPU_ASSERT_MSG((src_matrix->ld == src_matrix->nx) && (dst_matrix->ld == dst_matrix->nx), "XXX non contiguous buffers are not properly supported in OpenCL yet. (TODO)"); ret = starpu_opencl_copy_async_sync(src_matrix->dev_handle, src_matrix->offset, src_node, dst_matrix->dev_handle, dst_matrix->offset, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize, event); _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize); return ret; } static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_opencl_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { return copy_opencl_common(src_interface, src_node, dst_interface, dst_node, event); } static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } #endif /* as not all platform easily have a lib installed ... */ 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_matrix_interface *src_matrix = (struct starpu_matrix_interface *) src_interface; struct starpu_matrix_interface *dst_matrix = (struct starpu_matrix_interface *) dst_interface; unsigned y; 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; uintptr_t ptr_src = src_matrix->ptr; uintptr_t ptr_dst = dst_matrix->ptr; for (y = 0; y < ny; y++) { uint32_t src_offset = y*ld_src*elemsize; uint32_t dst_offset = y*ld_dst*elemsize; memcpy((void *)(ptr_dst + dst_offset), (void *)(ptr_src + src_offset), nx*elemsize); } _STARPU_TRACE_DATA_COPY(src_node, dst_node, (size_t)nx*ny*elemsize); return 0; } starpu-1.1.5/src/datawizard/interfaces/csr_interface.c0000644000373600000000000002271212571536574020010 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods csr_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_csr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_csr_buffer_on_node(void *data_interface_, unsigned dst_node); static void free_csr_buffer_on_node(void *data_interface, unsigned node); static size_t csr_interface_get_size(starpu_data_handle_t handle); static int csr_compare(void *data_interface_a, void *data_interface_b); static uint32_t footprint_csr_interface_crc32(starpu_data_handle_t handle); static struct starpu_data_interface_ops 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, }; 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->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, unsigned 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 = { .nnz = nnz, .nrow = nrow, .nzval = nzval, .colind = colind, .rowptr = rowptr, .firstentry = firstentry, .elemsize = elemsize }; starpu_data_register(handleptr, home_node, &csr_interface, &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, 0); 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, 0); 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, 0); 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, 0); return csr_interface->elemsize; } uintptr_t starpu_csr_get_local_nzval(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); return csr_interface->nzval; } uint32_t *starpu_csr_get_local_colind(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); return csr_interface->colind; } uint32_t *starpu_csr_get_local_rowptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) starpu_data_get_interface_on_node(handle, node); return csr_interface->rowptr; } static size_t csr_interface_get_size(starpu_data_handle_t handle) { size_t size; uint32_t nnz = starpu_csr_get_nnz(handle); uint32_t nrow = starpu_csr_get_nrow(handle); size_t elemsize = starpu_csr_get_elemsize(handle); size = nnz*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); return size; } /* memory allocation/deallocation primitives for the BLAS interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_csr_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr_nzval = 0; uint32_t *addr_colind = NULL, *addr_rowptr = NULL; starpu_ssize_t allocated_memory; /* we need the 3 arrays to be allocated */ struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) data_interface_; uint32_t nnz = csr_interface->nnz; uint32_t nrow = csr_interface->nrow; size_t elemsize = csr_interface->elemsize; addr_nzval = starpu_malloc_on_node(dst_node, nnz*elemsize); if (!addr_nzval) goto fail_nzval; addr_colind = (uint32_t*) starpu_malloc_on_node(dst_node, nnz*sizeof(uint32_t)); if (!addr_colind) goto fail_colind; addr_rowptr = (uint32_t*) starpu_malloc_on_node(dst_node, (nrow+1)*sizeof(uint32_t)); if (!addr_rowptr) goto fail_rowptr; /* allocation succeeded */ allocated_memory = nnz*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); /* update the data properly in consequence */ csr_interface->nzval = addr_nzval; csr_interface->colind = addr_colind; csr_interface->rowptr = addr_rowptr; return allocated_memory; fail_rowptr: starpu_free_on_node(dst_node, (uintptr_t) addr_colind, nnz*sizeof(uint32_t)); fail_colind: starpu_free_on_node(dst_node, addr_nzval, nnz*elemsize); fail_nzval: /* allocation failed */ return -ENOMEM; } static void free_csr_buffer_on_node(void *data_interface, unsigned node) { struct starpu_csr_interface *csr_interface = (struct starpu_csr_interface *) data_interface; uint32_t nnz = csr_interface->nnz; uint32_t nrow = csr_interface->nrow; size_t elemsize = csr_interface->elemsize; starpu_free_on_node(node, csr_interface->nzval, nnz*elemsize); starpu_free_on_node(node, (uintptr_t) csr_interface->colind, nnz*sizeof(uint32_t)); starpu_free_on_node(node, (uintptr_t) csr_interface->rowptr, (nrow+1)*sizeof(uint32_t)); } /* as not all platform easily have a BLAS lib installed ... */ static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_csr_interface *src_csr = (struct starpu_csr_interface *) src_interface; struct starpu_csr_interface *dst_csr = (struct starpu_csr_interface *) dst_interface; uint32_t nnz = src_csr->nnz; uint32_t nrow = src_csr->nrow; size_t elemsize = src_csr->elemsize; int ret = 0; if (starpu_interface_copy(src_csr->nzval, 0, src_node, dst_csr->nzval, 0, dst_node, nnz*elemsize, async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_csr->colind, 0, src_node, (uintptr_t)dst_csr->colind, 0, dst_node, nnz*sizeof(uint32_t), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_csr->rowptr, 0, src_node, (uintptr_t)dst_csr->rowptr, 0, dst_node, (nrow+1)*sizeof(uint32_t), async_data)) ret = -EAGAIN; _STARPU_TRACE_DATA_COPY(src_node, dst_node, nnz*elemsize + (nnz+nrow+1)*sizeof(uint32_t)); return ret; } starpu-1.1.5/src/datawizard/interfaces/vector_interface.c0000644000373600000000000002041512571536574020521 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods vector_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_vector_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_vector_buffer_on_node(void *data_interface_, unsigned dst_node); static void *vector_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_vector_buffer_on_node(void *data_interface, unsigned node); static size_t vector_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_vector_interface_crc32(starpu_data_handle_t handle); static int vector_compare(void *data_interface_a, void *data_interface_b); static void display_vector_interface(starpu_data_handle_t handle, FILE *f); static struct starpu_data_interface_ops interface_vector_ops = { .register_data_handle = register_vector_handle, .allocate_data_on_node = allocate_vector_buffer_on_node, .handle_to_pointer = vector_handle_to_pointer, .free_data_on_node = free_vector_buffer_on_node, .copy_methods = &vector_copy_data_methods_s, .get_size = vector_interface_get_size, .footprint = footprint_vector_interface_crc32, .compare = vector_compare, .interfaceid = STARPU_VECTOR_INTERFACE_ID, .interface_size = sizeof(struct starpu_vector_interface), .display = display_vector_interface, }; static void *vector_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); return (void*) vector_interface->ptr; } static void register_vector_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_vector_interface *local_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->ptr = vector_interface->ptr; local_interface->dev_handle = vector_interface->dev_handle; local_interface->offset = vector_interface->offset; } else { local_interface->ptr = 0; local_interface->dev_handle = 0; local_interface->offset = 0; } local_interface->nx = vector_interface->nx; local_interface->elemsize = vector_interface->elemsize; } } /* declare a new data with the vector interface */ void starpu_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 = { .ptr = ptr, .nx = nx, .elemsize = elemsize, .dev_handle = ptr, .offset = 0 }; starpu_data_register(handleptr, home_node, &vector, &interface_vector_ops); } void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset) { struct starpu_vector_interface *vector_interface = starpu_data_get_interface_on_node(handle, node); starpu_data_ptr_register(handle, node); vector_interface->ptr = ptr; vector_interface->dev_handle = dev_handle; vector_interface->offset = offset; } static uint32_t footprint_vector_interface_crc32(starpu_data_handle_t handle) { return starpu_hash_crc32c_be(starpu_vector_get_nx(handle), 0); } static int vector_compare(void *data_interface_a, void *data_interface_b) { struct starpu_vector_interface *vector_a = (struct starpu_vector_interface *) data_interface_a; struct starpu_vector_interface *vector_b = (struct starpu_vector_interface *) data_interface_b; /* Two vectors are considered compatible if they have the same size */ return ((vector_a->nx == vector_b->nx) && (vector_a->elemsize == vector_b->elemsize)); } static void display_vector_interface(starpu_data_handle_t handle, FILE *f) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, 0); fprintf(f, "%u\t", vector_interface->nx); } 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, 0); size = vector_interface->nx*vector_interface->elemsize; return size; } /* offer an access to the data parameters */ uint32_t starpu_vector_get_nx(starpu_data_handle_t handle) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, 0); return vector_interface->nx; } uintptr_t starpu_vector_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) starpu_data_get_interface_on_node(handle, node); 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, 0); return vector_interface->elemsize; } /* memory allocation/deallocation primitives for the vector interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_vector_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr = 0, handle; struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface_; uint32_t nx = vector_interface->nx; size_t elemsize = vector_interface->elemsize; starpu_ssize_t allocated_memory; handle = starpu_malloc_on_node(dst_node, nx*elemsize); if (!handle) return -ENOMEM; if (starpu_node_get_kind(dst_node) != STARPU_OPENCL_RAM) addr = handle; allocated_memory = nx*elemsize; /* update the data properly in consequence */ vector_interface->ptr = addr; vector_interface->dev_handle = handle; vector_interface->offset = 0; return allocated_memory; } static void free_vector_buffer_on_node(void *data_interface, unsigned node) { struct starpu_vector_interface *vector_interface = (struct starpu_vector_interface *) data_interface; uint32_t nx = vector_interface->nx; size_t elemsize = vector_interface->elemsize; starpu_free_on_node(node, vector_interface->dev_handle, nx*elemsize); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_vector_interface *src_vector = src_interface; struct starpu_vector_interface *dst_vector = dst_interface; int ret; ret = starpu_interface_copy(src_vector->dev_handle, src_vector->offset, src_node, dst_vector->dev_handle, dst_vector->offset, dst_node, src_vector->nx*src_vector->elemsize, async_data); _STARPU_TRACE_DATA_COPY(src_node, dst_node, src_vector->nx*src_vector->elemsize); return ret; } starpu-1.1.5/src/datawizard/interfaces/multiformat_interface.c0000644000373600000000000005467012571536574021574 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2012 Institut National de Recherche en Informatique et Automatique * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 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 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 = 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 }; static void register_multiformat_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_multiformat_buffer_on_node(void *data_interface_, unsigned dst_node); static void *multiformat_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_multiformat_buffer_on_node(void *data_interface, unsigned node); static size_t multiformat_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_multiformat_interface_crc32(starpu_data_handle_t handle); static int multiformat_compare(void *data_interface_a, void *data_interface_b); static void display_multiformat_interface(starpu_data_handle_t handle, FILE *f); static uint32_t starpu_multiformat_get_nx(starpu_data_handle_t handle); static struct starpu_multiformat_data_interface_ops* get_mf_ops(void *data_interface) { struct starpu_multiformat_interface *mf; mf = (struct starpu_multiformat_interface *) data_interface; return mf->ops; } static struct starpu_data_interface_ops interface_multiformat_ops = { .register_data_handle = register_multiformat_handle, .allocate_data_on_node = allocate_multiformat_buffer_on_node, .handle_to_pointer = multiformat_handle_to_pointer, .free_data_on_node = free_multiformat_buffer_on_node, .copy_methods = &multiformat_copy_data_methods_s, .get_size = multiformat_interface_get_size, .footprint = footprint_multiformat_interface_crc32, .compare = multiformat_compare, .interfaceid = STARPU_MULTIFORMAT_INTERFACE_ID, .interface_size = sizeof(struct starpu_multiformat_interface), .display = display_multiformat_interface, .is_multiformat = 1, .get_mf_ops = get_mf_ops }; static void *multiformat_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_multiformat_interface *multiformat_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, node); switch(starpu_node_get_kind(node)) { case STARPU_CPU_RAM: return multiformat_interface->cpu_ptr; #ifdef STARPU_USE_CUDA case STARPU_CUDA_RAM: return multiformat_interface->cuda_ptr; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_RAM: return multiformat_interface->opencl_ptr; #endif default: STARPU_ABORT(); } return NULL; } static void register_multiformat_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { struct starpu_multiformat_interface *multiformat_interface; multiformat_interface = (struct starpu_multiformat_interface *) data_interface; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct starpu_multiformat_interface *local_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, node); if (node == home_node) { local_interface->cpu_ptr = multiformat_interface->cpu_ptr; #ifdef STARPU_USE_CUDA local_interface->cuda_ptr = multiformat_interface->cuda_ptr; #endif #ifdef STARPU_USE_OPENCL local_interface->opencl_ptr = multiformat_interface->opencl_ptr; #endif } 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 = multiformat_interface->nx; local_interface->ops = multiformat_interface->ops; } } void starpu_multiformat_data_register(starpu_data_handle_t *handleptr, unsigned home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops) { _starpu_codelet_check_deprecated_fields(format_ops->cpu_to_opencl_cl); _starpu_codelet_check_deprecated_fields(format_ops->opencl_to_cpu_cl); _starpu_codelet_check_deprecated_fields(format_ops->cpu_to_cuda_cl); _starpu_codelet_check_deprecated_fields(format_ops->cuda_to_cpu_cl); struct starpu_multiformat_interface multiformat = { .cpu_ptr = ptr, .cuda_ptr = NULL, .opencl_ptr = NULL, .nx = nobjects, .ops = format_ops }; starpu_data_register(handleptr, home_node, &multiformat, &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 ); } 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, 0); 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, 0); 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, 0); 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 return allocated_memory; #ifdef STARPU_USE_OPENCL fail_opencl: #ifdef STARPU_USE_CUDA starpu_free_on_node(dst_node, (uintptr_t) multiformat_interface->cuda_ptr, multiformat_interface->nx * multiformat_interface->ops->cuda_elemsize); #endif #endif #ifdef STARPU_USE_CUDA 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 } /* * Copy methods */ static int copy_ram_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(dst_multiformat->ops != NULL); size_t size = dst_multiformat->nx * dst_multiformat->ops->cpu_elemsize; memcpy(dst_multiformat->cpu_ptr, src_multiformat->cpu_ptr, size); return 0; } #ifdef STARPU_USE_CUDA static int copy_cuda_common(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, enum cudaMemcpyKind kind) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; size_t size; cudaError_t status; switch (kind) { case cudaMemcpyHostToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; if (src_multiformat->cuda_ptr == NULL) { src_multiformat->cuda_ptr = malloc(size); if (src_multiformat->cuda_ptr == NULL) return -ENOMEM; } status = cudaMemcpy(dst_multiformat->cpu_ptr, src_multiformat->cpu_ptr, size, kind); if (STARPU_UNLIKELY(status)) { STARPU_CUDA_REPORT_ERROR(status); } break; } case cudaMemcpyDeviceToHost: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpy(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } case cudaMemcpyDeviceToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpy(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } default: STARPU_ABORT(); } return 0; } static int copy_ram_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyHostToDevice); } static int copy_cuda_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToHost); } static int copy_cuda_common_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, cudaStream_t stream, enum cudaMemcpyKind kind) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; size_t size; cudaError_t status; switch (kind) { case cudaMemcpyHostToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; if (src_multiformat->cuda_ptr == NULL) { src_multiformat->cuda_ptr = malloc(size); if (src_multiformat->cuda_ptr == NULL) return -ENOMEM; } status = cudaMemcpyAsync(dst_multiformat->cpu_ptr, src_multiformat->cpu_ptr, size, kind, stream); if (STARPU_UNLIKELY(status)) { STARPU_CUDA_REPORT_ERROR(status); } break; } case cudaMemcpyDeviceToHost: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpy(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } case cudaMemcpyDeviceToDevice: { size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; status = cudaMemcpyAsync(dst_multiformat->cuda_ptr, src_multiformat->cuda_ptr, size, kind, stream); if (STARPU_UNLIKELY(status)) STARPU_CUDA_REPORT_ERROR(status); break; } default: STARPU_ABORT(); } return 0; } static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cudaStream_t stream) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyHostToDevice); } static int copy_cuda_to_ram_async(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node, cudaStream_t stream) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToHost); } #ifdef HAVE_CUDA_MEMCPY_PEER static int copy_cuda_peer_common(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(src_multiformat->ops != NULL); cudaError_t status; int size = src_multiformat->nx * src_multiformat->ops->cuda_elemsize; int src_dev = _starpu_memory_node_get_devid(src_node); int dst_dev = _starpu_memory_node_get_devid(dst_node); if (stream) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); status = cudaMemcpyPeerAsync(dst_multiformat->cuda_ptr, dst_dev, src_multiformat->cuda_ptr, src_dev, size, stream); _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); /* All good ! Still, returning -EAGAIN, because we will need to check the transfert completion later */ if (status == cudaSuccess) return -EAGAIN; } /* Either a synchronous transfert was requested, or the asynchronous one failed. */ status = cudaMemcpyPeer(dst_multiformat->cuda_ptr, dst_dev, src_multiformat->cuda_ptr, src_dev, size); if (STARPU_UNLIKELY(status != cudaSuccess)) STARPU_CUDA_REPORT_ERROR(status); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return 0; } #endif static int copy_cuda_to_cuda(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { if (src_node == dst_node) { return copy_cuda_common(src_interface, src_node, dst_interface, dst_node, cudaMemcpyDeviceToDevice); } else { #ifdef HAVE_CUDA_MEMCPY_PEER return copy_cuda_peer_common(src_interface, src_node, dst_interface, dst_node, NULL); #else STARPU_ABORT(); #endif } } static int copy_cuda_to_cuda_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cudaStream_t stream) { if (src_node == dst_node) { return copy_cuda_common_async(src_interface, src_node, dst_interface, dst_node, stream, cudaMemcpyDeviceToDevice); } else { #ifdef HAVE_CUDA_MEMCPY_PEER return copy_cuda_peer_common(src_interface, src_node, dst_interface, dst_node, stream); #else STARPU_ABORT(); #endif } } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { int err, ret; size_t size; struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(src_multiformat->ops != NULL); size = src_multiformat->nx * src_multiformat->ops->opencl_elemsize; err = starpu_opencl_copy_ram_to_opencl(src_multiformat->cpu_ptr, src_node, (cl_mem) dst_multiformat->cpu_ptr, dst_node, size, 0, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return ret; } static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event) { int err, ret; size_t size; struct starpu_multiformat_interface *src_multiformat; struct starpu_multiformat_interface *dst_multiformat; src_multiformat = (struct starpu_multiformat_interface *) src_interface; dst_multiformat = (struct starpu_multiformat_interface *) dst_interface; STARPU_ASSERT(src_multiformat != NULL); STARPU_ASSERT(dst_multiformat != NULL); STARPU_ASSERT(src_multiformat->ops != NULL); STARPU_ASSERT(dst_multiformat->ops != NULL); size = src_multiformat->nx * src_multiformat->ops->opencl_elemsize; if (dst_multiformat->opencl_ptr == NULL) { /* XXX : it is weird that we might have to allocate memory here... */ dst_multiformat->opencl_ptr = malloc(dst_multiformat->nx * dst_multiformat->ops->opencl_elemsize); } err = starpu_opencl_copy_opencl_to_ram((cl_mem)src_multiformat->opencl_ptr, src_node, dst_multiformat->opencl_ptr, dst_node, size, 0, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return ret; } static int copy_ram_to_opencl(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_ram_to_opencl_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_ram(void *src_interface, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *dst_interface, unsigned dst_node STARPU_ATTRIBUTE_UNUSED) { return copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL); } static int copy_opencl_to_opencl(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node) { (void) src_interface; (void) dst_interface; (void) src_node; (void) dst_node; STARPU_ASSERT_MSG(0, "XXX multiformat copy OpenCL-OpenCL not supported yet (TODO)"); return 0; } #endif starpu-1.1.5/src/datawizard/interfaces/csr_filters.c0000644000373600000000000000436612571536574017525 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_csr_filter_vertical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_csr_interface *csr_father = (struct starpu_csr_interface *) father_interface; struct starpu_csr_interface *csr_child = (struct starpu_csr_interface *) child_interface; uint32_t nrow = csr_father->nrow; size_t elemsize = csr_father->elemsize; uint32_t firstentry = csr_father->firstentry; uint32_t chunk_size = (nrow + nchunks - 1)/nchunks; uint32_t *rowptr = csr_father->rowptr; uint32_t first_index = id*chunk_size - firstentry; uint32_t local_firstentry = rowptr[first_index]; uint32_t child_nrow = STARPU_MIN(chunk_size, nrow - id*chunk_size); /* TODO: the formula for the chunk size is probably wrong: we should * probably do this instead, and write a test. _starpu_filter_nparts_compute_chunk_size_and_offset(nrow, nparts, elemsize, id, 1, &chunk_size, NULL); */ uint32_t local_nnz = rowptr[first_index + child_nrow] - rowptr[first_index]; 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.1.5/src/datawizard/interfaces/block_filters.c0000644000373600000000000002150312571536574020020 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * Copyright (C) 2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_block_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nx, "%u parts for %u elements", nparts, nx); uint32_t chunk_size; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nparts, elemsize, id, 1, &chunk_size, &offset); block_child->nx = chunk_size; block_child->ny = ny; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; /* actual number of elements */ uint32_t nx = block_father->nx - 2 * shadow_size; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nx, "%u parts for %u elements", nparts, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nparts, elemsize, id, 1, &child_nx, &offset); block_child->nx = child_nx + 2 * shadow_size; block_child->ny = ny; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= ny, "%u parts for %u elements", nparts, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nparts, elemsize, id, block_father->ldy, &child_ny, &offset); block_child->nx = nx; block_child->ny = child_ny; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; uint32_t nx = block_father->nx; /* actual number of elements */ uint32_t ny = block_father->ny - 2 * shadow_size; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= ny, "%u parts for %u elements", nparts, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nparts, elemsize, id, block_father->ldy, &child_ny, &offset); block_child->nx = nx; block_child->ny = child_ny + 2 * shadow_size; block_child->nz = nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_depth_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; uint32_t nz = block_father->nz; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nz, "%u parts for %u elements", nparts, nz); uint32_t child_nz; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nz, nparts, elemsize, id, block_father->ldz, &child_nz, &offset); block_child->nx = nx; block_child->ny = ny; block_child->nz = child_nz; block_child->elemsize = elemsize; if (block_father->dev_handle) { if (block_father->ptr) block_child->ptr = block_father->ptr + offset; block_child->ldy = block_father->ldy; block_child->ldz = block_father->ldz; block_child->dev_handle = block_father->dev_handle; block_child->offset = block_father->offset + offset; } } void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nparts) { struct starpu_block_interface *block_father = (struct starpu_block_interface *) father_interface; struct starpu_block_interface *block_child = (struct starpu_block_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; uint32_t nx = block_father->nx; uint32_t ny = block_father->ny; /* actual number of elements */ uint32_t nz = block_father->nz - 2 * shadow_size; size_t elemsize = block_father->elemsize; STARPU_ASSERT_MSG(nparts <= nz, "%u parts for %u elements", nparts, nz); uint32_t child_nz; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nz, nparts, elemsize, id, block_father->ldz, &child_nz, &offset); 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.1.5/src/datawizard/interfaces/data_interface.h0000644000373600000000000000341212571536574020133 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2012, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATA_INTERFACE_H__ #define __DATA_INTERFACE_H__ #include #include /* Some data interfaces or filters use this interface internally */ extern struct starpu_data_interface_ops starpu_interface_matrix_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); 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; extern void _starpu_data_interface_shutdown(void) STARPU_ATTRIBUTE_INTERNAL; extern void _starpu_data_register_ram_pointer(starpu_data_handle_t handle, void *ptr) STARPU_ATTRIBUTE_INTERNAL; extern void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle) STARPU_ATTRIBUTE_INTERNAL; #define _starpu_data_is_multiformat_handle(handle) handle->ops->is_multiformat #endif // __DATA_INTERFACE_H__ starpu-1.1.5/src/datawizard/interfaces/matrix_filters.c0000644000373600000000000001347212571536574020240 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* * an example of a dummy partition function : blocks ... */ void starpu_matrix_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uint32_t nx = matrix_father->nx; uint32_t ny = matrix_father->ny; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); /* update the child's interface */ matrix_child->nx = child_nx; matrix_child->ny = ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } /* * an example of a dummy partition function : blocks ... */ void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; /* actual number of elements */ uint32_t nx = matrix_father->nx - 2 * shadow_size; uint32_t ny = matrix_father->ny; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); child_nx += 2 * shadow_size; /* update the child's interface */ matrix_child->nx = child_nx; matrix_child->ny = ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uint32_t nx = matrix_father->nx; uint32_t ny = matrix_father->ny; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= ny, "%u parts for %u elements", nchunks, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nchunks, elemsize, id, matrix_father->ld, &child_ny, &offset); matrix_child->nx = nx; matrix_child->ny = child_ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_matrix_interface *matrix_father = (struct starpu_matrix_interface *) father_interface; struct starpu_matrix_interface *matrix_child = (struct starpu_matrix_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; uint32_t nx = matrix_father->nx; /* actual number of elements */ uint32_t ny = matrix_father->ny - 2 * shadow_size; size_t elemsize = matrix_father->elemsize; STARPU_ASSERT_MSG(nchunks <= ny, "%u parts for %u elements", nchunks, ny); uint32_t child_ny; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(ny, nchunks, elemsize, id, matrix_father->ld, &child_ny, &offset); child_ny += 2 * shadow_size; matrix_child->nx = nx; matrix_child->ny = child_ny; matrix_child->elemsize = elemsize; /* is the information on this node valid ? */ if (matrix_father->dev_handle) { if (matrix_father->ptr) matrix_child->ptr = matrix_father->ptr + offset; matrix_child->ld = matrix_father->ld; matrix_child->dev_handle = matrix_father->dev_handle; matrix_child->offset = matrix_father->offset + offset; } } starpu-1.1.5/src/datawizard/interfaces/variable_interface.c0000644000373600000000000001521712571536574021010 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods variable_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_variable_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static starpu_ssize_t allocate_variable_buffer_on_node(void *data_interface_, unsigned dst_node); static void *variable_handle_to_pointer(starpu_data_handle_t data_handle, unsigned node); static void free_variable_buffer_on_node(void *data_interface, unsigned node); static size_t variable_interface_get_size(starpu_data_handle_t handle); static uint32_t footprint_variable_interface_crc32(starpu_data_handle_t handle); static int variable_compare(void *data_interface_a, void *data_interface_b); static void display_variable_interface(starpu_data_handle_t handle, FILE *f); static struct starpu_data_interface_ops interface_variable_ops = { .register_data_handle = register_variable_handle, .allocate_data_on_node = allocate_variable_buffer_on_node, .handle_to_pointer = variable_handle_to_pointer, .free_data_on_node = free_variable_buffer_on_node, .copy_methods = &variable_copy_data_methods_s, .get_size = variable_interface_get_size, .footprint = footprint_variable_interface_crc32, .compare = variable_compare, .interfaceid = STARPU_VARIABLE_INTERFACE_ID, .interface_size = sizeof(struct starpu_variable_interface), .display = display_variable_interface, }; static void *variable_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); return (void*) STARPU_VARIABLE_GET_PTR(starpu_data_get_interface_on_node(handle, node)); } static void register_variable_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface) { 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 = STARPU_VARIABLE_GET_PTR(data_interface); } else { local_interface->ptr = 0; } local_interface->elemsize = STARPU_VARIABLE_GET_ELEMSIZE(data_interface); } } /* declare a new data with the variable interface */ void starpu_variable_data_register(starpu_data_handle_t *handleptr, unsigned home_node, uintptr_t ptr, size_t elemsize) { struct starpu_variable_interface variable = { .ptr = ptr, .elemsize = elemsize }; starpu_data_register(handleptr, home_node, &variable, &interface_variable_ops); } 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, 0); fprintf(f, "%ld\t", (long)variable_interface->elemsize); } 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, 0); return variable_interface->elemsize; } uintptr_t starpu_variable_get_local_ptr(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); return STARPU_VARIABLE_GET_PTR(starpu_data_get_interface_on_node(handle, node)); } size_t starpu_variable_get_elemsize(starpu_data_handle_t handle) { return STARPU_VARIABLE_GET_ELEMSIZE(starpu_data_get_interface_on_node(handle, 0)); } /* memory allocation/deallocation primitives for the variable interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_variable_buffer_on_node(void *data_interface_, unsigned dst_node) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) data_interface_; size_t elemsize = variable_interface->elemsize; uintptr_t addr = starpu_malloc_on_node(dst_node, elemsize); if (!addr) return -ENOMEM; /* update the data properly in consequence */ variable_interface->ptr = addr; return elemsize; } static void free_variable_buffer_on_node(void *data_interface, unsigned node) { struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) data_interface; starpu_free_on_node(node, variable_interface->ptr, variable_interface->elemsize); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_variable_interface *src_variable = (struct starpu_variable_interface *) src_interface; struct starpu_variable_interface *dst_variable = (struct starpu_variable_interface *) dst_interface; size_t elemsize = dst_variable->elemsize; uintptr_t ptr_src = src_variable->ptr; uintptr_t ptr_dst = dst_variable->ptr; int ret; ret = starpu_interface_copy(ptr_src, 0, src_node, ptr_dst, 0, dst_node, elemsize, async_data); _STARPU_TRACE_DATA_COPY(src_node, dst_node, elemsize); return ret; } starpu-1.1.5/src/datawizard/interfaces/bcsr_interface.c0000644000373600000000000002444212571536574020154 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include /* * BCSR : blocked CSR, we use blocks of size (r x c) */ static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data); static const struct starpu_data_copy_methods bcsr_copy_data_methods_s = { .any_to_any = copy_any_to_any, }; static void register_bcsr_handle(starpu_data_handle_t handle, unsigned home_node, void *data_interface); static 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 struct starpu_data_interface_ops 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 }; 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->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, unsigned 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 = { .nzval = nzval, .colind = colind, .rowptr = rowptr, .nnz = nnz, .nrow = nrow, .firstentry = firstentry, .r = r, .c = c, .elemsize = elemsize }; starpu_data_register(handleptr, home_node, &bcsr_interface, &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, 0); 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, 0); 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, 0); 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, 0); 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, 0); 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, 0); return data_interface->elemsize; } uintptr_t starpu_bcsr_get_local_nzval(starpu_data_handle_t handle) { unsigned node; node = _starpu_memory_node_get_local_key(); STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node)); struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, node); return data_interface->nzval; } uint32_t *starpu_bcsr_get_local_colind(starpu_data_handle_t handle) { /* XXX 0 */ struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, 0); return data_interface->colind; } uint32_t *starpu_bcsr_get_local_rowptr(starpu_data_handle_t handle) { /* XXX 0 */ struct starpu_bcsr_interface *data_interface = (struct starpu_bcsr_interface *) starpu_data_get_interface_on_node(handle, 0); return data_interface->rowptr; } static size_t bcsr_interface_get_size(starpu_data_handle_t handle) { size_t size; uint32_t nnz = starpu_bcsr_get_nnz(handle); uint32_t nrow = starpu_bcsr_get_nrow(handle); uint32_t r = starpu_bcsr_get_r(handle); uint32_t c = starpu_bcsr_get_c(handle); size_t elemsize = starpu_bcsr_get_elemsize(handle); size = nnz*r*c*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); return size; } /* memory allocation/deallocation primitives for the BLAS interface */ /* returns the size of the allocated area */ static starpu_ssize_t allocate_bcsr_buffer_on_node(void *data_interface_, unsigned dst_node) { uintptr_t addr_nzval, addr_colind, addr_rowptr; starpu_ssize_t allocated_memory; /* we need the 3 arrays to be allocated */ struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) data_interface_; uint32_t nnz = bcsr_interface->nnz; uint32_t nrow = bcsr_interface->nrow; size_t elemsize = bcsr_interface->elemsize; uint32_t r = bcsr_interface->r; uint32_t c = bcsr_interface->c; addr_nzval = starpu_malloc_on_node(dst_node, nnz*r*c*elemsize); if (!addr_nzval) goto fail_nzval; addr_colind = starpu_malloc_on_node(dst_node, nnz*sizeof(uint32_t)); if (!addr_colind) goto fail_colind; addr_rowptr = starpu_malloc_on_node(dst_node, (nrow+1)*sizeof(uint32_t)); if (!addr_rowptr) goto fail_rowptr; /* allocation succeeded */ allocated_memory = nnz*r*c*elemsize + nnz*sizeof(uint32_t) + (nrow+1)*sizeof(uint32_t); /* update the data properly in consequence */ bcsr_interface->nzval = addr_nzval; bcsr_interface->colind = (uint32_t*) addr_colind; bcsr_interface->rowptr = (uint32_t*) addr_rowptr; return allocated_memory; fail_rowptr: starpu_free_on_node(dst_node, addr_colind, nnz*sizeof(uint32_t)); fail_colind: starpu_free_on_node(dst_node, addr_nzval, nnz*r*c*elemsize); fail_nzval: /* allocation failed */ return -ENOMEM; } static void free_bcsr_buffer_on_node(void *data_interface, unsigned node) { struct starpu_bcsr_interface *bcsr_interface = (struct starpu_bcsr_interface *) data_interface; uint32_t nnz = bcsr_interface->nnz; uint32_t nrow = bcsr_interface->nrow; size_t elemsize = bcsr_interface->elemsize; uint32_t r = bcsr_interface->r; uint32_t c = bcsr_interface->c; starpu_free_on_node(node, bcsr_interface->nzval, nnz*r*c*elemsize); starpu_free_on_node(node, (uintptr_t) bcsr_interface->colind, nnz*sizeof(uint32_t)); starpu_free_on_node(node, (uintptr_t) bcsr_interface->rowptr, (nrow+1)*sizeof(uint32_t)); } static int copy_any_to_any(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data) { struct starpu_bcsr_interface *src_bcsr = (struct starpu_bcsr_interface *) src_interface; struct starpu_bcsr_interface *dst_bcsr = (struct starpu_bcsr_interface *) dst_interface; uint32_t nnz = src_bcsr->nnz; uint32_t nrow = src_bcsr->nrow; size_t elemsize = src_bcsr->elemsize; uint32_t r = src_bcsr->r; uint32_t c = src_bcsr->c; int ret = 0; if (starpu_interface_copy(src_bcsr->nzval, 0, src_node, dst_bcsr->nzval, 0, dst_node, nnz*elemsize*r*c, async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_bcsr->colind, 0, src_node, (uintptr_t)dst_bcsr->colind, 0, dst_node, nnz*sizeof(uint32_t), async_data)) ret = -EAGAIN; if (starpu_interface_copy((uintptr_t)src_bcsr->rowptr, 0, src_node, (uintptr_t)dst_bcsr->rowptr, 0, dst_node, (nrow+1)*sizeof(uint32_t), async_data)) ret = -EAGAIN; _STARPU_TRACE_DATA_COPY(src_node, dst_node, nnz*elemsize*r*c + (nnz+nrow+1)*sizeof(uint32_t)); return ret; } starpu-1.1.5/src/datawizard/interfaces/vector_filters.c0000644000373600000000000001244412571536574020234 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include void starpu_vector_filter_block(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; uint32_t nx = vector_father->nx; size_t elemsize = vector_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); vector_child->nx = child_nx; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr + offset; vector_child->dev_handle = vector_father->dev_handle; vector_child->offset = vector_father->offset + offset; } } void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, STARPU_ATTRIBUTE_UNUSED struct starpu_data_filter *f, unsigned id, unsigned nchunks) { struct starpu_vector_interface *vector_father = (struct starpu_vector_interface *) father_interface; struct starpu_vector_interface *vector_child = (struct starpu_vector_interface *) child_interface; uintptr_t shadow_size = (uintptr_t) f->filter_arg_ptr; /* actual number of elements */ uint32_t nx = vector_father->nx - 2 * shadow_size; size_t elemsize = vector_father->elemsize; STARPU_ASSERT_MSG(nchunks <= nx, "%u parts for %u elements", nchunks, nx); uint32_t child_nx; size_t offset; _starpu_filter_nparts_compute_chunk_size_and_offset(nx, nchunks, elemsize, id, 1, &child_nx, &offset); child_nx += 2*shadow_size; vector_child->nx = child_nx; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr + offset; vector_child->dev_handle = vector_father->dev_handle; vector_child->offset = vector_father->offset + offset; } } void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, STARPU_ATTRIBUTE_UNUSED unsigned nchunks) { /* there cannot be more than 2 chunks */ STARPU_ASSERT_MSG(id < 2, "Only %d 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); /* this is the first child */ if (id == 0) { vector_child->nx = length_first; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr; vector_child->offset = vector_father->offset; vector_child->dev_handle = vector_father->dev_handle; } } else /* the second child */ { vector_child->nx = nx - length_first; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { if (vector_father->ptr) vector_child->ptr = vector_father->ptr + length_first*elemsize; vector_child->offset = vector_father->offset + length_first*elemsize; vector_child->dev_handle = vector_father->dev_handle; } } } void starpu_vector_filter_list(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; unsigned current_pos = 0; uint32_t chunk_size = length_tab[id]; vector_child->nx = chunk_size; vector_child->elemsize = elemsize; if (vector_father->dev_handle) { /* compute the current position */ 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.1.5/src/datawizard/interfaces/data_interface.c0000644000373600000000000005463012571536574020136 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 /* 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 struct handle_entry *registered_handles; static struct _starpu_spinlock registered_handles_lock; static int _data_interface_number = STARPU_MAX_INTERFACE_ID; 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); } void _starpu_data_interface_shutdown() { struct handle_entry *entry, *tmp; if (registered_handles) { _STARPU_DISP("[warning] The application has not unregistered all data handles.\n"); } _starpu_spin_destroy(®istered_handles_lock); HASH_ITER(hh, registered_handles, entry, tmp) { HASH_DEL(registered_handles, entry); free(entry); } registered_handles = 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; entry = (struct handle_entry *) malloc(sizeof(*entry)); STARPU_ASSERT(entry != NULL); entry->pointer = ptr; entry->handle = handle; _starpu_spin_lock(®istered_handles_lock); 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; _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, unsigned home_node, uint32_t wt_mask) { void *ptr; STARPU_ASSERT(handle); /* initialize the new lock */ _starpu_data_requester_list_init(&handle->req_list); handle->refcnt = 0; handle->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->root_handle = handle; handle->father_handle = NULL; handle->sibling_index = 0; /* could be anything for the root */ handle->depth = 1; /* the tree is just a node yet */ handle->mpi_data = NULL; /* invalid until set */ handle->is_not_important = 0; handle->sequential_consistency = starpu_data_get_default_sequential_consistency_flag(); STARPU_PTHREAD_MUTEX_INIT(&handle->sequential_consistency_mutex, NULL); handle->last_submitted_mode = STARPU_R; handle->last_sync_task = NULL; handle->last_submitted_accessors.task = NULL; handle->last_submitted_accessors.next = &handle->last_submitted_accessors; handle->last_submitted_accessors.prev = &handle->last_submitted_accessors; handle->post_sync_tasks = NULL; /* Tell helgrind that the race in _starpu_unlock_post_sync_tasks is fine */ STARPU_HG_DISABLE_CHECKING(handle->post_sync_tasks_cnt); handle->post_sync_tasks_cnt = 0; /* By default, there are no methods available to perform a reduction */ handle->redux_cl = NULL; handle->init_cl = NULL; handle->reduction_refcnt = 0; _starpu_data_requester_list_init(&handle->reduction_req_list); handle->reduction_tmp_handles = NULL; #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; /* 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 (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; } } 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->allocated = 0; replicate->automatically_allocated = 0; replicate->state = STARPU_INVALID; replicate->refcnt = 0; replicate->handle = handle; replicate->requested = 0; for (node = 0; node < STARPU_MAXNODES; node++) { replicate->request[node] = NULL; } /* Assuming being used for SCRATCH for now, patched when entering REDUX mode */ replicate->relaxed_coherency = 1; replicate->initialized = 0; replicate->memory_node = starpu_worker_get_memory_node(worker); /* duplicate the content of the interface on node 0 */ memcpy(replicate->data_interface, handle->per_node[0].data_interface, handle->ops->interface_size); } /* now the data is available ! */ _starpu_spin_unlock(&handle->header_lock); ptr = starpu_data_handle_to_pointer(handle, 0); if (ptr != NULL) { _starpu_data_register_ram_pointer(handle, ptr); } } 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; unsigned worker; /* Tell helgrind that our access to busy_count in * starpu_data_unregister is actually safe */ STARPU_HG_DISABLE_CHECKING(handle->busy_count); 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; replicate->data_interface = calloc(1, interfacesize); STARPU_ASSERT(replicate->data_interface); } unsigned nworkers = starpu_worker_get_count(); for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *replicate; replicate = &handle->per_worker[worker]; replicate->handle = handle; replicate->data_interface = calloc(1, interfacesize); STARPU_ASSERT(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_data_handle_t) calloc(1, sizeof(struct _starpu_data_state)); STARPU_ASSERT(handle); _starpu_data_handle_init(handle, interface_ops, mf_node); return handle; } void starpu_data_register(starpu_data_handle_t *handleptr, unsigned home_node, void *data_interface, struct starpu_data_interface_ops *ops) { starpu_data_handle_t handle = _starpu_data_handle_allocate(ops, home_node); STARPU_ASSERT(handleptr); *handleptr = handle; /* fill the interface fields with the appropriate method */ STARPU_ASSERT(ops->register_data_handle); ops->register_data_handle(handle, home_node, data_interface); _starpu_register_new_data(handle, home_node, 0); } 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, 0); starpu_data_register(handledst, -1, local_interface, handlesrc->ops); } void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node) { /* Check whether the operation is supported and the node has actually * been allocated. */ if (handle->ops->handle_to_pointer && starpu_data_test_if_allocated_on_node(handle, node)) { return handle->ops->handle_to_pointer(handle, node); } return NULL; } void *starpu_data_get_local_ptr(starpu_data_handle_t handle) { return starpu_data_handle_to_pointer(handle, _starpu_memory_node_get_local_key()); } /* * Stop monitoring a piece of data */ void _starpu_data_unregister_ram_pointer(starpu_data_handle_t handle) { const void *ram_ptr = starpu_data_handle_to_pointer(handle, 0); 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; _starpu_spin_lock(®istered_handles_lock); HASH_FIND_PTR(registered_handles, &ram_ptr, entry); STARPU_ASSERT(entry != NULL); HASH_DEL(registered_handles, entry); _starpu_spin_unlock(®istered_handles_lock); free(entry); } } void _starpu_data_free_interfaces(starpu_data_handle_t handle) { unsigned node; unsigned worker; unsigned nworkers = starpu_worker_get_count(); for (node = 0; node < STARPU_MAXNODES; node++) free(handle->per_node[node].data_interface); for (worker = 0; worker < nworkers; worker++) free(handle->per_worker[worker].data_interface); } 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. */ int _starpu_data_check_not_busy(starpu_data_handle_t handle) { if (!handle->busy_count && 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 (handle->lazy_unregister && handle->busy_count == 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_data_unregister_fetch_data_callback(void *_arg) { int ret; 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]; ret = _starpu_fetch_data_on_node(handle, replicate, STARPU_R, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); /* unlock the caller */ STARPU_PTHREAD_MUTEX_LOCK(&arg->mutex); arg->terminated = 1; STARPU_PTHREAD_COND_SIGNAL(&arg->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&arg->mutex); } /* Unregister the data handle, perhaps we don't need to update the home_node * (in that case coherent is set to 0) * nowait is for internal use when we already know for sure that we won't have to wait. */ static void _starpu_data_unregister(starpu_data_handle_t handle, unsigned coherent, unsigned nowait) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "data %p needs to be unpartitioned before unregistration", handle); STARPU_ASSERT(!(nowait && handle->busy_count != 0)); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency && !nowait) { STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_data_unregister must not be called from a task or callback, perhaps you can use starpu_data_unregister_submit instead"); /* If sequential consistency is enabled, wait until data is available */ _starpu_data_wait_until_available(handle, STARPU_RW, "starpu_data_unregister"); } if (coherent && !nowait) { STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_data_unregister must not be called from a task or callback, perhaps you can use starpu_data_unregister_submit instead"); /* Fetch data in the home of the data to ensure we have a valid copy * where we registered it */ int home_node = handle->home_node; if (home_node >= 0) { struct _starpu_unregister_callback_arg arg; arg.handle = handle; arg.memory_node = (unsigned)home_node; arg.terminated = 0; STARPU_PTHREAD_MUTEX_INIT(&arg.mutex, NULL); STARPU_PTHREAD_COND_INIT(&arg.cond, NULL); if (!_starpu_attempt_to_submit_data_request_from_apps(handle, STARPU_R, _starpu_data_unregister_fetch_data_callback, &arg)) { /* no one has locked this data yet, so we proceed immediately */ struct _starpu_data_replicate *home_replicate = &handle->per_node[home_node]; int ret = _starpu_fetch_data_on_node(handle, home_replicate, STARPU_R, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); } 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); _starpu_release_data_on_node(handle, 0, &handle->per_node[home_node]); } /* 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; format_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, 0); 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 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); } } _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); /* Wait for all requests to finish (notably WT requests) */ STARPU_PTHREAD_MUTEX_LOCK(&handle->busy_mutex); while (1) { /* Here helgrind would shout that this an unprotected access, * but this is actually fine: all threads who do busy_count-- * are supposed to call _starpu_data_check_not_busy, which will * wake us up through the busy_mutex/busy_cond. */ if (!handle->busy_count) break; /* This is woken by _starpu_data_check_not_busy, always called * after decrementing busy_count */ STARPU_PTHREAD_COND_WAIT(&handle->busy_cond, &handle->busy_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->busy_mutex); /* Wait for finished requests to release the handle */ _starpu_spin_lock(&handle->header_lock); size_t size = _starpu_data_get_size(handle); _starpu_data_unregister_ram_pointer(handle); /* Destroy the data now */ unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local = &handle->per_node[node]; /* free the data copy in a lazy fashion */ if (local->allocated && local->automatically_allocated) _starpu_request_mem_chunk_removal(handle, local, node, size); } unsigned worker; unsigned nworkers = starpu_worker_get_count(); for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *local = &handle->per_worker[worker]; /* free the data copy in a lazy fashion */ if (local->allocated && local->automatically_allocated) _starpu_request_mem_chunk_removal(handle, local, starpu_worker_get_memory_node(worker), size); } _starpu_data_free_interfaces(handle); _starpu_memory_stats_free(handle); _starpu_spin_unlock(&handle->header_lock); _starpu_spin_destroy(&handle->header_lock); _starpu_data_clear_implicit(handle); STARPU_PTHREAD_MUTEX_DESTROY(&handle->busy_mutex); STARPU_PTHREAD_COND_DESTROY(&handle->busy_cond); STARPU_PTHREAD_MUTEX_DESTROY(&handle->sequential_consistency_mutex); STARPU_HG_ENABLE_CHECKING(handle->post_sync_tasks_cnt); STARPU_HG_ENABLE_CHECKING(handle->busy_count); free(handle); } void starpu_data_unregister(starpu_data_handle_t handle) { STARPU_ASSERT_MSG(!handle->lazy_unregister, "data %p can not be unregistered twice", handle); if (handle->unregister_hook) { handle->unregister_hook(handle); } _starpu_data_unregister(handle, 1, 0); } void starpu_data_unregister_no_coherency(starpu_data_handle_t handle) { if (handle->unregister_hook) { handle->unregister_hook(handle); } _starpu_data_unregister(handle, 0, 0); } static void _starpu_data_unregister_submit_cb(void *arg) { starpu_data_handle_t handle = arg; _starpu_spin_lock(&handle->header_lock); handle->lazy_unregister = 1; /* The handle should be busy since we are working on it. * when data_acquire releases the handle, 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, -1); } void starpu_data_unregister_submit(starpu_data_handle_t handle) { STARPU_ASSERT_MSG(!handle->lazy_unregister, "data %p can not be unregistered twice", handle); if (handle->unregister_hook) { handle->unregister_hook(handle); } /* Wait for all task dependencies on this handle before putting it for free */ starpu_data_acquire_on_node_cb(handle, -1, STARPU_RW, _starpu_data_unregister_submit_cb, handle); } static void _starpu_data_invalidate(void *data) { starpu_data_handle_t handle = data; size_t size = _starpu_data_get_size(handle); _starpu_spin_lock(&handle->header_lock); unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local = &handle->per_node[node]; if (local->mc && local->allocated && local->automatically_allocated) { if (node == 0) _starpu_data_unregister_ram_pointer(handle); /* free the data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(handle, local, node, size); } local->state = STARPU_INVALID; } 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, -1); } void starpu_data_invalidate(starpu_data_handle_t handle) { STARPU_ASSERT(handle); starpu_data_acquire_on_node(handle, -1, STARPU_W); _starpu_data_invalidate(handle); } void starpu_data_invalidate_submit(starpu_data_handle_t handle) { STARPU_ASSERT(handle); starpu_data_acquire_on_node_cb(handle, -1, STARPU_W, _starpu_data_invalidate, handle); } 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(handle->ops->pack_data); return handle->ops->pack_data(handle, _starpu_memory_node_get_local_key(), ptr, count); } int starpu_data_unpack(starpu_data_handle_t handle, void *ptr, size_t count) { STARPU_ASSERT(handle->ops->unpack_data); int ret; ret = handle->ops->unpack_data(handle, _starpu_memory_node_get_local_key(), ptr, count); free(ptr); return ret; } size_t starpu_data_get_size(starpu_data_handle_t handle) { return handle->ops->get_size(handle); } starpu-1.1.5/src/datawizard/sort_data_handles.h0000644000373600000000000000234712571536575016544 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SORT_DATA_HANDLES_H__ #define __SORT_DATA_HANDLES_H__ #include #include #include #include #include #include #include /* To avoid deadlocks, we reorder the different buffers accessed to by the task * so that we always grab the rw-lock associated to the handles in the same * order. */ void _starpu_sort_task_handles(struct _starpu_data_descr descr[], unsigned nbuffers); #endif // SORT_DATA_HANDLES starpu-1.1.5/src/datawizard/user_interactions.c0000644000373600000000000004221712571536574016620 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 /* Explicitly ask StarPU to allocate room for a piece of data on the specified * memory node. */ int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node) { struct _starpu_data_request *r; STARPU_ASSERT(handle); _starpu_spin_lock(&handle->header_lock); r = _starpu_create_data_request(handle, NULL, &handle->per_node[node], node, STARPU_NONE, 0, 1); /* we do not increase the refcnt associated to the request since we are * not waiting for its termination */ _starpu_post_data_request(r, node); _starpu_spin_unlock(&handle->header_lock); return 0; } struct user_interaction_wrapper { starpu_data_handle_t handle; enum starpu_data_access_mode mode; int node; starpu_pthread_cond_t cond; starpu_pthread_mutex_t lock; unsigned finished; unsigned async; void (*callback)(void *); void (*callback_fetch_data)(void *); // called after fetch_data void *callback_arg; struct starpu_task *pre_sync_task; struct starpu_task *post_sync_task; }; /* * Non Blocking data request from application */ /* put the current value of the data into RAM */ static void _starpu_data_acquire_fetch_data_callback(void *arg) { struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; /* At that moment, the caller holds a reference to the piece of data. * We enqueue the "post" sync task in the list associated to the handle * so that it is submitted by the starpu_data_release * function. */ if (wrapper->post_sync_task) _starpu_add_post_sync_tasks(wrapper->post_sync_task, handle); wrapper->callback(wrapper->callback_arg); free(wrapper); } static void _starpu_data_acquire_continuation_non_blocking(void *arg) { int ret; struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; STARPU_ASSERT(handle); if (wrapper->node >= 0) { struct _starpu_data_replicate *replicate = &handle->per_node[wrapper->node]; ret = _starpu_fetch_data_on_node(handle, replicate, wrapper->mode, 0, 1, _starpu_data_acquire_fetch_data_callback, wrapper); STARPU_ASSERT(!ret); } else _starpu_data_acquire_fetch_data_callback(wrapper); } 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(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "Acquiring a partitioned data (%p) is not possible", handle); _STARPU_LOG_IN(); struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) malloc(sizeof(struct user_interaction_wrapper)); STARPU_ASSERT(wrapper); wrapper->handle = handle; wrapper->node = node; wrapper->mode = mode; wrapper->callback = callback; wrapper->callback_arg = arg; STARPU_PTHREAD_COND_INIT(&wrapper->cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper->lock, NULL); wrapper->finished = 0; wrapper->pre_sync_task = NULL; wrapper->post_sync_task = NULL; STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency) { struct starpu_task *new_task; wrapper->pre_sync_task = starpu_task_create(); 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->post_sync_task = starpu_task_create(); wrapper->post_sync_task->detach = 1; #ifdef STARPU_USE_FXT struct _starpu_job *job = _starpu_get_job_associated_to_task(wrapper->pre_sync_task); job->model_name = "acquire_cb_pre"; job = _starpu_get_job_associated_to_task(wrapper->post_sync_task); job->model_name = "acquire_cb_post"; #endif new_task = _starpu_detect_implicit_data_deps_with_handle(wrapper->pre_sync_task, wrapper->post_sync_task, &_starpu_get_job_associated_to_task(wrapper->post_sync_task)->implicit_dep_slot, handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } /* TODO detect if this is superflous */ int ret = _starpu_task_submit_internally(wrapper->pre_sync_task); STARPU_ASSERT(!ret); } else { 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_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg) { return starpu_data_acquire_on_node_cb(handle, 0, mode, callback, arg); } /* * Block 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); if (wrapper->node >= 0) { int ret; struct _starpu_data_replicate *replicate = &handle->per_node[wrapper->node]; ret = _starpu_fetch_data_on_node(handle, replicate, wrapper->mode, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); } /* continuation of starpu_data_acquire */ STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); wrapper->finished = 1; STARPU_PTHREAD_COND_SIGNAL(&wrapper->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); } /* The data must be released by calling starpu_data_release later on */ int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode) { STARPU_ASSERT(handle); STARPU_ASSERT_MSG(handle->nchildren == 0, "Acquiring a partitioned data is not possible"); _STARPU_LOG_IN(); /* unless asynchronous, it is forbidden to call this function from a callback or a codelet */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "Acquiring a data synchronously is not possible from a codelet or from a task callback, use starpu_data_acquire_cb instead."); if (_starpu_data_is_multiformat_handle(handle) && _starpu_handle_needs_conversion_task(handle, 0)) { struct starpu_task *task = _starpu_create_conversion_task(handle, 0); int ret; _starpu_spin_lock(&handle->header_lock); handle->refcnt--; handle->busy_count--; handle->mf_node = 0; _starpu_spin_unlock(&handle->header_lock); task->synchronous = 1; ret = _starpu_task_submit_internally(task); STARPU_ASSERT(!ret); } struct user_interaction_wrapper wrapper = { .handle = handle, .mode = mode, .node = node, .finished = 0 }; STARPU_PTHREAD_COND_INIT(&wrapper.cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper.lock, NULL); // _STARPU_DEBUG("TAKE sequential_consistency_mutex starpu_data_acquire\n"); STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency) { struct starpu_task *new_task; wrapper.pre_sync_task = starpu_task_create(); wrapper.pre_sync_task->detach = 0; wrapper.post_sync_task = starpu_task_create(); wrapper.post_sync_task->detach = 1; #ifdef STARPU_USE_FXT struct _starpu_job *job = _starpu_get_job_associated_to_task(wrapper.pre_sync_task); job->model_name = "acquire_pre"; job = _starpu_get_job_associated_to_task(wrapper.post_sync_task); job->model_name = "acquire_post"; #endif new_task = _starpu_detect_implicit_data_deps_with_handle(wrapper.pre_sync_task, wrapper.post_sync_task, &_starpu_get_job_associated_to_task(wrapper.post_sync_task)->implicit_dep_slot, handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } /* TODO detect if this is superflous */ wrapper.pre_sync_task->synchronous = 1; int ret = _starpu_task_submit_internally(wrapper.pre_sync_task); STARPU_ASSERT(!ret); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } /* we try to get the data, if we do not succeed immediately, we set a * callback function that will be executed automatically when the data is * available again, otherwise we fetch the data directly */ if (!_starpu_attempt_to_submit_data_request_from_apps(handle, mode, _starpu_data_acquire_continuation, &wrapper)) { if (node >= 0) { /* no one has locked this data yet, so we proceed immediately */ struct _starpu_data_replicate *replicate = &handle->per_node[node]; int ret = _starpu_fetch_data_on_node(handle, replicate, mode, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); } } else { STARPU_PTHREAD_MUTEX_LOCK(&wrapper.lock); while (!wrapper.finished) STARPU_PTHREAD_COND_WAIT(&wrapper.cond, &wrapper.lock); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper.lock); } STARPU_PTHREAD_COND_DESTROY(&wrapper.cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper.lock); /* At that moment, the caller holds a reference to the piece of data. * We enqueue the "post" sync task in the list associated to the handle * so that it is submitted by the starpu_data_release * function. */ if (sequential_consistency) _starpu_add_post_sync_tasks(wrapper.post_sync_task, handle); _STARPU_LOG_OUT(); return 0; } int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode) { return starpu_data_acquire_on_node(handle, 0, 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 (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } } void starpu_data_release(starpu_data_handle_t handle) { starpu_data_release_on_node(handle, 0); } static void _prefetch_data_on_node(void *arg) { struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) arg; starpu_data_handle_t handle = wrapper->handle; int ret; struct _starpu_data_replicate *replicate = &handle->per_node[wrapper->node]; ret = _starpu_fetch_data_on_node(handle, replicate, STARPU_R, wrapper->async, wrapper->async, NULL, NULL); STARPU_ASSERT(!ret); if (wrapper->async) free(wrapper); else { STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); wrapper->finished = 1; STARPU_PTHREAD_COND_SIGNAL(&wrapper->cond); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); } _starpu_spin_lock(&handle->header_lock); if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } static int _starpu_prefetch_data_on_node_with_mode(starpu_data_handle_t handle, unsigned node, unsigned async, enum starpu_data_access_mode mode) { 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"); struct user_interaction_wrapper *wrapper = (struct user_interaction_wrapper *) malloc(sizeof(*wrapper)); wrapper->handle = handle; wrapper->node = node; wrapper->async = async; STARPU_PTHREAD_COND_INIT(&wrapper->cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&wrapper->lock, NULL); wrapper->finished = 0; if (!_starpu_attempt_to_submit_data_request_from_apps(handle, mode, _prefetch_data_on_node, wrapper)) { /* we can immediately proceed */ struct _starpu_data_replicate *replicate = &handle->per_node[node]; STARPU_PTHREAD_COND_DESTROY(&wrapper->cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper->lock); free(wrapper); _starpu_fetch_data_on_node(handle, replicate, mode, async, async, NULL, NULL); /* remove the "lock"/reference */ _starpu_spin_lock(&handle->header_lock); if (!async) { /* Release our refcnt, like _starpu_release_data_on_node would do */ replicate->refcnt--; STARPU_ASSERT(replicate->refcnt >= 0); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; } /* In case there was a temporary handle (eg. used for reduction), this * handle may have requested to be destroyed when the data is released * */ if (!_starpu_notify_data_dependencies(handle)) _starpu_spin_unlock(&handle->header_lock); } else if (!async) { STARPU_PTHREAD_MUTEX_LOCK(&wrapper->lock); while (!wrapper->finished) STARPU_PTHREAD_COND_WAIT(&wrapper->cond, &wrapper->lock); STARPU_PTHREAD_MUTEX_UNLOCK(&wrapper->lock); STARPU_PTHREAD_COND_DESTROY(&wrapper->cond); STARPU_PTHREAD_MUTEX_DESTROY(&wrapper->lock); free(wrapper); } return 0; } int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async) { return _starpu_prefetch_data_on_node_with_mode(handle, node, async, STARPU_R); } /* * 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); } /* By default, sequential consistency is enabled */ static unsigned default_sequential_consistency_flag = 1; unsigned starpu_data_get_default_sequential_consistency_flag(void) { return default_sequential_consistency_flag; } void starpu_data_set_default_sequential_consistency_flag(unsigned flag) { default_sequential_consistency_flag = flag; } /* Query the status of the handle on the specified memory node. */ void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested) { // XXX : this is just a hint, so we don't take the lock ... // _starpu_spin_lock(&handle->header_lock); if (is_allocated) *is_allocated = handle->per_node[memory_node].allocated; if (is_valid) *is_valid = (handle->per_node[memory_node].state != STARPU_INVALID); if (is_requested) { int requested = 0; unsigned node; for (node = 0; node < STARPU_MAXNODES; node++) { if (handle->per_node[memory_node].requested & (1UL << node)) { requested = 1; break; } } *is_requested = requested; } // _starpu_spin_unlock(&handle->header_lock); } starpu-1.1.5/src/datawizard/datastats.h0000644000373600000000000000247712571536575015062 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATASTATS_H__ #define __DATASTATS_H__ #include #include #include #include void _starpu_msi_cache_hit(unsigned node); void _starpu_msi_cache_miss(unsigned node); void _starpu_display_msi_stats(void); void _starpu_allocation_cache_hit(unsigned node STARPU_ATTRIBUTE_UNUSED); void _starpu_data_allocation_inc_stats(unsigned node STARPU_ATTRIBUTE_UNUSED); void _starpu_comm_amounts_inc(unsigned src, unsigned dst, size_t size); void _starpu_display_comm_amounts(void); void _starpu_display_alloc_cache_stats(void); #endif // __DATASTATS_H__ starpu-1.1.5/src/datawizard/coherency.h0000644000373600000000000002447112571536575015047 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COHERENCY__H__ #define __COHERENCY__H__ #include #include #include #include #include #include #include #include #include #include #include #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; unsigned memory_node; /* describes the state of the local data in term of coherency */ enum _starpu_cache_state state; int refcnt; /* 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; /* Pointer to memchunk for LRU strategy */ struct _starpu_mem_chunk * mc; /* To help the scheduling policies to make some decision, we may keep a track of the tasks that are likely to request this data on the current node. It is the responsability of the scheduling _policy_ to set that flag when it assigns a task to a queue, policies which do not use this hint can simply ignore it. */ uint32_t requested; struct _starpu_data_request *request[STARPU_MAXNODES]; }; struct _starpu_data_requester_list; struct _starpu_jobid_list { unsigned long id; struct _starpu_jobid_list *next; }; /* This structure describes a simply-linked list of task */ struct _starpu_task_wrapper_list { struct starpu_task *task; struct _starpu_task_wrapper_list *next; }; /* This structure describes a doubly-linked list of task */ struct _starpu_task_wrapper_dlist { struct starpu_task *task; struct _starpu_task_wrapper_dlist *next; struct _starpu_task_wrapper_dlist *prev; }; extern int _starpu_has_not_important_data; typedef void (*_starpu_data_handle_unregister_hook)(starpu_data_handle_t); struct _starpu_data_state { struct _starpu_data_requester_list req_list; /* the number of requests currently in the scheduling engine (not in * the req_list anymore), i.e. the number of holders of the * current_mode rwlock */ unsigned refcnt; enum starpu_data_access_mode current_mode; /* protect meta data */ struct _starpu_spinlock header_lock; /* Condition to make application wait for all transfers before freeing handle */ /* busy_count is the number of handle->refcnt, handle->per_node[*]->refcnt, number of starpu_data_requesters, and number of tasks that have released it but are still registered on the implicit data dependency lists. */ /* Core code which releases busy_count has to call * _starpu_data_check_not_busy to let starpu_data_unregister proceed */ unsigned busy_count; /* Is starpu_data_unregister waiting for busy_count? */ unsigned busy_waiting; starpu_pthread_mutex_t busy_mutex; starpu_pthread_cond_t busy_cond; /* In case we user filters, the handle may describe a sub-data */ struct _starpu_data_state *root_handle; /* root of the tree */ struct _starpu_data_state *father_handle; /* father of the node, NULL if the current node is the root */ unsigned sibling_index; /* indicate which child this node is from the father's perpsective (if any) */ unsigned depth; /* what's the depth of the tree ? */ starpu_data_handle_t children; unsigned nchildren; /* describe the state of the data in term of coherency */ struct _starpu_data_replicate per_node[STARPU_MAXNODES]; struct _starpu_data_replicate per_worker[STARPU_NMAXWORKERS]; struct starpu_data_interface_ops *ops; /* Footprint which identifies data layout */ uint32_t footprint; /* where is the data home ? -1 if none yet */ int home_node; /* what is the default write-through mask for that data ? */ uint32_t wt_mask; /* allows special optimization */ uint8_t is_readonly; /* 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; /* This lock should protect any operation to enforce * sequential_consistency */ starpu_pthread_mutex_t sequential_consistency_mutex; /* The last submitted task (or application data request) that declared * it would modify the piece of data ? Any task accessing the data in a * read-only mode should depend on that task implicitely if the * sequential_consistency flag is enabled. */ enum starpu_data_access_mode last_submitted_mode; struct starpu_task *last_sync_task; struct _starpu_task_wrapper_dlist last_submitted_accessors; /* If FxT is enabled, we keep track of "ghost dependencies": that is to * say the dependencies that are not needed anymore, but that should * appear in the post-mortem DAG. For instance if we have the sequence * f(Aw) g(Aw), and that g is submitted after the termination of f, we * want to have f->g appear in the DAG even if StarPU does not need to * enforce this dependency anymore.*/ unsigned last_submitted_ghost_sync_id_is_valid; unsigned long last_submitted_ghost_sync_id; struct _starpu_jobid_list *last_submitted_ghost_accessors_id; /* protected by sequential_consistency_mutex */ struct _starpu_task_wrapper_list *post_sync_tasks; unsigned post_sync_tasks_cnt; /* * Reductions */ /* During reduction we need some specific methods: redux_func performs * the reduction of an interface into another one (eg. "+="), and init_func * initializes the data interface to a default value that is stable by * reduction (eg. 0 for +=). */ struct starpu_codelet *redux_cl; struct starpu_codelet *init_cl; /* Are we currently performing a reduction on that handle ? If so the * reduction_refcnt should be non null until there are pending tasks * that are performing the reduction. */ unsigned reduction_refcnt; /* List of requesters that are specific to the pending reduction. This * list is used when the requests in the req_list list are frozen until * the end of the reduction. */ struct _starpu_data_requester_list reduction_req_list; starpu_data_handle_t *reduction_tmp_handles; unsigned lazy_unregister; /* 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; }; void _starpu_display_msi_stats(void); /* 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, struct _starpu_data_replicate *replicate, enum starpu_data_access_mode mode, unsigned detached, unsigned async, void (*callback_func)(void *), void *callback_arg); /* This releases a reference on the handle */ void _starpu_release_data_on_node(struct _starpu_data_state *state, uint32_t default_wt_mask, struct _starpu_data_replicate *replicate); void _starpu_update_data_state(starpu_data_handle_t handle, struct _starpu_data_replicate *requesting_replicate, enum starpu_data_access_mode mode); uint32_t _starpu_get_data_refcnt(struct _starpu_data_state *state, unsigned node); size_t _starpu_data_get_size(starpu_data_handle_t handle); uint32_t _starpu_data_get_footprint(starpu_data_handle_t handle); void _starpu_push_task_output(struct _starpu_job *j, uint32_t mask); void _starpu_release_nowhere_task_output(struct _starpu_job *j); STARPU_ATTRIBUTE_WARN_UNUSED_RESULT int _starpu_fetch_task_input(struct _starpu_job *j, uint32_t mask); unsigned _starpu_is_data_present_or_requested(struct _starpu_data_state *state, unsigned node); int _starpu_select_src_node(struct _starpu_data_state *state, unsigned destination); /* is_prefetch is whether the DSM may drop the request (when there is not enough memory for instance * async is whether the caller wants a reference on the last request, to be * able to wait for it (which will release that reference). */ struct _starpu_data_request *_starpu_create_request_to_fetch_data(starpu_data_handle_t handle, struct _starpu_data_replicate *dst_replicate, enum starpu_data_access_mode mode, unsigned is_prefetch, unsigned async, void (*callback_func)(void *), void *callback_arg); void _starpu_redux_init_data_replicate(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, int workerid); void _starpu_data_start_reduction_mode(starpu_data_handle_t handle); void _starpu_data_end_reduction_mode(starpu_data_handle_t handle); void _starpu_data_end_reduction_mode_terminate(starpu_data_handle_t handle); void _starpu_data_set_unregister_hook(starpu_data_handle_t handle, _starpu_data_handle_unregister_hook func); #endif // __COHERENCY__H__ starpu-1.1.5/src/datawizard/memstats.h0000644000373600000000000000374412571536575014725 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __MEMSTATS_H__ #define __MEMSTATS_H__ #include #include #ifdef STARPU_MEMORY_STATS struct _starpu_memory_stats { /* Handle access stats per node */ unsigned direct_access[STARPU_MAXNODES]; unsigned loaded_shared[STARPU_MAXNODES]; unsigned loaded_owner[STARPU_MAXNODES]; unsigned shared_to_owner[STARPU_MAXNODES]; unsigned invalidated[STARPU_MAXNODES]; }; typedef struct _starpu_memory_stats * _starpu_memory_stats_t; #else typedef void * _starpu_memory_stats_t; #endif void _starpu_memory_stats_init(starpu_data_handle_t handle); void _starpu_memory_stats_init_per_node(starpu_data_handle_t handle, unsigned node); void _starpu_memory_stats_free(starpu_data_handle_t handle); void _starpu_memory_display_handle_stats(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.1.5/src/datawizard/filters.c0000644000373600000000000004205712571536575014533 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique * Copyright (C) 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include static void starpu_data_create_children(starpu_data_handle_t handle, unsigned nchildren, struct starpu_data_filter *f); /* * 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); } 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; } void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f) { unsigned nparts; unsigned i; unsigned node; /* first take care to properly lock the data header */ _starpu_spin_lock(&initial_handle->header_lock); 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); /* how many parts ? */ if (f->get_nchildren) nparts = f->get_nchildren(f, initial_handle); else nparts = f->nchildren; STARPU_ASSERT_MSG(nparts > 0, "Partitioning data %p in 0 piece does not make sense", initial_handle); /* allocate the children */ starpu_data_create_children(initial_handle, nparts, f); unsigned nworkers = starpu_worker_get_count(); 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 */ int ret = _starpu_allocate_memory_on_node(initial_handle, &initial_handle->per_node[0], 0); STARPU_ASSERT(!ret); } for (i = 0; i < nparts; i++) { starpu_data_handle_t child = starpu_data_get_child(initial_handle, i); STARPU_ASSERT(child); child->nchildren = 0; child->mpi_data = initial_handle->mpi_data; child->root_handle = initial_handle->root_handle; child->father_handle = initial_handle; child->sibling_index = i; child->depth = initial_handle->depth + 1; child->is_not_important = initial_handle->is_not_important; child->wt_mask = initial_handle->wt_mask; child->home_node = initial_handle->home_node; child->is_readonly = initial_handle->is_readonly; /* initialize the chunk lock */ _starpu_data_requester_list_init(&child->req_list); _starpu_data_requester_list_init(&child->reduction_req_list); child->reduction_tmp_handles = NULL; child->refcnt = 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; 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 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]; child_replicate->state = initial_replicate->state; child_replicate->allocated = initial_replicate->allocated; /* 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; child_replicate->initialized = initial_replicate->initialized; /* 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); f->filter_func(initial_interface, child_interface, f, i, nparts); } unsigned worker; for (worker = 0; worker < nworkers; worker++) { struct _starpu_data_replicate *child_replicate; child_replicate = &child->per_worker[worker]; child_replicate->state = STARPU_INVALID; child_replicate->allocated = 0; child_replicate->automatically_allocated = 0; child_replicate->refcnt = 0; child_replicate->memory_node = starpu_worker_get_memory_node(worker); child_replicate->requested = 0; for (node = 0; node < STARPU_MAXNODES; node++) { child_replicate->request[node] = NULL; } child_replicate->relaxed_coherency = 1; child_replicate->initialized = 0; /* duplicate the content of the interface on node 0 */ memcpy(child_replicate->data_interface, child->per_node[0].data_interface, child->ops->interface_size); } /* We compute the size and the footprint of the child once and * store it in the handle */ child->footprint = _starpu_compute_data_footprint(child); void *ptr; ptr = starpu_data_handle_to_pointer(child, 0); if (ptr != NULL) { _starpu_data_register_ram_pointer(child, ptr); } } /* 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]; _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(); STARPU_TASK_SET_HANDLE(task, child_handle, 0); task->cl = &cl; task->synchronous = 1; if (_starpu_task_submit_internally(task) != 0) _STARPU_ERROR("Could not submit the conversion task while unpartitionning\n"); } int ret; /* for now we pretend that the RAM is almost unlimited and that gathering * data should be possible from the node that does the unpartionning ... we * don't want to have the programming deal with memory shortage at that time, * really */ /* Acquire the child data on the gathering node. This will trigger collapsing any reduction */ ret = starpu_data_acquire_on_node(child_handle, gathering_node, STARPU_RW); STARPU_ASSERT(ret == 0); starpu_data_release_on_node(child_handle, gathering_node); _starpu_spin_lock(&child_handle->header_lock); child_handle->busy_waiting = 1; _starpu_spin_unlock(&child_handle->header_lock); /* Wait for all requests to finish (notably WT requests) */ STARPU_PTHREAD_MUTEX_LOCK(&child_handle->busy_mutex); while (1) { /* Here helgrind would shout that this an unprotected access, * but this is actually fine: all threads who do busy_count-- * are supposed to call _starpu_data_check_not_busy, which will * wake us up through the busy_mutex/busy_cond. */ if (!child_handle->busy_count) break; /* This is woken by _starpu_data_check_not_busy, always called * after decrementing busy_count */ STARPU_PTHREAD_COND_WAIT(&child_handle->busy_cond, &child_handle->busy_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&child_handle->busy_mutex); _starpu_spin_lock(&child_handle->header_lock); sizes[child] = _starpu_data_get_size(child_handle); _starpu_data_unregister_ram_pointer(child_handle); 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); } /* the gathering_node should now have a valid copy of all the children. * For all nodes, if the node had all copies and none was locally * allocated then the data is still valid there, else, it's invalidated * for the gathering node, if we have some locally allocated data, we * copy all the children (XXX this should not happen so we just do not * do anything since this is transparent ?) */ unsigned still_valid[STARPU_MAXNODES]; /* we do 2 passes : the first pass determines wether the data is still * valid or not, the second pass is needed to choose between STARPU_SHARED and * STARPU_OWNER */ unsigned nvalids = 0; /* still valid ? */ for (node = 0; node < STARPU_MAXNODES; node++) { struct _starpu_data_replicate *local; /* until an issue is found the data is assumed to be valid */ unsigned isvalid = 1; for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); local = &child_handle->per_node[node]; if (local->state == STARPU_INVALID || local->automatically_allocated == 1) { /* One of the bits is missing or is not inside the parent */ isvalid = 0; } if (local->mc && local->allocated && local->automatically_allocated) /* free the child data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(child_handle, local, node, sizes[child]); } local = &root_handle->per_node[node]; if (!local->allocated) /* Even if we have all the bits, if we don't have the * whole data, it's not valid */ isvalid = 0; if (!isvalid && local->mc && local->allocated && local->automatically_allocated) /* free the data copy in a lazy fashion */ _starpu_request_mem_chunk_removal(root_handle, local, node, _starpu_data_get_size(root_handle)); /* if there was no invalid copy, the node still has a valid copy */ still_valid[node] = isvalid; if (isvalid) nvalids++; } /* either shared or owned */ STARPU_ASSERT(nvalids > 0); enum _starpu_cache_state newstate = (nvalids == 1)?STARPU_OWNER:STARPU_SHARED; for (node = 0; node < STARPU_MAXNODES; node++) { root_handle->per_node[node].state = still_valid[node]?newstate:STARPU_INVALID; } for (child = 0; child < root_handle->nchildren; child++) { starpu_data_handle_t child_handle = starpu_data_get_child(root_handle, child); _starpu_data_free_interfaces(child_handle); _starpu_spin_unlock(&child_handle->header_lock); _starpu_spin_destroy(&child_handle->header_lock); 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); } /* there is no child anymore */ starpu_data_handle_t children = root_handle->children; root_handle->children = NULL; root_handle->nchildren = 0; /* 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); } /* each child may have his own interface type */ static void starpu_data_create_children(starpu_data_handle_t handle, unsigned nchildren, struct starpu_data_filter *f) { handle->children = (struct _starpu_data_state *) calloc(nchildren, sizeof(struct _starpu_data_state)); STARPU_ASSERT(handle->children); unsigned child; for (child = 0; child < nchildren; child++) { starpu_data_handle_t handle_child; struct starpu_data_interface_ops *ops; /* what's this child's interface ? */ if (f->get_child_ops) ops = f->get_child_ops(f, child); else ops = handle->ops; handle_child = &handle->children[child]; _starpu_data_handle_init(handle_child, ops, handle->mf_node); } /* this handle now has children */ handle->nchildren = nchildren; } /* * Given an integer N, NPARTS the number of parts it must be divided in, ID the * part currently considered, determines the CHUNK_SIZE and the OFFSET, taking * into account the size of the elements stored in the data structure ELEMSIZE * and LD, the leading dimension. */ void _starpu_filter_nparts_compute_chunk_size_and_offset(unsigned n, unsigned nparts, size_t elemsize, unsigned id, unsigned ld, unsigned *chunk_size, size_t *offset) { *chunk_size = n/nparts; unsigned remainder = n % nparts; if (id < remainder) (*chunk_size)++; /* * Computing the total offset. The formula may not be really clear, but * it really just is: * * total = 0; * for (i = 0; i < id; i++) * { * total += n/nparts; * if (i < n%nparts) * total++; * } * offset = total * elemsize * ld; */ if (offset != NULL) *offset = (id *(n/nparts) + STARPU_MIN(remainder, id)) * ld * elemsize; } starpu-1.1.5/src/starpu_parameters.h0000644000373600000000000000203512571536572014464 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef _STARPU_PARAMETERS_H #define _STARPU_PARAMETERS_H /* Parameters which are not worth being added to ./configure options, but * still interesting to easily change */ /* Assumed relative performance ratios */ /* TODO: benchmark a bit instead */ #define _STARPU_CPU_ALPHA 1.0f #define _STARPU_CUDA_ALPHA 13.33f #define _STARPU_OPENCL_ALPHA 12.22f #endif /* _STARPU_PARAMETERS_H */ starpu-1.1.5/src/sched_policies/0002755000373600000000000000000012571541161013577 500000000000000starpu-1.1.5/src/sched_policies/stack_queues.h0000644000373600000000000000354212571536575016403 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Stack queues, ready for use by schedulers */ #ifndef __STACK_QUEUES_H__ #define __STACK_QUEUES_H__ #include #include struct _starpu_stack_jobq { /* the actual list */ struct _starpu_job_list jobq; /* the number of tasks currently in the queue */ unsigned njobs; /* 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 first task in the queue */ 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 */ }; struct _starpu_stack_jobq *_starpu_create_stack(void); void _starpu_stack_push_task(struct _starpu_stack_jobq *stack, starpu_pthread_mutex_t *sched_mutex, starpu_pthread_cond_t *sched_cond, struct _starpu_job *task); struct _starpu_job *_starpu_stack_pop_task(struct _starpu_stack_jobq *stack, starpu_pthread_mutex_t *sched_mutex, int workerid); void _starpu_init_stack_queues_mechanisms(void); unsigned _starpu_get_stack_njobs(struct _starpu_stack_jobq *stack); unsigned _starpu_get_stack_nprocessed(struct _starpu_stack_jobq *stack); #endif // __STACK_QUEUES_H__ starpu-1.1.5/src/sched_policies/deque_modeling_policy_data_aware.c0000644000373600000000000010114612571536575022411 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Distributed queues using performance modeling to assign tasks */ #include #include #include #include #include #include #ifdef HAVE_AYUDAME_H #include #endif #ifndef DBL_MIN #define DBL_MIN __DBL_MIN__ #endif #ifndef DBL_MAX #define DBL_MAX __DBL_MAX__ #endif struct _starpu_dmda_data { double alpha; double beta; double _gamma; double idle_power; struct _starpu_fifo_taskq **queue_array; long int total_task_cnt; long int ready_task_cnt; }; /* The dmda scheduling policy uses * * alpha * T_computation + beta * T_communication + gamma * Consumption * * Here are the default values of alpha, beta, gamma */ #define _STARPU_SCHED_ALPHA_DEFAULT 1.0 #define _STARPU_SCHED_BETA_DEFAULT 1.0 #define _STARPU_SCHED_GAMMA_DEFAULT 1000.0 #ifdef STARPU_USE_TOP static double alpha = _STARPU_SCHED_ALPHA_DEFAULT; static double beta = _STARPU_SCHED_BETA_DEFAULT; static double _gamma = _STARPU_SCHED_GAMMA_DEFAULT; static double idle_power = 0.0; static const float alpha_minimum=0; static const float alpha_maximum=10.0; static const float beta_minimum=0; static const float beta_maximum=10.0; static const float gamma_minimum=0; static const float gamma_maximum=10000.0; static const float idle_power_minimum=0; static const float idle_power_maximum=10000.0; #endif /* !STARPU_USE_TOP */ static int count_non_ready_buffers(struct starpu_task *task, unsigned node) { int cnt = 0; unsigned nbuffers = task->cl->nbuffers; unsigned index; for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle; handle = STARPU_TASK_GET_HANDLE(task, index); int is_valid; starpu_data_query_status(handle, node, NULL, &is_valid, NULL); if (!is_valid) cnt++; } return cnt; } #ifdef STARPU_USE_TOP static void param_modified(struct starpu_top_param* d) { #ifdef STARPU_DEVEL #warning FIXME: get sched ctx to get alpha/beta/gamma/idle values #endif /* Just to show parameter modification. */ fprintf(stderr, "%s has been modified : " "alpha=%f|beta=%f|gamma=%f|idle_power=%f !\n", d->name, alpha,beta,_gamma, idle_power); } #endif /* !STARPU_USE_TOP */ static struct starpu_task *_starpu_fifo_pop_first_ready_task(struct _starpu_fifo_taskq *fifo_queue, unsigned node) { struct starpu_task *task = NULL, *current; if (fifo_queue->ntasks == 0) return NULL; if (fifo_queue->ntasks > 0) { fifo_queue->ntasks--; task = starpu_task_list_front(&fifo_queue->taskq); if (STARPU_UNLIKELY(!task)) return NULL; int first_task_priority = task->priority; current = task; int non_ready_best = INT_MAX; while (current) { int priority = current->priority; if (priority >= first_task_priority) { int non_ready = count_non_ready_buffers(current, node); if (non_ready < non_ready_best) { non_ready_best = non_ready; task = current; if (non_ready == 0) break; } } current = current->next; } starpu_task_list_erase(&fifo_queue->taskq, task); } return task; } static struct starpu_task *dmda_pop_ready_task(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *task; int workerid = starpu_worker_get_id(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; unsigned node = starpu_worker_get_memory_node(workerid); task = _starpu_fifo_pop_first_ready_task(fifo, node); if (task) { /* We now start the transfer, get rid of it in the completion * prediction */ double transfer_model = task->predicted_transfer; if(!isnan(transfer_model)) { fifo->exp_len -= transfer_model; fifo->exp_start = starpu_timing_now() + transfer_model; fifo->exp_end = fifo->exp_start + fifo->exp_len; } #ifdef STARPU_VERBOSE if (task->cl) { int non_ready = count_non_ready_buffers(task, node); if (non_ready == 0) dt->ready_task_cnt++; } dt->total_task_cnt++; #endif } return task; } static struct starpu_task *dmda_pop_task(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *task; int workerid = starpu_worker_get_id(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; STARPU_ASSERT_MSG(fifo, "worker %d does not belong to ctx %d anymore.\n", workerid, sched_ctx_id); task = _starpu_fifo_pop_local_task(fifo); if (task) { double transfer_model = task->predicted_transfer; /* We now start the transfer, get rid of it in the completion * prediction */ if(!isnan(transfer_model)) { double model = task->predicted; fifo->exp_len -= transfer_model; fifo->exp_start = starpu_timing_now() + transfer_model+model; fifo->exp_end = fifo->exp_start + fifo->exp_len; } #ifdef STARPU_VERBOSE if (task->cl) { int non_ready = count_non_ready_buffers(task, starpu_worker_get_memory_node(workerid)); if (non_ready == 0) dt->ready_task_cnt++; } dt->total_task_cnt++; #endif } return task; } static struct starpu_task *dmda_pop_every_task(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_task *new_list; int workerid = starpu_worker_get_id(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); new_list = _starpu_fifo_pop_every_task(fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); while (new_list) { double transfer_model = new_list->predicted_transfer; /* We now start the transfer, get rid of it in the completion * prediction */ if(!isnan(transfer_model)) { fifo->exp_len -= transfer_model; fifo->exp_start = starpu_timing_now() + transfer_model; fifo->exp_end = fifo->exp_start + fifo->exp_len; } new_list = new_list->next; } return new_list; } static int push_task_on_best_worker(struct starpu_task *task, int best_workerid, double predicted, double predicted_transfer, int prio, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* make sure someone coule execute that task ! */ STARPU_ASSERT(best_workerid != -1); struct _starpu_fifo_taskq *fifo = dt->queue_array[best_workerid]; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(best_workerid, &sched_mutex, &sched_cond); #ifdef STARPU_USE_SC_HYPERVISOR starpu_sched_ctx_call_pushed_task_cb(best_workerid, sched_ctx_id); #endif //STARPU_USE_SC_HYPERVISOR STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); /* Sometimes workers didn't take the tasks as early as we expected */ fifo->exp_start = STARPU_MAX(fifo->exp_start, starpu_timing_now()); fifo->exp_end = fifo->exp_start + fifo->exp_len; if ((starpu_timing_now() + predicted_transfer) < fifo->exp_end) { /* We may hope that the transfer will be finished by * the start of the task. */ predicted_transfer = 0.0; } else { /* The transfer will not be finished by then, take the * remainder into account */ predicted_transfer = (starpu_timing_now() + predicted_transfer) - fifo->exp_end; } if(!isnan(predicted_transfer)) { fifo->exp_end += predicted_transfer; fifo->exp_len += predicted_transfer; } if(!isnan(predicted)) { fifo->exp_end += predicted; fifo->exp_len += predicted; } STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); task->predicted = predicted; task->predicted_transfer = predicted_transfer; #ifdef STARPU_USE_TOP starpu_top_task_prevision(task, best_workerid, (unsigned long long)(fifo->exp_end-predicted)/1000, (unsigned long long)fifo->exp_end/1000); #endif /* !STARPU_USE_TOP */ if (starpu_get_prefetch_flag()) { unsigned memory_node = starpu_worker_get_memory_node(best_workerid); starpu_prefetch_task_input_on_node(task, memory_node); } #ifdef HAVE_AYUDAME_H if (AYU_event) { intptr_t id = best_workerid; AYU_event(AYU_ADDTASKTOQUEUE, _starpu_get_job_associated_to_task(task)->job_id, &id); } #endif int ret = 0; if (prio) { STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); ret =_starpu_fifo_push_sorted_task(dt->queue_array[best_workerid], task); #ifndef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_COND_SIGNAL(sched_cond); #endif starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } else { STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); starpu_task_list_push_back (&dt->queue_array[best_workerid]->taskq, task); dt->queue_array[best_workerid]->ntasks++; dt->queue_array[best_workerid]->nprocessed++; #ifndef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_COND_SIGNAL(sched_cond); #endif starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } return ret; } /* TODO: factorize with dmda!! */ static int _dm_push_task(struct starpu_task *task, unsigned prio, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker, worker_ctx = 0; int best = -1; double best_exp_end = 0.0; double model_best = 0.0; double transfer_model_best = 0.0; int ntasks_best = -1; double ntasks_best_end = 0.0; int calibrating = 0; /* A priori, we know all estimations */ int unknown = 0; unsigned best_impl = 0; unsigned nimpl; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); struct _starpu_fifo_taskq *fifo = dt->queue_array[worker]; unsigned memory_node = starpu_worker_get_memory_node(worker); enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(worker); /* Sometimes workers didn't take the tasks as early as we expected */ double exp_start = STARPU_MAX(fifo->exp_start, starpu_timing_now()); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!starpu_worker_can_execute_task(worker, task, nimpl)) { /* no one on that queue may execute this task */ // worker_ctx++; continue; } double exp_end; double local_length = starpu_task_expected_length(task, perf_arch, nimpl); double local_penalty = starpu_task_expected_data_transfer_time(memory_node, task); double ntasks_end = fifo->ntasks / starpu_worker_get_relative_speedup(perf_arch); //_STARPU_DEBUG("Scheduler dm: task length (%lf) worker (%u) kernel (%u) \n", local_length,worker,nimpl); /* * This implements a default greedy scheduler for the * case of tasks which have no performance model, or * whose performance model is not calibrated yet. * * It simply uses the number of tasks already pushed to * the workers, divided by the relative performance of * a CPU and of a GPU. * * This is always computed, but the ntasks_best * selection is only really used if the task indeed has * no performance model, or is not calibrated yet. */ if (ntasks_best == -1 /* Always compute the greedy decision, at least for * the tasks with no performance model. */ || (!calibrating && ntasks_end < ntasks_best_end) /* The performance model of this task is not * calibrated on this worker, try to run it there * to calibrate it there. */ || (!calibrating && isnan(local_length)) /* the performance model of this task is not * calibrated on this worker either, rather run it * there if this one is low on scheduled tasks. */ || (calibrating && isnan(local_length) && ntasks_end < ntasks_best_end) ) { ntasks_best_end = ntasks_end; ntasks_best = worker; best_impl = nimpl; } if (isnan(local_length)) /* we are calibrating, we want to speed-up calibration time * so we privilege non-calibrated tasks (but still * greedily distribute them to avoid dumb schedules) */ calibrating = 1; if (isnan(local_length) || _STARPU_IS_ZERO(local_length)) /* there is no prediction available for that task * with that arch yet, so switch to a greedy strategy */ unknown = 1; if (unknown) continue; exp_end = exp_start + fifo->exp_len + local_length; if (best == -1 || exp_end < best_exp_end) { /* a better solution was found */ best_exp_end = exp_end; best = worker; model_best = local_length; transfer_model_best = local_penalty; best_impl = nimpl; } } worker_ctx++; } if (unknown) { best = ntasks_best; model_best = 0.0; transfer_model_best = 0.0; } //_STARPU_DEBUG("Scheduler dm: kernel (%u)\n", best_impl); starpu_task_set_implementation(task, best_impl); /* we should now have the best worker in variable "best" */ return push_task_on_best_worker(task, best, model_best, transfer_model_best, prio, sched_ctx_id); } /* TODO: factorise CPU computations, expensive with a lot of cores */ static void compute_all_performance_predictions(struct starpu_task *task, unsigned nworkers, double local_task_length[nworkers][STARPU_MAXIMPLEMENTATIONS], double exp_end[nworkers][STARPU_MAXIMPLEMENTATIONS], double *max_exp_endp, double *best_exp_endp, double local_data_penalty[nworkers][STARPU_MAXIMPLEMENTATIONS], double local_power[nworkers][STARPU_MAXIMPLEMENTATIONS], int *forced_worker, int *forced_impl, unsigned sched_ctx_id) { int calibrating = 0; double max_exp_end = DBL_MIN; double best_exp_end = DBL_MAX; int ntasks_best = -1; int nimpl_best = 0; double ntasks_best_end = 0.0; /* A priori, we know all estimations */ int unknown = 0; unsigned worker, worker_ctx = 0; unsigned nimpl; 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); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (worker >= nworkers) /* This is a just-added worker, discard it */ continue; struct _starpu_fifo_taskq *fifo = dt->queue_array[worker]; enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(worker); unsigned memory_node = starpu_worker_get_memory_node(worker); /* Sometimes workers didn't take the tasks as early as we expected */ double exp_start = STARPU_MAX(fifo->exp_start, starpu_timing_now()); for(nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!starpu_worker_can_execute_task(worker, task, nimpl)) { /* no one on that queue may execute this task */ continue; } STARPU_ASSERT_MSG(fifo != NULL, "worker %d ctx %d\n", worker, sched_ctx_id); exp_end[worker_ctx][nimpl] = exp_start + fifo->exp_len; if (exp_end[worker_ctx][nimpl] > max_exp_end) max_exp_end = exp_end[worker_ctx][nimpl]; //_STARPU_DEBUG("Scheduler dmda: task length (%lf) worker (%u) kernel (%u) \n", local_task_length[worker][nimpl],worker,nimpl); if (bundle) { /* TODO : conversion time */ local_task_length[worker_ctx][nimpl] = starpu_task_bundle_expected_length(bundle, perf_arch, nimpl); local_data_penalty[worker_ctx][nimpl] = starpu_task_bundle_expected_data_transfer_time(bundle, memory_node); local_power[worker_ctx][nimpl] = starpu_task_bundle_expected_power(bundle, perf_arch,nimpl); } else { local_task_length[worker_ctx][nimpl] = starpu_task_expected_length(task, perf_arch, nimpl); local_data_penalty[worker_ctx][nimpl] = starpu_task_expected_data_transfer_time(memory_node, task); local_power[worker_ctx][nimpl] = starpu_task_expected_power(task, perf_arch,nimpl); double conversion_time = starpu_task_expected_conversion_time(task, perf_arch, nimpl); if (conversion_time > 0.0) local_task_length[worker_ctx][nimpl] += conversion_time; } double ntasks_end = fifo->ntasks / starpu_worker_get_relative_speedup(perf_arch); /* * This implements a default greedy scheduler for the * case of tasks which have no performance model, or * whose performance model is not calibrated yet. * * It simply uses the number of tasks already pushed to * the workers, divided by the relative performance of * a CPU and of a GPU. * * This is always computed, but the ntasks_best * selection is only really used if the task indeed has * no performance model, or is not calibrated yet. */ if (ntasks_best == -1 /* Always compute the greedy decision, at least for * the tasks with no performance model. */ || (!calibrating && ntasks_end < ntasks_best_end) /* The performance model of this task is not * calibrated on this worker, try to run it there * to calibrate it there. */ || (!calibrating && isnan(local_task_length[worker_ctx][nimpl])) /* the performance model of this task is not * calibrated on this worker either, rather run it * there if this one is low on scheduled tasks. */ || (calibrating && isnan(local_task_length[worker_ctx][nimpl]) && ntasks_end < ntasks_best_end) ) { ntasks_best_end = ntasks_end; ntasks_best = worker; nimpl_best = nimpl; } if (isnan(local_task_length[worker_ctx][nimpl])) /* we are calibrating, we want to speed-up calibration time * so we privilege non-calibrated tasks (but still * greedily distribute them to avoid dumb schedules) */ calibrating = 1; if (isnan(local_task_length[worker_ctx][nimpl]) || _STARPU_IS_ZERO(local_task_length[worker_ctx][nimpl])) /* there is no prediction available for that task * with that arch (yet or at all), so switch to a greedy strategy */ unknown = 1; if (unknown) continue; exp_end[worker_ctx][nimpl] = exp_start + fifo->exp_len + local_task_length[worker_ctx][nimpl]; if (exp_end[worker_ctx][nimpl] < best_exp_end) { /* a better solution was found */ best_exp_end = exp_end[worker_ctx][nimpl]; nimpl_best = nimpl; } if (isnan(local_power[worker_ctx][nimpl])) local_power[worker_ctx][nimpl] = 0.; } worker_ctx++; } *forced_worker = unknown?ntasks_best:-1; *forced_impl = unknown?nimpl_best:-1; *best_exp_endp = best_exp_end; *max_exp_endp = max_exp_end; } static int _dmda_push_task(struct starpu_task *task, unsigned prio, unsigned sched_ctx_id) { /* find the queue */ unsigned worker, worker_ctx = 0; int best = -1, best_in_ctx = -1; int selected_impl = 0; double model_best = 0.0; double transfer_model_best = 0.0; /* this flag is set if the corresponding worker is selected because there is no performance prediction available yet */ int forced_best = -1; int forced_impl = -1; struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); unsigned nworkers_ctx = workers->nworkers; double local_task_length[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_data_penalty[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_power[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double exp_end[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double max_exp_end = 0.0; double best_exp_end; double fitness[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); compute_all_performance_predictions(task, nworkers_ctx, local_task_length, exp_end, &max_exp_end, &best_exp_end, local_data_penalty, local_power, &forced_best, &forced_impl, sched_ctx_id); double best_fitness = -1; unsigned nimpl; if (forced_best == -1) { while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (worker >= nworkers_ctx) /* This is a just-added worker, discard it */ continue; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!starpu_worker_can_execute_task(worker, task, nimpl)) { /* no one on that queue may execute this task */ continue; } fitness[worker_ctx][nimpl] = dt->alpha*(exp_end[worker_ctx][nimpl] - best_exp_end) + dt->beta*(local_data_penalty[worker_ctx][nimpl]) + dt->_gamma*(local_power[worker_ctx][nimpl]); if (exp_end[worker_ctx][nimpl] > max_exp_end) { /* This placement will make the computation * longer, take into account the idle * consumption of other cpus */ fitness[worker_ctx][nimpl] += dt->_gamma * dt->idle_power * (exp_end[worker_ctx][nimpl] - max_exp_end) / 1000000.0; } if (best == -1 || fitness[worker_ctx][nimpl] < best_fitness) { /* we found a better solution */ best_fitness = fitness[worker_ctx][nimpl]; best = worker; best_in_ctx = worker_ctx; selected_impl = nimpl; //_STARPU_DEBUG("best fitness (worker %d) %e = alpha*(%e) + beta(%e) +gamma(%e)\n", worker, best_fitness, exp_end[worker][nimpl] - best_exp_end, local_data_penalty[worker][nimpl], local_power[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) { enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(best_in_ctx); unsigned memory_node = starpu_worker_get_memory_node(best); model_best = starpu_task_expected_length(task, perf_arch, selected_impl); transfer_model_best = starpu_task_expected_data_transfer_time(memory_node, task); } else { model_best = local_task_length[best_in_ctx][selected_impl]; transfer_model_best = local_data_penalty[best_in_ctx][selected_impl]; } //_STARPU_DEBUG("Scheduler dmda: kernel (%u)\n", best_impl); starpu_task_set_implementation(task, selected_impl); /* 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); } 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); } static int dm_push_task(struct starpu_task *task) { return _dm_push_task(task, 0, task->sched_ctx); } static int dmda_push_task(struct starpu_task *task) { STARPU_ASSERT(task); return _dmda_push_task(task, 0, task->sched_ctx); } 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); int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; /* if the worker has alreadry belonged to this context the queue and the synchronization variables have been already initialized */ if(dt->queue_array[workerid] == NULL) dt->queue_array[workerid] = _starpu_create_fifo(); } } static void dmda_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; if(dt->queue_array[workerid] != NULL) { _starpu_destroy_fifo(dt->queue_array[workerid]); dt->queue_array[workerid] = NULL; } } } static void initialize_dmda_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)malloc(sizeof(struct _starpu_dmda_data)); dt->alpha = _STARPU_SCHED_ALPHA_DEFAULT; dt->beta = _STARPU_SCHED_BETA_DEFAULT; dt->_gamma = _STARPU_SCHED_GAMMA_DEFAULT; dt->idle_power = 0.0; starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)dt); dt->queue_array = (struct _starpu_fifo_taskq**)malloc(STARPU_NMAXWORKERS*sizeof(struct _starpu_fifo_taskq*)); int i; for(i = 0; i < STARPU_NMAXWORKERS; i++) dt->queue_array[i] = NULL; const char *strval_alpha = starpu_getenv("STARPU_SCHED_ALPHA"); if (strval_alpha) dt->alpha = atof(strval_alpha); const char *strval_beta = starpu_getenv("STARPU_SCHED_BETA"); if (strval_beta) dt->beta = atof(strval_beta); const char *strval_gamma = starpu_getenv("STARPU_SCHED_GAMMA"); if (strval_gamma) dt->_gamma = atof(strval_gamma); const char *strval_idle_power = starpu_getenv("STARPU_IDLE_POWER"); if (strval_idle_power) dt->idle_power = atof(strval_idle_power); #ifdef STARPU_USE_TOP starpu_top_register_parameter_float("DMDA_ALPHA", &alpha, alpha_minimum, alpha_maximum, param_modified); starpu_top_register_parameter_float("DMDA_BETA", &beta, beta_minimum, beta_maximum, param_modified); starpu_top_register_parameter_float("DMDA_GAMMA", &_gamma, gamma_minimum, gamma_maximum, param_modified); starpu_top_register_parameter_float("DMDA_IDLE_POWER", &idle_power, idle_power_minimum, idle_power_maximum, param_modified); #endif /* !STARPU_USE_TOP */ } static void initialize_dmda_sorted_policy(unsigned sched_ctx_id) { initialize_dmda_policy(sched_ctx_id); /* The application may use any integer */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, INT_MIN); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, INT_MAX); } static void deinitialize_dmda_policy(unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); _STARPU_DEBUG("total_task_cnt %ld ready_task_cnt %ld -> %f\n", dt->total_task_cnt, dt->ready_task_cnt, (100.0f*dt->ready_task_cnt)/dt->total_task_cnt); free(dt->queue_array); free(dt); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } /* dmda_pre_exec_hook is called right after the data transfer is done and right * before the computation to begin, it is useful to update more precisely the * value of the expected start, end, length, etc... */ static void dmda_pre_exec_hook(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; int workerid = starpu_worker_get_id(); struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; double model = task->predicted; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* Once the task is executing, we can update the predicted amount * of work. */ STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); if(!isnan(model)) { /* We now start the computation, get rid of it in the completion * prediction */ fifo->exp_len-= model; fifo->exp_start = starpu_timing_now() + model; fifo->exp_end= fifo->exp_start + fifo->exp_len; } STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } static void dmda_push_task_notify(struct starpu_task *task, int workerid, int perf_workerid, unsigned sched_ctx_id) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; /* Compute the expected penality */ enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(perf_workerid); unsigned memory_node = starpu_worker_get_memory_node(workerid); double predicted = starpu_task_expected_length(task, perf_arch, starpu_task_get_implementation(task)); double predicted_transfer = starpu_task_expected_data_transfer_time(memory_node, task); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* Update the predictions */ STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); /* Sometimes workers didn't take the tasks as early as we expected */ fifo->exp_start = STARPU_MAX(fifo->exp_start, starpu_timing_now()); fifo->exp_end = fifo->exp_start + fifo->exp_len; /* If there is no prediction available, we consider the task has a null length */ if (!isnan(predicted_transfer)) { if (starpu_timing_now() + predicted_transfer < fifo->exp_end) { /* We may hope that the transfer will be finished by * the start of the task. */ predicted_transfer = 0; } else { /* The transfer will not be finished by then, take the * remainder into account */ predicted_transfer = (starpu_timing_now() + predicted_transfer) - fifo->exp_end; } task->predicted_transfer = predicted_transfer; fifo->exp_end += predicted_transfer; fifo->exp_len += predicted_transfer; } /* If 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; } fifo->ntasks++; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } static void dmda_post_exec_hook(struct starpu_task * task) { struct _starpu_dmda_data *dt = (struct _starpu_dmda_data*)starpu_sched_ctx_get_policy_data(task->sched_ctx); int workerid = starpu_worker_get_id(); struct _starpu_fifo_taskq *fifo = dt->queue_array[workerid]; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); if(task->execute_on_a_specific_worker) fifo->ntasks--; fifo->exp_start = starpu_timing_now(); fifo->exp_end = fifo->exp_start + fifo->exp_len; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } struct starpu_sched_policy _starpu_sched_dm_policy = { .init_sched = initialize_dmda_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dm_push_task, .pop_task = dmda_pop_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dm", .policy_description = "performance model" }; struct starpu_sched_policy _starpu_sched_dmda_policy = { .init_sched = initialize_dmda_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dmda_push_task, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmda", .policy_description = "data-aware performance model" }; struct starpu_sched_policy _starpu_sched_dmda_sorted_policy = { .init_sched = initialize_dmda_sorted_policy, .deinit_sched = deinitialize_dmda_policy, .add_workers = dmda_add_workers , .remove_workers = dmda_remove_workers, .push_task = dmda_push_sorted_task, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_ready_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmdas", .policy_description = "data-aware performance model (sorted)" }; struct starpu_sched_policy _starpu_sched_dmda_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, .push_task_notify = dmda_push_task_notify, .pop_task = dmda_pop_ready_task, .pre_exec_hook = dmda_pre_exec_hook, .post_exec_hook = dmda_post_exec_hook, .pop_every_task = dmda_pop_every_task, .policy_name = "dmdar", .policy_description = "data-aware performance model (ready)" }; starpu-1.1.5/src/sched_policies/parallel_eager.c0000644000373600000000000002323712571536575016644 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011-2013, 2015 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include struct _starpu_peager_data { struct _starpu_fifo_taskq *fifo; struct _starpu_fifo_taskq *local_fifo[STARPU_NMAXWORKERS]; int master_id[STARPU_NMAXWORKERS]; starpu_pthread_mutex_t policy_mutex; }; #define STARPU_NMAXCOMBINED_WORKERS 10 /* XXX instead of 10, we should use some "MAX combination .."*/ static int possible_combinations_cnt[STARPU_NMAXWORKERS]; static int possible_combinations[STARPU_NMAXWORKERS][STARPU_NMAXCOMBINED_WORKERS]; static int possible_combinations_size[STARPU_NMAXWORKERS][STARPU_NMAXCOMBINED_WORKERS]; /*!!!!!!! It doesn't work with several contexts because the combined workers are constructed from the workers available to the program, and not to the context !!!!!!!!!!!!!!!!!!!!!!! */ static void peager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned nbasic_workers = starpu_worker_get_count(); unsigned ncombined_workers = starpu_combined_worker_get_count(); unsigned ntotal_workers = nbasic_workers + ncombined_workers; _starpu_sched_find_worker_combinations(workerids, nworkers); unsigned workerid, i; unsigned ncombinedworkers; ncombinedworkers = starpu_combined_worker_get_count(); /* Find the master of each worker. We first assign the worker as its * own master, and then iterate over the different worker combinations * to find the biggest combination containing this worker. */ for(i = 0; i < nworkers; i++) { workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); int cnt = possible_combinations_cnt[workerid]++; possible_combinations[workerid][cnt] = workerid; possible_combinations_size[workerid][cnt] = 1; data->master_id[workerid] = workerid; } for (i = 0; i < ncombinedworkers; i++) { workerid = ntotal_workers + i; /* Note that we ASSUME that the workers are sorted by size ! */ int *workers; int size; starpu_combined_worker_get_description(workerid, &size, &workers); int master = workers[0]; int j; for (j = 0; j < size; j++) { if (data->master_id[workers[j]] > master) data->master_id[workers[j]] = master; int cnt = possible_combinations_cnt[workers[j]]++; possible_combinations[workers[j]][cnt] = workerid; possible_combinations_size[workers[j]][cnt] = size; } } for(i = 0; i < nworkers; i++) { workerid = workerids[i]; /* slaves pick up tasks from their local queue, their master * will put tasks directly in that local list when a parallel * tasks comes. */ data->local_fifo[workerid] = _starpu_create_fifo(); } #if 0 for(i = 0; i < nworkers; i++) { workerid = workerids[i]; fprintf(stderr, "MASTER of %d = %d\n", workerid, master_id[workerid]); } #endif } static void peager_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid; unsigned i; for(i = 0; i < nworkers; i++) { workerid = workerids[i]; if(!starpu_worker_is_combined_worker(workerid)) _starpu_destroy_fifo(data->local_fifo[workerid]); } } static void initialize_peager_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_peager_data *data = (struct _starpu_peager_data*)malloc(sizeof(struct _starpu_peager_data)); /* masters pick tasks from that queue */ data->fifo = _starpu_create_fifo(); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_peager_policy(unsigned sched_ctx_id) { /* TODO check that there is no task left in the queue */ struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* deallocate the job queue */ _starpu_destroy_fifo(data->fifo); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int push_task_peager_policy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; int ret_val = -1; struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); ret_val = _starpu_fifo_push_task(data->fifo, task); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); /*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; if(workers->init_iterator) workers->init_iterator(workers, &it); #ifndef STARPU_NON_BLOCKING_DRIVERS int worker = -1; while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); int master = data->master_id[worker]; /* If this is not a CPU, then the worker simply grabs tasks from the fifo */ if (!starpu_worker_is_combined_worker(worker) && starpu_worker_get_type(worker) != STARPU_CPU_WORKER || master == worker) { 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); } } #endif return ret_val; } static struct starpu_task *pop_task_peager_policy(unsigned sched_ctx_id) { struct _starpu_peager_data *data = (struct _starpu_peager_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); int workerid = starpu_worker_get_id(); /* If this is not a CPU, then the worker simply grabs tasks from the fifo */ if (starpu_worker_get_type(workerid) != STARPU_CPU_WORKER) { struct starpu_task *task = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); task = _starpu_fifo_pop_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } int master = data->master_id[workerid]; if (master == workerid) { /* The worker is a master */ struct starpu_task *task = NULL; STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); task = _starpu_fifo_pop_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); if (!task) return NULL; /* Find the largest compatible worker combination */ int best_size = -1; int best_workerid = -1; int i; for (i = 0; i < possible_combinations_cnt[master]; i++) { if (possible_combinations_size[workerid][i] > best_size) { int combined_worker = possible_combinations[workerid][i]; if (starpu_combined_worker_can_execute_task(combined_worker, task, 0)) { best_size = possible_combinations_size[workerid][i]; best_workerid = combined_worker; } } } /* In case nobody can execute this task, we let the master * worker take it anyway, so that it can discard it afterward. * */ if (best_workerid == -1) return task; /* Is this a basic worker or a combined worker ? */ int nbasic_workers = (int)starpu_worker_get_count(); int is_basic_worker = (best_workerid < nbasic_workers); if (is_basic_worker) { /* The master is alone */ return task; } else { starpu_parallel_task_barrier_init(task, best_workerid); int worker_size = 0; int *combined_workerid; starpu_combined_worker_get_description(best_workerid, &worker_size, &combined_workerid); /* Dispatch task aliases to the different slaves */ for (i = 1; i < worker_size; i++) { struct starpu_task *alias = starpu_task_dup(task); int local_worker = combined_workerid[i]; alias->destroy = 1; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(local_worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); _starpu_fifo_push_task(data->local_fifo[local_worker], alias); #ifndef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_COND_SIGNAL(sched_cond); #endif STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } /* The master also manipulated an alias */ struct starpu_task *master_alias = starpu_task_dup(task); master_alias->destroy = 1; return master_alias; } } else { /* The worker is a slave */ return _starpu_fifo_pop_task(data->local_fifo[workerid], workerid); } } struct starpu_sched_policy _starpu_sched_peager_policy = { .init_sched = initialize_peager_policy, .deinit_sched = deinitialize_peager_policy, .add_workers = peager_add_workers, .remove_workers = peager_remove_workers, .push_task = push_task_peager_policy, .pop_task = pop_task_peager_policy, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "peager", .policy_description = "parallel eager policy" }; starpu-1.1.5/src/sched_policies/fifo_queues.h0000644000373600000000000000363212571536575016221 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* FIFO queues, ready for use by schedulers */ #ifndef __FIFO_QUEUES_H__ #define __FIFO_QUEUES_H__ #include struct _starpu_fifo_taskq { /* the actual list */ struct starpu_task_list taskq; /* the number of tasks currently in the queue */ unsigned ntasks; /* the number of tasks that were processed */ unsigned nprocessed; /* only meaningful if the queue is only used by a single worker */ double exp_start; /* Expected start date of first task in the queue */ 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 */ }; struct _starpu_fifo_taskq*_starpu_create_fifo(void); void _starpu_destroy_fifo(struct _starpu_fifo_taskq *fifo); int _starpu_fifo_empty(struct _starpu_fifo_taskq *fifo); 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); struct starpu_task *_starpu_fifo_pop_task(struct _starpu_fifo_taskq *fifo, int workerid); struct starpu_task *_starpu_fifo_pop_local_task(struct _starpu_fifo_taskq *fifo); struct starpu_task *_starpu_fifo_pop_every_task(struct _starpu_fifo_taskq *fifo, int workerid); #endif // __FIFO_QUEUES_H__ starpu-1.1.5/src/sched_policies/deque_queues.c0000644000373600000000000000732412571536575016376 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * 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. */ /* Deque queues, ready for use by schedulers */ #include #include #include #include struct _starpu_deque_jobq *_starpu_create_deque(void) { struct _starpu_deque_jobq *deque; deque = (struct _starpu_deque_jobq *) malloc(sizeof(struct _starpu_deque_jobq)); /* note that not all mechanisms (eg. the semaphore) have to be used */ _starpu_job_list_init(&deque->jobq); deque->njobs = 0; deque->nprocessed = 0; deque->exp_start = starpu_timing_now(); deque->exp_len = 0.0; deque->exp_end = deque->exp_start; return deque; } void _starpu_destroy_deque(struct _starpu_deque_jobq *deque) { free(deque); } unsigned _starpu_get_deque_njobs(struct _starpu_deque_jobq *deque_queue) { return deque_queue->njobs; } int _starpu_get_deque_nprocessed(struct _starpu_deque_jobq *deque_queue) { return deque_queue->nprocessed; } struct starpu_task *_starpu_deque_pop_task(struct _starpu_deque_jobq *deque_queue, int workerid) { struct _starpu_job *j = NULL; if ((deque_queue->njobs == 0) && _starpu_machine_is_running()) { return NULL; } /* TODO find a task that suits workerid */ for (j = _starpu_job_list_begin(&deque_queue->jobq); j != _starpu_job_list_end(&deque_queue->jobq); j = _starpu_job_list_next(j)) { unsigned nimpl; STARPU_ASSERT(j); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (starpu_worker_can_execute_task(workerid, j->task, nimpl)) { j->nimpl = nimpl; j = _starpu_job_list_pop_front(&deque_queue->jobq); return j->task; } } return NULL; } struct _starpu_job_list *_starpu_deque_pop_every_task(struct _starpu_deque_jobq *deque_queue, starpu_pthread_mutex_t *sched_mutex, int workerid) { struct _starpu_job_list *new_list, *old_list; /* block until some task is available in that queue */ STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); if (deque_queue->njobs == 0) { new_list = NULL; } else { /* there is a task */ old_list = &deque_queue->jobq; new_list = _starpu_job_list_new(); unsigned new_list_size = 0; struct _starpu_job *i; struct _starpu_job *next_job; /* note that this starts at the _head_ of the list, so we put * elements at the back of the new list */ for(i = _starpu_job_list_begin(old_list); i != _starpu_job_list_end(old_list); i = next_job) { unsigned nimpl; next_job = _starpu_job_list_next(i); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (starpu_worker_can_execute_task(workerid, i->task, nimpl)) { /* this elements can be moved into the new list */ new_list_size++; _starpu_job_list_erase(old_list, i); _starpu_job_list_push_back(new_list, i); i->nimpl = nimpl; } } if (new_list_size == 0) { /* the new list is empty ... */ _starpu_job_list_delete(new_list); new_list = NULL; } else { deque_queue->njobs -= new_list_size; } } STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); return new_list; } starpu-1.1.5/src/sched_policies/random_policy.c0000644000373600000000000000665512571536575016551 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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 #ifdef HAVE_AYUDAME_H #include #endif 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; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); int impl = 0; for(impl = 0; impl < STARPU_MAXIMPLEMENTATIONS; impl++) { if(starpu_worker_can_execute_task(worker, task, impl)) { enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(worker); double speedup = starpu_worker_get_relative_speedup(perf_arch); alpha_sum += speedup; speedup_arr[size] = speedup; worker_arr[size++] = worker; break; } } } double random = starpu_drand48()*alpha_sum; // _STARPU_DEBUG("my rand is %e\n", random); 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; } #ifdef HAVE_AYUDAME_H if (AYU_event) { intptr_t id = selected; AYU_event(AYU_ADDTASKTOQUEUE, _starpu_get_job_associated_to_task(task)->job_id, &id); } #endif return starpu_push_local_task(selected, task, prio); } static int random_push_task(struct starpu_task *task) { return _random_push_task(task, !!task->priority); } static void initialize_random_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); starpu_srand48(time(NULL)); } static void deinitialize_random_policy(unsigned sched_ctx_id) { starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_random_policy = { .init_sched = initialize_random_policy, .add_workers = NULL, .remove_workers = NULL, .deinit_sched = deinitialize_random_policy, .push_task = random_push_task, .pop_task = NULL, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "random", .policy_description = "weighted random based on worker overall performance" }; starpu-1.1.5/src/sched_policies/parallel_heft.c0000644000373600000000000004763512571536575016517 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Distributed queues using performance modeling to assign tasks */ #include #include #include #include #include #include #ifndef DBL_MIN #define DBL_MIN __DBL_MIN__ #endif #ifndef DBL_MAX #define DBL_MAX __DBL_MAX__ #endif /* if no priority is set when creating the scheduling context, we use the following ones */ #define DEFAULT_MIN_PRIORITY 0 #define DEFAULT_MAX_PRIORITY 1 //static unsigned ncombinedworkers; //static enum starpu_perfmodel_archtype applicable_perf_archtypes[STARPU_NARCH_VARIATIONS]; //static unsigned napplicable_perf_archtypes = 0; /* * Here are the default values of alpha, beta, gamma */ #define _STARPU_SCHED_ALPHA_DEFAULT 1.0 #define _STARPU_SCHED_BETA_DEFAULT 1.0 #define _STARPU_SCHED_GAMMA_DEFAULT 1000.0 struct _starpu_pheft_data { double alpha; double beta; double _gamma; double idle_power; /* When we push a task on a combined worker we need all the cpu workers it contains * to be locked at once */ starpu_pthread_mutex_t global_push_mutex; }; static double worker_exp_start[STARPU_NMAXWORKERS]; static double worker_exp_end[STARPU_NMAXWORKERS]; static double worker_exp_len[STARPU_NMAXWORKERS]; static int ntasks[STARPU_NMAXWORKERS]; /*!!!!!!! It doesn't work with several contexts because the combined workers are constructed from the workers available to the program, and not to the context !!!!!!!!!!!!!!!!!!!!!!! */ static void parallel_heft_pre_exec_hook(struct starpu_task *task) { if (!task->cl || task->execute_on_a_specific_worker) return; int workerid = starpu_worker_get_id(); double model = task->predicted; double transfer_model = task->predicted_transfer; if (isnan(model)) model = 0.0; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); /* Once we have executed the task, we can update the predicted amount * of work. */ STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); worker_exp_len[workerid] -= model + transfer_model; worker_exp_start[workerid] = starpu_timing_now() + model; worker_exp_end[workerid] = worker_exp_start[workerid] + worker_exp_len[workerid]; ntasks[workerid]--; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } static int push_task_on_best_worker(struct starpu_task *task, int best_workerid, double exp_end_predicted, int prio, unsigned sched_ctx_id) { /* make sure someone coule execute that task ! */ STARPU_ASSERT(best_workerid != -1); struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* Is this a basic worker or a combined worker ? */ unsigned memory_node; memory_node = starpu_worker_get_memory_node(best_workerid); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_on_node(task, memory_node); int ret = 0; if (!starpu_worker_is_combined_worker(best_workerid)) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(best_workerid, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); task->predicted = exp_end_predicted - worker_exp_end[best_workerid]; /* TODO */ task->predicted_transfer = 0; worker_exp_len[best_workerid] += task->predicted; worker_exp_end[best_workerid] = exp_end_predicted; worker_exp_start[best_workerid] = exp_end_predicted - worker_exp_len[best_workerid]; ntasks[best_workerid]++; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); /* We don't want it to interlace its task with a combined * worker's one */ STARPU_PTHREAD_MUTEX_LOCK(&hd->global_push_mutex); ret = starpu_push_local_task(best_workerid, task, prio); STARPU_PTHREAD_MUTEX_UNLOCK(&hd->global_push_mutex); } else { /* This task doesn't belong to an actual worker, it belongs * to a combined worker and thus the scheduler doesn't care * of its predicted values which are insignificant */ task->predicted = 0; task->predicted_transfer = 0; starpu_parallel_task_barrier_init(task, best_workerid); int worker_size = 0; int *combined_workerid; starpu_combined_worker_get_description(best_workerid, &worker_size, &combined_workerid); /* All cpu workers must be locked at once */ STARPU_PTHREAD_MUTEX_LOCK(&hd->global_push_mutex); /* This is a combined worker so we create task aliases */ int i; for (i = 0; i < worker_size; i++) { struct starpu_task *alias = starpu_task_dup(task); int local_worker = combined_workerid[i]; alias->predicted = exp_end_predicted - worker_exp_end[local_worker]; /* TODO */ alias->predicted_transfer = 0; alias->destroy = 1; starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(local_worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); worker_exp_len[local_worker] += alias->predicted; worker_exp_end[local_worker] = exp_end_predicted; worker_exp_start[local_worker] = exp_end_predicted - worker_exp_len[local_worker]; ntasks[local_worker]++; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); ret |= starpu_push_local_task(local_worker, alias, prio); } STARPU_PTHREAD_MUTEX_UNLOCK(&hd->global_push_mutex); } return ret; } static double compute_expected_end(int workerid, double length) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); if (!starpu_worker_is_combined_worker(workerid)) { double res; /* This is a basic worker */ /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ res = worker_exp_start[workerid] + worker_exp_len[workerid] + length; return res; } else { /* This is a combined worker, the expected end is the end for the latest worker */ int worker_size; int *combined_workerid; starpu_combined_worker_get_description(workerid, &worker_size, &combined_workerid); double exp_end = DBL_MIN; /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ int i; for (i = 0; i < worker_size; i++) { double local_exp_start = worker_exp_start[combined_workerid[i]]; double local_exp_len = worker_exp_len[combined_workerid[i]]; double local_exp_end = local_exp_start + local_exp_len + length; exp_end = STARPU_MAX(exp_end, local_exp_end); } return exp_end; } } static double compute_ntasks_end(int workerid) { enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(workerid); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); if (!starpu_worker_is_combined_worker(workerid)) { double res; /* This is a basic worker */ /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ res = ntasks[workerid] / starpu_worker_get_relative_speedup(perf_arch); return res; } else { /* This is a combined worker, the expected end is the end for the latest worker */ int worker_size; int *combined_workerid; starpu_combined_worker_get_description(workerid, &worker_size, &combined_workerid); int ntasks_end=0; /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ int i; for (i = 0; i < worker_size; i++) { /* XXX: this is actually bogus: not all pushed tasks are necessarily parallel... */ ntasks_end = STARPU_MAX(ntasks_end, (int) ((double) ntasks[combined_workerid[i]] / starpu_worker_get_relative_speedup(perf_arch))); } return ntasks_end; } } static int _parallel_heft_push_task(struct starpu_task *task, unsigned prio, unsigned sched_ctx_id) { struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); unsigned nworkers_ctx = workers->nworkers; unsigned worker, worker_ctx = 0; int best = -1, best_id_ctx = -1; /* this flag is set if the corresponding worker is selected because there is no performance prediction available yet */ int forced_best = -1, forced_best_ctx = -1, forced_nimpl = -1; double local_task_length[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_data_penalty[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_power[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double local_exp_end[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double fitness[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double max_exp_end = 0.0; int skip_worker[nworkers_ctx][STARPU_MAXIMPLEMENTATIONS]; double best_exp_end = DBL_MAX; //double penality_best = 0.0; int ntasks_best = -1, ntasks_best_ctx = -1, nimpl_best = -1; double ntasks_best_end = 0.0; int calibrating = 0; /* A priori, we know all estimations */ int unknown = 0; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if(!starpu_worker_is_combined_worker(worker)) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); /* Sometimes workers didn't take the tasks as early as we expected */ STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); worker_exp_start[worker] = STARPU_MAX(worker_exp_start[worker], starpu_timing_now()); worker_exp_end[worker] = worker_exp_start[worker] + worker_exp_len[worker]; if (worker_exp_end[worker] > max_exp_end) max_exp_end = worker_exp_end[worker]; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } } unsigned nimpl; worker_ctx = 0; while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (!starpu_combined_worker_can_execute_task(worker, task, nimpl)) { /* no one on that queue may execute this task */ skip_worker[worker_ctx][nimpl] = 1; continue; } else { skip_worker[worker_ctx][nimpl] = 0; } enum starpu_perfmodel_archtype perf_arch = starpu_worker_get_perf_archtype(worker); local_task_length[worker_ctx][nimpl] = starpu_task_expected_length(task, perf_arch,nimpl); unsigned memory_node = starpu_worker_get_memory_node(worker); local_data_penalty[worker_ctx][nimpl] = starpu_task_expected_data_transfer_time(memory_node, task); double ntasks_end = compute_ntasks_end(worker); if (ntasks_best == -1 || (!calibrating && ntasks_end < ntasks_best_end) /* Not calibrating, take better task */ || (!calibrating && isnan(local_task_length[worker_ctx][nimpl])) /* Not calibrating but this worker is being calibrated */ || (calibrating && isnan(local_task_length[worker_ctx][nimpl]) && ntasks_end < ntasks_best_end) /* Calibrating, compete this worker with other non-calibrated */ ) { ntasks_best_end = ntasks_end; ntasks_best = worker; ntasks_best_ctx = worker_ctx; nimpl_best = nimpl; } if (isnan(local_task_length[worker_ctx][nimpl])) /* we are calibrating, we want to speed-up calibration time * so we privilege non-calibrated tasks (but still * greedily distribute them to avoid dumb schedules) */ calibrating = 1; if (isnan(local_task_length[worker_ctx][nimpl]) || _STARPU_IS_ZERO(local_task_length[worker_ctx][nimpl])) /* there is no prediction available for that task * with that arch yet, so switch to a greedy strategy */ unknown = 1; if (unknown) continue; local_exp_end[worker_ctx][nimpl] = compute_expected_end(worker, local_task_length[worker_ctx][nimpl]); //fprintf(stderr, "WORKER %d -> length %e end %e\n", worker, local_task_length[worker_ctx][nimpl], local_exp_end[worker][nimpl]); if (local_exp_end[worker_ctx][nimpl] < best_exp_end) { /* a better solution was found */ best_exp_end = local_exp_end[worker_ctx][nimpl]; nimpl_best = nimpl; } local_power[worker_ctx][nimpl] = starpu_task_expected_power(task, perf_arch,nimpl); //_STARPU_DEBUG("Scheduler parallel heft: task length (%lf) local power (%lf) worker (%u) kernel (%u) \n", local_task_length[worker],local_power[worker],worker,nimpl); if (isnan(local_power[worker_ctx][nimpl])) local_power[worker_ctx][nimpl] = 0.; } worker_ctx++; } if (unknown) { forced_best = ntasks_best; forced_best_ctx = ntasks_best_ctx; forced_nimpl = nimpl_best; } double best_fitness = -1; if (forced_best == -1) { worker_ctx = 0; while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (skip_worker[worker_ctx][nimpl]) { /* no one on that queue may execute this task */ continue; } fitness[worker_ctx][nimpl] = hd->alpha*(local_exp_end[worker_ctx][nimpl] - best_exp_end) + hd->beta*(local_data_penalty[worker_ctx][nimpl]) + hd->_gamma*(local_power[worker_ctx][nimpl]); if (local_exp_end[worker_ctx][nimpl] > max_exp_end) /* This placement will make the computation * longer, take into account the idle * consumption of other cpus */ fitness[worker_ctx][nimpl] += hd->_gamma * hd->idle_power * (local_exp_end[worker_ctx][nimpl] - max_exp_end) / 1000000.0; if (best == -1 || fitness[worker_ctx][nimpl] < best_fitness) { /* we found a better solution */ best_fitness = fitness[worker_ctx][nimpl]; best = worker; best_id_ctx = worker_ctx; nimpl_best = nimpl; } // fprintf(stderr, "FITNESS worker %d -> %e local_exp_end %e - local_data_penalty %e\n", worker, fitness[worker][nimpl], local_exp_end[worker][nimpl] - best_exp_end, local_data_penalty[worker][nimpl]); } worker_ctx++; } } STARPU_ASSERT(forced_best != -1 || best != -1); if (forced_best != -1) { /* there is no prediction available for that task * with that arch we want to speed-up calibration time * so we force this measurement */ best = forced_best; best_id_ctx = forced_best_ctx; nimpl_best = forced_nimpl; //penality_best = 0.0; best_exp_end = compute_expected_end(best, 0); } else { //penality_best = local_data_penalty[best_id_ctx][nimpl_best]; best_exp_end = local_exp_end[best_id_ctx][nimpl_best]; } //_STARPU_DEBUG("Scheduler parallel heft: kernel (%u)\n", nimpl_best); _starpu_get_job_associated_to_task(task)->nimpl = nimpl_best; /* we should now have the best worker in variable "best" */ return push_task_on_best_worker(task, best, best_exp_end, prio, sched_ctx_id); } static int parallel_heft_push_task(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; int ret_val = -1; if (task->priority == STARPU_MAX_PRIO) { ret_val = _parallel_heft_push_task(task, 1, sched_ctx_id); return ret_val; } ret_val = _parallel_heft_push_task(task, 0, sched_ctx_id); return ret_val; } static void parallel_heft_add_workers(__attribute__((unused)) unsigned sched_ctx_id, int *workerids, unsigned nworkers) { int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; struct _starpu_worker *workerarg = _starpu_get_worker_struct(workerid); /* init these structures only once for each worker */ if(!workerarg->has_prev_init) { worker_exp_start[workerid] = starpu_timing_now(); worker_exp_len[workerid] = 0.0; worker_exp_end[workerid] = worker_exp_start[workerid]; ntasks[workerid] = 0; workerarg->has_prev_init = 1; } } _starpu_sched_find_worker_combinations(workerids, nworkers); // start_unclear_part: not very clear where this is used /* struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); */ /* ncombinedworkers = config->topology.ncombinedworkers; */ /* /\* We pre-compute an array of all the perfmodel archs that are applicable *\/ */ /* unsigned total_worker_count = nworkers + ncombinedworkers; */ /* unsigned used_perf_archtypes[STARPU_NARCH_VARIATIONS]; */ /* memset(used_perf_archtypes, 0, sizeof(used_perf_archtypes)); */ /* for (workerid = 0; workerid < total_worker_count; workerid++) */ /* { */ /* enum starpu_perfmodel_archtype perf_archtype = starpu_worker_get_perf_archtype(workerid); */ /* used_perf_archtypes[perf_archtype] = 1; */ /* } */ // end_unclear_part // napplicable_perf_archtypes = 0; // int arch; // for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) // { // if (used_perf_archtypes[arch]) // applicable_perf_archtypes[napplicable_perf_archtypes++] = arch; // } } static void initialize_parallel_heft_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)malloc(sizeof(struct _starpu_pheft_data)); hd->alpha = _STARPU_SCHED_ALPHA_DEFAULT; hd->beta = _STARPU_SCHED_BETA_DEFAULT; hd->_gamma = _STARPU_SCHED_GAMMA_DEFAULT; hd->idle_power = 0.0; 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); const char *strval_alpha = starpu_getenv("STARPU_SCHED_ALPHA"); if (strval_alpha) hd->alpha = atof(strval_alpha); const char *strval_beta = starpu_getenv("STARPU_SCHED_BETA"); if (strval_beta) hd->beta = atof(strval_beta); const char *strval_gamma = starpu_getenv("STARPU_SCHED_GAMMA"); if (strval_gamma) hd->_gamma = atof(strval_gamma); const char *strval_idle_power = starpu_getenv("STARPU_IDLE_POWER"); if (strval_idle_power) hd->idle_power = atof(strval_idle_power); STARPU_PTHREAD_MUTEX_INIT(&hd->global_push_mutex, NULL); /* Tell helgrind that we are fine with getting outdated values when * estimating schedules */ STARPU_HG_DISABLE_CHECKING(worker_exp_start); STARPU_HG_DISABLE_CHECKING(worker_exp_end); STARPU_HG_DISABLE_CHECKING(worker_exp_len); STARPU_HG_DISABLE_CHECKING(ntasks); } static void parallel_heft_deinit(unsigned sched_ctx_id) { struct _starpu_pheft_data *hd = (struct _starpu_pheft_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&hd->global_push_mutex); free(hd); } /* TODO: use post_exec_hook to fix the expected start */ struct starpu_sched_policy _starpu_sched_parallel_heft_policy = { .init_sched = initialize_parallel_heft_policy, .deinit_sched = parallel_heft_deinit, .add_workers = parallel_heft_add_workers, .remove_workers = NULL, .push_task = parallel_heft_push_task, .pop_task = NULL, .pre_exec_hook = parallel_heft_pre_exec_hook, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "pheft", .policy_description = "parallel HEFT" }; starpu-1.1.5/src/sched_policies/stack_queues.c0000644000373600000000000000600612571536575016374 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Stack queues, ready for use by schedulers */ #include #include #include #include #include /* keep track of the total number of jobs to be scheduled to avoid infinite * polling when there are really few jobs in the overall queue */ static unsigned total_number_of_jobs; void _starpu_init_stack_queues_mechanisms(void) { total_number_of_jobs = 0; } struct _starpu_stack_jobq *_starpu_create_stack(void) { struct _starpu_stack_jobq *stack; stack = (struct _starpu_stack_jobq *) malloc(sizeof(struct _starpu_stack_jobq)); _starpu_job_list_init(&stack->jobq); stack->njobs = 0; stack->nprocessed = 0; stack->exp_start = starpu_timing_now(); stack->exp_len = 0.0; stack->exp_end = stack->exp_start; return stack; } unsigned _starpu_get_stack_njobs(struct _starpu_stack_jobq *stack_queue) { return stack_queue->njobs; } unsigned _starpu_get_stack_nprocessed(struct _starpu_stack_jobq *stack_queue) { return stack_queue->nprocessed; } void _starpu_stack_push_task(struct _starpu_stack_jobq *stack_queue, starpu_pthread_mutex_t *sched_mutex, starpu_pthread_cond_t *sched_cond STARPU_ATTRIBUTE_UNUSED, struct _starpu_job *task) { STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); total_number_of_jobs++; if (task->task->priority) _starpu_job_list_push_back(&stack_queue->jobq, task); else _starpu_job_list_push_front(&stack_queue->jobq, task); stack_queue->njobs++; stack_queue->nprocessed++; #ifndef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_COND_SIGNAL(sched_cond); #endif STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } struct _starpu_job *_starpu_stack_pop_task(struct _starpu_stack_jobq *stack_queue, starpu_pthread_mutex_t *sched_mutex, int workerid STARPU_ATTRIBUTE_UNUSED) { struct _starpu_job *j = NULL; if (stack_queue->njobs == 0) return NULL; /* TODO find a task that suits workerid */ if (stack_queue->njobs > 0) { /* there is a task */ j = _starpu_job_list_pop_back(&stack_queue->jobq); STARPU_ASSERT(j); stack_queue->njobs--; /* we are sure that we got it now, so at worst, some people thought * there remained some work and will soon discover it is not true */ STARPU_PTHREAD_MUTEX_LOCK(sched_mutex); total_number_of_jobs--; STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } return j; } starpu-1.1.5/src/sched_policies/eager_central_priority_policy.c0000644000373600000000000002407312571536575022017 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is policy where every worker use the same JOB QUEUE, but taking * task priorities into account */ #include #include #include #include #define DEFAULT_MIN_LEVEL (-5) #define DEFAULT_MAX_LEVEL (+5) struct _starpu_priority_taskq { int min_prio; int max_prio; /* the actual lists * taskq[p] is for priority [p - STARPU_MIN_PRIO] */ struct starpu_task_list *taskq; unsigned *ntasks; unsigned total_ntasks; }; struct _starpu_eager_central_prio_data { struct _starpu_priority_taskq *taskq; starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; }; /* * Centralized queue with priorities */ static struct _starpu_priority_taskq *_starpu_create_priority_taskq(int min_prio, int max_prio) { struct _starpu_priority_taskq *central_queue; central_queue = (struct _starpu_priority_taskq *) malloc(sizeof(struct _starpu_priority_taskq)); central_queue->min_prio = min_prio; central_queue->max_prio = max_prio; central_queue->total_ntasks = 0; central_queue->taskq = malloc((max_prio-min_prio+1) * sizeof(struct starpu_task_list)); central_queue->ntasks = malloc((max_prio-min_prio+1) * sizeof(unsigned)); int prio; for (prio = 0; prio < (max_prio-min_prio+1); prio++) { starpu_task_list_init(¢ral_queue->taskq[prio]); central_queue->ntasks[prio] = 0; } return central_queue; } static void _starpu_destroy_priority_taskq(struct _starpu_priority_taskq *priority_queue) { free(priority_queue->ntasks); free(priority_queue->taskq); free(priority_queue); } static void initialize_eager_center_priority_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)malloc(sizeof(struct _starpu_eager_central_prio_data)); /* In this policy, we support more than two levels of priority. */ if (starpu_sched_ctx_min_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_min_priority(sched_ctx_id, DEFAULT_MIN_LEVEL); if (starpu_sched_ctx_max_priority_is_set(sched_ctx_id) == 0) starpu_sched_ctx_set_max_priority(sched_ctx_id, DEFAULT_MAX_LEVEL); /* only a single queue (even though there are several internaly) */ data->taskq = _starpu_create_priority_taskq(starpu_sched_ctx_get_min_priority(sched_ctx_id), starpu_sched_ctx_get_max_priority(sched_ctx_id)); data->waiters = starpu_bitmap_create(); /* Tell helgrind that it's fine to check for empty fifo in * _starpu_priority_pop_task without actual mutex (it's just an * integer) */ STARPU_HG_DISABLE_CHECKING(data->taskq->total_ntasks); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_eager_center_priority_policy(unsigned sched_ctx_id) { /* TODO check that there is no task left in the queue */ struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* deallocate the task queue */ _starpu_destroy_priority_taskq(data->taskq); starpu_bitmap_destroy(data->waiters); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int _starpu_priority_push_task(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_priority_taskq *taskq = data->taskq; STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); unsigned priolevel = task->priority - STARPU_MIN_PRIO; starpu_task_list_push_back(&taskq->taskq[priolevel], task); taskq->ntasks[priolevel]++; taskq->total_ntasks++; starpu_push_task_end(task); /*if there are no tasks block */ /* wake people waiting for a task */ unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; #ifndef STARPU_NON_BLOCKING_DRIVERS char dowake[STARPU_NMAXWORKERS] = { 0 }; #endif if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { 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 unsigned nimpl; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (starpu_worker_can_execute_task(worker, task, nimpl)) { /* It can execute this one, tell him! */ #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); /* We really woke at least somebody, no need to wake somebody else */ break; #else dowake[worker] = 1; #endif } } /* Let the task free */ STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* Now that we have a list of potential workers, try to wake one */ if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (dowake[worker]) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); if (starpu_wakeup_worker(worker, sched_cond, sched_mutex)) break; // wake up a single worker } } #endif return 0; } static struct starpu_task *_starpu_priority_pop_task(unsigned sched_ctx_id) { struct starpu_task *chosen_task = NULL, *task, *nexttask; unsigned workerid = starpu_worker_get_id(); int skipped = 0; struct _starpu_eager_central_prio_data *data = (struct _starpu_eager_central_prio_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); struct _starpu_priority_taskq *taskq = data->taskq; /* block until some event happens */ /* Here helgrind would shout that this is unprotected, this is just an * integer access, and we hold the sched mutex, so we can not miss any * wake up. */ if (!STARPU_RUNNING_ON_VALGRIND && taskq->total_ntasks == 0) return NULL; #ifdef STARPU_NON_BLOCKING_DRIVERS if (!STARPU_RUNNING_ON_VALGRIND && starpu_bitmap_get(data->waiters, workerid)) /* Nobody woke us, avoid bothering the mutex */ return NULL; #endif /* release this mutex before trying to wake up other workers */ starpu_pthread_mutex_t *curr_sched_mutex; starpu_pthread_cond_t *curr_sched_cond; starpu_worker_get_sched_condition(workerid, &curr_sched_mutex, &curr_sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK(curr_sched_mutex); /* all workers will block on this mutex anyway so there's no need for their own mutex to be locked */ STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); unsigned priolevel = taskq->max_prio - taskq->min_prio; do { if (taskq->ntasks[priolevel] > 0) { for (task = starpu_task_list_begin(&taskq->taskq[priolevel]); task != starpu_task_list_end(&taskq->taskq[priolevel]) && !chosen_task; task = nexttask) { unsigned nimpl; nexttask = starpu_task_list_next(task); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { if (starpu_worker_can_execute_task(workerid, task, nimpl)) { /* there is some task that we can grab */ starpu_task_set_implementation(task, nimpl); starpu_task_list_erase(&taskq->taskq[priolevel], task); chosen_task = task; taskq->ntasks[priolevel]--; taskq->total_ntasks--; break; } else skipped = 1; } } } } while (!chosen_task && priolevel-- > 0); if (!chosen_task && skipped) { /* Notify another worker to do that task */ unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if(worker != workerid) { #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); #else starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); STARPU_PTHREAD_COND_SIGNAL(sched_cond); #endif } } } if (!chosen_task) /* Tell pushers that we are waiting for tasks for us */ starpu_bitmap_set(data->waiters, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); /* leave the mutex how it was found before this */ STARPU_PTHREAD_MUTEX_LOCK(curr_sched_mutex); return chosen_task; } static void eager_center_priority_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); } } struct starpu_sched_policy _starpu_sched_prio_policy = { .add_workers = eager_center_priority_add_workers, .init_sched = initialize_eager_center_priority_policy, .deinit_sched = deinitialize_eager_center_priority_policy, /* we always use priorities in that policy */ .push_task = _starpu_priority_push_task, .pop_task = _starpu_priority_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "prio", .policy_description = "eager (with priorities)" }; starpu-1.1.5/src/sched_policies/work_stealing_policy.c0000644000373600000000000003250412571536575020131 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011, 2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Work stealing policy */ #include #include #include #include #ifdef HAVE_AYUDAME_H #include #endif struct _starpu_work_stealing_data { struct _starpu_deque_jobq **queue_array; unsigned rr_worker; /* keep track of the work performed from the beginning of the algorithm to make * better decisions about which queue to select when stealing or deferring work */ unsigned performed_total; unsigned last_pop_worker; unsigned last_push_worker; }; #ifdef USE_OVERLOAD /** * Minimum number of task we wait for being processed before we start assuming * on which worker the computation would be faster. */ static int calibration_value = 0; #endif /* USE_OVERLOAD */ /** * Return a worker from which a task can be stolen. * Selecting a worker is done in a round-robin fashion, unless * the worker previously selected doesn't own any task, * then we return the first non-empty worker. */ static unsigned select_victim_round_robin(unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker = ws->last_pop_worker; unsigned nworkers = starpu_sched_ctx_get_nworkers(sched_ctx_id); starpu_pthread_mutex_t *victim_sched_mutex; starpu_pthread_cond_t *victim_sched_cond; /* If the worker's queue is empty, let's try * the next ones */ while (1) { unsigned njobs; starpu_worker_get_sched_condition(worker, &victim_sched_mutex, &victim_sched_cond); /* Here helgrind would shout that this is unprotected, but we * are fine with getting outdated values, this is just an * estimation */ njobs = ws->queue_array[worker]->njobs; if (njobs) break; worker = (worker + 1) % nworkers; if (worker == ws->last_pop_worker) { /* We got back to the first worker, * don't go in infinite loop */ break; } } ws->last_pop_worker = (worker + 1) % nworkers; return worker; } /** * Return a worker to whom add a task. * Selecting a worker is done in a round-robin fashion. */ static unsigned select_worker_round_robin(unsigned sched_ctx_id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned worker = ws->last_push_worker; unsigned nworkers = starpu_sched_ctx_get_nworkers(sched_ctx_id); ws->last_push_worker = (ws->last_push_worker + 1) % nworkers; return worker; } #ifdef USE_OVERLOAD /** * Return a ratio helpful to determine whether a worker is suitable to steal * tasks from or to put some tasks in its queue. * * \return a ratio with a positive or negative value, describing the current state of the worker : * a smaller value implies a faster worker with an relatively emptier queue : more suitable to put tasks in * a bigger value implies a slower worker with an reletively more replete queue : more suitable to steal tasks from */ static float overload_metric(unsigned sched_ctx_id, unsigned id) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); float execution_ratio = 0.0f; float current_ratio = 0.0f; int nprocessed = _starpu_get_deque_nprocessed(ws->queue_array[id]); unsigned njobs = _starpu_get_deque_njobs(ws->queue_array[id]); /* Did we get enough information ? */ if (performed_total > 0 && nprocessed > 0) { /* How fast or slow is the worker compared to the other workers */ execution_ratio = (float) nprocessed / 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 unsigned select_victim_overload(unsigned sched_ctx_id) { unsigned worker; float worker_ratio; unsigned best_worker = 0; float best_ratio = FLT_MIN; /* Don't try to play smart until we get * enough informations. */ if (performed_total < calibration_value) return select_victim_round_robin(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); worker_ratio = overload_metric(sched_ctx_id, worker); if (worker_ratio > best_ratio) { 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(unsigned sched_ctx_id) { unsigned worker; float worker_ratio; unsigned best_worker = 0; float best_ratio = FLT_MAX; /* Don't try to play smart until we get * enough informations. */ if (performed_total < calibration_value) return select_worker_round_robin(sched_ctx_id); struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); worker_ratio = overload_metric(sched_ctx_id, worker); if (worker_ratio < best_ratio) { 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 unsigned select_victim(unsigned sched_ctx_id) { #ifdef USE_OVERLOAD return select_victim_overload(sched_ctx_id); #else return select_victim_round_robin(sched_ctx_id); #endif /* USE_OVERLOAD */ } /** * Return a worker from which a task can be stolen. * This is a phony function used to call the right * function depending on the value of USE_OVERLOAD. */ static inline unsigned select_worker(unsigned sched_ctx_id) { #ifdef USE_OVERLOAD return select_worker_overload(sched_ctx_id); #else return select_worker_round_robin(sched_ctx_id); #endif /* USE_OVERLOAD */ } #ifdef STARPU_DEVEL #warning TODO rewrite ... this will not scale at all now #endif 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; struct _starpu_deque_jobq *q; int workerid = starpu_worker_get_id(); STARPU_ASSERT(workerid != -1); q = ws->queue_array[workerid]; task = _starpu_deque_pop_task(q, workerid); if (task) { /* there was a local task */ ws->performed_total++; q->nprocessed++; q->njobs--; return task; } starpu_pthread_mutex_t *worker_sched_mutex; starpu_pthread_cond_t *worker_sched_cond; starpu_worker_get_sched_condition(workerid, &worker_sched_mutex, &worker_sched_cond); STARPU_PTHREAD_MUTEX_UNLOCK(worker_sched_mutex); /* we need to steal someone's job */ unsigned victim = select_victim(sched_ctx_id); starpu_pthread_mutex_t *victim_sched_mutex; starpu_pthread_cond_t *victim_sched_cond; starpu_worker_get_sched_condition(victim, &victim_sched_mutex, &victim_sched_cond); STARPU_PTHREAD_MUTEX_LOCK(victim_sched_mutex); struct _starpu_deque_jobq *victimq = ws->queue_array[victim]; task = _starpu_deque_pop_task(victimq, workerid); if (task) { _STARPU_TRACE_WORK_STEALING(q, workerid); ws->performed_total++; /* Beware : we have to increase the number of processed tasks of * the stealer, not the victim ! */ q->nprocessed++; victimq->njobs--; } STARPU_PTHREAD_MUTEX_UNLOCK(victim_sched_mutex); STARPU_PTHREAD_MUTEX_LOCK(worker_sched_mutex); if(!task) { task = _starpu_deque_pop_task(q, workerid); if (task) { /* there was a local task */ ws->performed_total++; q->nprocessed++; q->njobs--; return 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); struct _starpu_deque_jobq *deque_queue; struct _starpu_job *j = _starpu_get_job_associated_to_task(task); int workerid = starpu_worker_get_id(); unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); 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); } /* If the current thread is not a worker but * the main thread (-1), we find the better one to * put task on its queue */ if (workerid == -1) workerid = select_worker(sched_ctx_id); deque_queue = ws->queue_array[workerid]; #ifdef HAVE_AYUDAME_H if (AYU_event) { intptr_t id = workerid; AYU_event(AYU_ADDTASKTOQUEUE, j->job_id, &id); } #endif _starpu_job_list_push_back(&deque_queue->jobq, j); deque_queue->njobs++; starpu_push_task_end(task); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); #ifndef STARPU_NON_BLOCKING_DRIVERS STARPU_PTHREAD_COND_SIGNAL(sched_cond); #endif STARPU_PTHREAD_MUTEX_UNLOCK(sched_mutex); } return 0; } static void ws_add_workers(unsigned sched_ctx_id, int *workerids,unsigned nworkers) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; int workerid; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); ws->queue_array[workerid] = _starpu_create_deque(); /* Tell helgrid that we are fine with getting outdated values, * this is just an estimation */ STARPU_HG_DISABLE_CHECKING(ws->queue_array[workerid]->njobs); /** * The first WS_POP_TASK will increase NPROCESSED though no task was actually performed yet, * we need to initialize it at -1. */ ws->queue_array[workerid]->nprocessed = -1; ws->queue_array[workerid]->njobs = 0; } } static void ws_remove_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); unsigned i; int workerid; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; _starpu_destroy_deque(ws->queue_array[workerid]); } } static void initialize_ws_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_work_stealing_data *ws = (struct _starpu_work_stealing_data*)malloc(sizeof(struct _starpu_work_stealing_data)); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)ws); ws->last_pop_worker = 0; ws->last_push_worker = 0; /** * The first WS_POP_TASK will increase PERFORMED_TOTAL though no task was actually performed yet, * we need to initialize it at -1. */ ws->performed_total = -1; ws->queue_array = (struct _starpu_deque_jobq**)malloc(STARPU_NMAXWORKERS*sizeof(struct _starpu_deque_jobq*)); } 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->queue_array); free(ws); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); } struct starpu_sched_policy _starpu_sched_ws_policy = { .init_sched = initialize_ws_policy, .deinit_sched = deinit_ws_policy, .add_workers = ws_add_workers, .remove_workers = ws_remove_workers, .push_task = ws_push_task, .pop_task = ws_pop_task, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = NULL, .policy_name = "ws", .policy_description = "work stealing" }; starpu-1.1.5/src/sched_policies/fifo_queues.c0000644000373600000000000001243012571536575016210 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* FIFO queues, ready for use by schedulers */ #include #include #include struct _starpu_fifo_taskq *_starpu_create_fifo(void) { struct _starpu_fifo_taskq *fifo; fifo = (struct _starpu_fifo_taskq *) malloc(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; 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; } 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 { 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; } 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)) { unsigned nimpl; STARPU_ASSERT(task); for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (starpu_worker_can_execute_task(workerid, task, nimpl)) { starpu_task_set_implementation(task, nimpl); starpu_task_list_erase(&fifo_queue->taskq, task); fifo_queue->ntasks--; 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) { struct starpu_task_list *old_list; unsigned size; struct starpu_task *new_list = NULL; struct starpu_task *new_list_tail = NULL; size = fifo_queue->ntasks; if (size > 0) { old_list = &fifo_queue->taskq; 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; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (starpu_worker_can_execute_task(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); break; } task = next_task; } fifo_queue->ntasks -= new_list_size; } return new_list; } starpu-1.1.5/src/sched_policies/deque_queues.h0000644000373600000000000000347712571536575016410 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* Deque queues, ready for use by schedulers */ #ifndef __DEQUE_QUEUES_H__ #define __DEQUE_QUEUES_H__ #include #include struct _starpu_deque_jobq { /* the actual list */ struct _starpu_job_list jobq; /* the number of tasks currently in the queue */ unsigned njobs; /* the number of tasks that were processed */ int nprocessed; /* only meaningful if the queue is only used by a single worker */ double exp_start; /* Expected start date of first task in the queue */ 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 */ }; struct _starpu_deque_jobq *_starpu_create_deque(void); void _starpu_destroy_deque(struct _starpu_deque_jobq *deque); struct starpu_task *_starpu_deque_pop_task(struct _starpu_deque_jobq *deque_queue, int workerid); struct _starpu_job_list *_starpu_deque_pop_every_task(struct _starpu_deque_jobq *deque_queue, starpu_pthread_mutex_t *sched_mutex, int workerid); unsigned _starpu_get_deque_njobs(struct _starpu_deque_jobq *deque_queue); int _starpu_get_deque_nprocessed(struct _starpu_deque_jobq *deque_queue); #endif // __DEQUE_QUEUES_H__ starpu-1.1.5/src/sched_policies/eager_central_policy.c0000644000373600000000000001612512571536575020055 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ /* * This is just the trivial policy where every worker use the same * JOB QUEUE. */ #include #include #include #include struct _starpu_eager_center_policy_data { struct _starpu_fifo_taskq *fifo; starpu_pthread_mutex_t policy_mutex; struct starpu_bitmap *waiters; }; static void initialize_eager_center_policy(unsigned sched_ctx_id) { starpu_sched_ctx_create_worker_collection(sched_ctx_id, STARPU_WORKER_LIST); struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)malloc(sizeof(struct _starpu_eager_center_policy_data)); _STARPU_DISP("Warning: you are running the default eager scheduler, which is not very smart. Make sure to read the StarPU documentation about adding performance models in order to be able to use the dmda or dmdas scheduler instead.\n"); /* there is only a single queue in that trivial design */ data->fifo = _starpu_create_fifo(); data->waiters = starpu_bitmap_create(); /* Tell helgrind that it's fine to check for empty fifo in * pop_task_eager_policy without actual mutex (it's just an integer) */ STARPU_HG_DISABLE_CHECKING(data->fifo->ntasks); starpu_sched_ctx_set_policy_data(sched_ctx_id, (void*)data); STARPU_PTHREAD_MUTEX_INIT(&data->policy_mutex, NULL); } static void deinitialize_eager_center_policy(unsigned sched_ctx_id) { /* TODO check that there is no task left in the queue */ struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); /* deallocate the job queue */ _starpu_destroy_fifo(data->fifo); starpu_bitmap_destroy(data->waiters); starpu_sched_ctx_delete_worker_collection(sched_ctx_id); STARPU_PTHREAD_MUTEX_DESTROY(&data->policy_mutex); free(data); } static int push_task_eager_policy(struct starpu_task *task) { unsigned sched_ctx_id = task->sched_ctx; struct _starpu_eager_center_policy_data *data = (struct _starpu_eager_center_policy_data*)starpu_sched_ctx_get_policy_data(sched_ctx_id); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); starpu_task_list_push_back(&data->fifo->taskq,task); data->fifo->ntasks++; data->fifo->nprocessed++; starpu_push_task_end(task); /*if there are no tasks block */ /* wake people waiting for a task */ unsigned worker = 0; struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); struct starpu_sched_ctx_iterator it; #ifndef STARPU_NON_BLOCKING_DRIVERS char dowake[STARPU_NMAXWORKERS] = { 0 }; #endif if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { 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 unsigned nimpl; for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (starpu_worker_can_execute_task(worker, task, nimpl)) { /* It can execute this one, tell him! */ #ifdef STARPU_NON_BLOCKING_DRIVERS starpu_bitmap_unset(data->waiters, worker); /* We really woke at least somebody, no need to wake somebody else */ break; #else dowake[worker] = 1; #endif } } /* Let the task free */ STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); #ifndef STARPU_NON_BLOCKING_DRIVERS /* Now that we have a list of potential workers, try to wake one */ if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if (dowake[worker]) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(worker, &sched_mutex, &sched_cond); if (starpu_wakeup_worker(worker, sched_cond, sched_mutex)) 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); int workerid = starpu_worker_get_id(); STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); struct starpu_task* task = _starpu_fifo_pop_every_task(data->fifo, workerid); STARPU_PTHREAD_MUTEX_UNLOCK(&data->policy_mutex); return task; } static struct starpu_task *pop_task_eager_policy(unsigned sched_ctx_id) { unsigned workerid = starpu_worker_get_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_task *task = NULL; /* block until some event happens */ /* Here helgrind would shout that this is unprotected, this is just an * integer access, and we hold the sched mutex, so we can not miss any * wake up. */ if (!STARPU_RUNNING_ON_VALGRIND && _starpu_fifo_empty(data->fifo)) return NULL; #ifdef STARPU_NON_BLOCKING_DRIVERS if (!STARPU_RUNNING_ON_VALGRIND && starpu_bitmap_get(data->waiters, workerid)) /* Nobody woke us, avoid bothering the mutex */ return NULL; #endif STARPU_PTHREAD_MUTEX_LOCK(&data->policy_mutex); task = _starpu_fifo_pop_task(data->fifo, workerid); if (!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 task; } static void eager_add_workers(unsigned sched_ctx_id, int *workerids, unsigned nworkers) { int workerid; unsigned i; for (i = 0; i < nworkers; i++) { workerid = workerids[i]; int curr_workerid = starpu_worker_get_id(); if(workerid != curr_workerid) { starpu_pthread_mutex_t *sched_mutex; starpu_pthread_cond_t *sched_cond; starpu_worker_get_sched_condition(workerid, &sched_mutex, &sched_cond); starpu_wakeup_worker(workerid, sched_cond, sched_mutex); } starpu_sched_ctx_worker_shares_tasks_lists(workerid, sched_ctx_id); } } struct starpu_sched_policy _starpu_sched_eager_policy = { .init_sched = initialize_eager_center_policy, .deinit_sched = deinitialize_eager_center_policy, .add_workers = eager_add_workers, .remove_workers = NULL, .push_task = push_task_eager_policy, .pop_task = pop_task_eager_policy, .pre_exec_hook = NULL, .post_exec_hook = NULL, .pop_every_task = pop_every_task_eager_policy, .policy_name = "eager", .policy_description = "eager policy with a central queue" }; starpu-1.1.5/src/core/0002755000373600000000000000000012571541161011552 500000000000000starpu-1.1.5/src/core/sched_ctx_list.c0000644000373600000000000000412612571536573014651 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include "sched_ctx_list.h" void _starpu_sched_ctx_list_init(struct _starpu_sched_ctx_list *list) { list->next = NULL; list->sched_ctx = STARPU_NMAX_SCHED_CTXS; } void _starpu_sched_ctx_list_add(struct _starpu_sched_ctx_list **list, unsigned sched_ctx) { if((*list)->sched_ctx == STARPU_NMAX_SCHED_CTXS) (*list)->sched_ctx = sched_ctx; else { struct _starpu_sched_ctx_list *l = (struct _starpu_sched_ctx_list*)malloc(sizeof(struct _starpu_sched_ctx_list)); l->sched_ctx = sched_ctx; l->next = *list; *list = l; } } void _starpu_sched_ctx_list_remove(struct _starpu_sched_ctx_list **list, unsigned sched_ctx) { struct _starpu_sched_ctx_list *l = NULL; struct _starpu_sched_ctx_list *prev = NULL; for (l = (*list); l; l = l->next) { if(l->sched_ctx == sched_ctx) break; prev = l; } struct _starpu_sched_ctx_list *next = NULL; if(l->next) next = l->next; free(l); l = NULL; if(next) { if(prev) prev->next = next; else *list = next; } } unsigned _starpu_sched_ctx_list_get_sched_ctx(struct _starpu_sched_ctx_list *list, unsigned sched_ctx) { struct _starpu_sched_ctx_list *l = NULL; for (l = list; l; l = l->next) { if(l->sched_ctx == sched_ctx) return sched_ctx; } return STARPU_NMAX_SCHED_CTXS; } void _starpu_sched_ctx_list_delete(struct _starpu_sched_ctx_list **list) { while(*list) { struct _starpu_sched_ctx_list *next = (*list)->next; free(*list); *list = NULL; if(next) *list = next; } } starpu-1.1.5/src/core/combined_workers.c0000644000373600000000000001157412571536573015213 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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 CPUs */ STARPU_ASSERT(config->workers[id].perf_arch == STARPU_CPU_DEFAULT); STARPU_ASSERT(config->workers[id].worker_mask == STARPU_CPU); /* We only combine valid "basic" workers */ if ((id < 0) || (id >= basic_worker_count)) return -EINVAL; } /* Get an id for that combined worker. Note that this is not thread * safe because thhis method should only be called when the scheduler * is being initialized. */ new_workerid = basic_worker_count + combined_worker_id; config->topology.ncombinedworkers++; #if 0 fprintf(stderr, "COMBINED WORKERS "); for (i = 0; i < nworkers; i++) { fprintf(stderr, "%d ", workerid_array[i]); } fprintf(stderr, "into worker %d\n", new_workerid); #endif struct _starpu_combined_worker *combined_worker = &config->combined_workers[combined_worker_id]; combined_worker->worker_size = nworkers; combined_worker->perf_arch = (enum starpu_perfmodel_archtype) (STARPU_CPU_DEFAULT + nworkers - 1); combined_worker->worker_mask = STARPU_CPU; /* 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].initial_cpu_set); #else int j; for (j = 0; j < CPU_SETSIZE; j++) { if (CPU_ISSET(j, &config->workers[id].initial_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].initial_hwloc_cpu_set); #endif #endif } return new_workerid; } int starpu_combined_worker_get_description(int workerid, int *worker_size, int **combined_workerid) { /* Check that this is the id of a combined worker */ struct _starpu_combined_worker *worker; worker = _starpu_get_combined_worker_struct(workerid); STARPU_ASSERT(worker); if (worker_size) *worker_size = worker->worker_size; if (combined_workerid) *combined_workerid = worker->combined_workerid; return 0; } starpu-1.1.5/src/core/errorcheck.c0000644000373600000000000000322012571536574013774 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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_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) worker->status = 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(); return ( !(st == STATUS_CALLBACK) && !(st == STATUS_EXECUTING)); } starpu-1.1.5/src/core/workers.c0000644000373600000000000012460012571536573013346 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique * Copyright (C) 2010, 2011 Institut National de Recherche en Informatique et Automatique * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011-2012 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_SIMGRID #include #endif #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif /* acquire/release semantic for concurrent initialization/de-initialization */ static starpu_pthread_mutex_t init_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_cond_t init_cond = STARPU_PTHREAD_COND_INITIALIZER; static int init_count = 0; static enum { UNINITIALIZED, CHANGING, INITIALIZED } initialized = UNINITIALIZED; static starpu_pthread_key_t worker_key; static struct _starpu_machine_config config; static int disable_kernels; int _starpu_is_initialized(void) { return initialized == INITIALIZED; } struct _starpu_machine_config *_starpu_get_machine_config(void) { return &config; } int _starpu_get_disable_kernels(void) { return disable_kernels; } /* 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) { int i; int nworkers = starpu_worker_get_count(); _starpu_codelet_check_deprecated_fields(task->cl); for (i = 0; i < nworkers; i++) { 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; default: STARPU_ABORT(); } if (!test_implementation) continue; if (task->cl->can_execute(i, task, impl)) return 1; } } return 0; } /* in case a task is submitted, we may check whether there exists a worker that may execute the task or not */ uint32_t _starpu_worker_exists(struct starpu_task *task) { _starpu_codelet_check_deprecated_fields(task->cl); if (task->cl->where == STARPU_NOWHERE) return 1; if (!(task->cl->where & config.worker_mask)) return 0; if (!task->cl->can_execute) return 1; #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) if ((task->cl->where & STARPU_CPU) && _starpu_worker_exists_and_can_execute(task, STARPU_CPU_WORKER)) return 1; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if ((task->cl->where & STARPU_CUDA) && _starpu_worker_exists_and_can_execute(task, STARPU_CUDA_WORKER)) return 1; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) if ((task->cl->where & STARPU_OPENCL) && _starpu_worker_exists_and_can_execute(task, STARPU_OPENCL_WORKER)) return 1; #endif return 0; } uint32_t _starpu_can_submit_cuda_task(void) { return (STARPU_CUDA & config.worker_mask); } uint32_t _starpu_can_submit_cpu_task(void) { return (STARPU_CPU & config.worker_mask); } uint32_t _starpu_can_submit_opencl_task(void) { return (STARPU_OPENCL & config.worker_mask); } static 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; #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; } default: STARPU_ASSERT_MSG(0, "Unknown arch type %d", arch); } return 0; } int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl) { /* TODO: check that the task operand sizes will fit on that device */ return (task->cl->where & config.workers[workerid].worker_mask) && _starpu_can_use_nth_implementation(config.workers[workerid].arch, task->cl, nimpl) && (!task->cl->can_execute || task->cl->can_execute(workerid, task, nimpl)); } 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 = config.topology.nworkers; /* Is this a parallel worker ? */ if (workerid < nworkers) { return !!((task->cl->where & config.workers[workerid].worker_mask) && _starpu_can_use_nth_implementation(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) #endif ) { /* TODO we should add other types of constraints */ /* Is the worker larger than requested ? */ int worker_size = (int)config.combined_workers[workerid - nworkers].worker_size; int worker0 = config.combined_workers[workerid - nworkers].combined_workerid[0]; return !!((worker_size <= task->cl->max_parallelism) && _starpu_can_use_nth_implementation(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 *workerarg) { starpu_pthread_cond_t *cond = &workerarg->sched_cond; starpu_pthread_mutex_t *mutex = &workerarg->sched_mutex; unsigned memory_node = workerarg->memory_node; _starpu_memory_node_register_condition(cond, mutex, memory_node); } /* * Returns 0 if the given driver is one of the drivers that must be launched by * the application itself, and not by StarPU, 1 otherwise. */ static unsigned _starpu_may_launch_driver(struct starpu_conf *conf, struct starpu_driver *d) { if (conf->n_not_launched_drivers == 0 || conf->not_launched_drivers == NULL) return 1; /* Is in conf->not_launched_drivers ? */ unsigned i; for (i = 0; i < conf->n_not_launched_drivers; i++) { if (d->type != conf->not_launched_drivers[i].type) continue; switch (d->type) { case STARPU_CPU_WORKER: if (d->id.cpu_id == conf->not_launched_drivers[i].id.cpu_id) return 0; case STARPU_CUDA_WORKER: if (d->id.cuda_id == conf->not_launched_drivers[i].id.cuda_id) return 0; break; #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: if (d->id.opencl_id == conf->not_launched_drivers[i].id.opencl_id) return 0; break; #endif default: STARPU_ABORT(); } } return 1; } #ifdef STARPU_PERF_DEBUG struct itimerval prof_itimer; #endif static void _starpu_worker_init(struct _starpu_worker *workerarg, struct _starpu_machine_config *pconfig) { workerarg->config = pconfig; STARPU_PTHREAD_MUTEX_INIT(&workerarg->mutex, NULL); /* arch initialized by topology.c */ /* worker_mask initialized by topology.c */ /* perf_arch initialized by topology.c */ /* worker_thread initialized below */ /* devid initialized by topology.c */ /* bindid initialized by topology.c */ /* workerid initialized by topology.c */ workerarg->combined_workerid = workerarg->workerid; workerarg->current_rank = 0; workerarg->worker_size = 1; STARPU_PTHREAD_COND_INIT(&workerarg->started_cond, NULL); STARPU_PTHREAD_COND_INIT(&workerarg->ready_cond, NULL); /* memory_node initialized by topology.c */ STARPU_PTHREAD_COND_INIT(&workerarg->sched_cond, NULL); STARPU_PTHREAD_MUTEX_INIT(&workerarg->sched_mutex, NULL); starpu_task_list_init(&workerarg->local_tasks); workerarg->current_task = NULL; workerarg->set = NULL; workerarg->worker_is_running = 0; workerarg->worker_is_initialized = 0; workerarg->status = STATUS_INITIALIZING; /* name initialized by driver */ /* short_name initialized by driver */ workerarg->run_by_starpu = 1; workerarg->sched_ctx_list = NULL; workerarg->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->shares_tasks_lists[ctx] = 0; workerarg->poped_in_ctx[ctx] = 0; } workerarg->reverse_phase = 0; /* cpu_set/hwloc_cpu_set initialized in topology.c */ } void _starpu_worker_start(struct _starpu_worker *worker, unsigned fut_key) { (void) fut_key; int devid = worker->devid; (void) devid; #if defined(STARPU_PERF_DEBUG) && !defined(STARPU_SIMGRID) setitimer(ITIMER_PROF, &prof_itimer, NULL); #endif #ifdef STARPU_USE_FXT _starpu_fxt_register_thread(worker->bindid); unsigned memnode = worker->memory_node; _STARPU_TRACE_WORKER_INIT_START(fut_key, worker->workerid, devid, memnode); #endif _starpu_bind_thread_on_cpu(worker->config, worker->bindid); _STARPU_DEBUG("worker %d is ready on logical cpu %d\n", devid, worker->bindid); #ifdef STARPU_HAVE_HWLOC _STARPU_DEBUG("worker %d cpuset start at %d\n", devid, hwloc_bitmap_first(worker->initial_hwloc_cpu_set)); #endif _starpu_memory_node_set_local_key(&worker->memory_node); _starpu_set_local_worker_key(worker); STARPU_PTHREAD_MUTEX_LOCK(&worker->mutex); worker->worker_is_running = 1; STARPU_PTHREAD_COND_SIGNAL(&worker->started_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->mutex); worker->spinning_backoff = 1; } static void _starpu_launch_drivers(struct _starpu_machine_config *pconfig) { pconfig->running = 1; pconfig->pause_depth = 0; pconfig->submitting = 1; STARPU_HG_DISABLE_CHECKING(pconfig->watchdog_ok); unsigned nworkers = pconfig->topology.nworkers; /* Launch workers asynchronously */ unsigned cpu = 0, cuda = 0; 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 #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_INIT, 0, NULL); #endif for (worker = 0; worker < nworkers; worker++) { struct _starpu_worker *workerarg = &pconfig->workers[worker]; _STARPU_DEBUG("initialising worker %u\n", worker); _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 = cpu; if (_starpu_may_launch_driver(&pconfig->conf, &driver)) { STARPU_PTHREAD_CREATE_ON( workerarg->name, &workerarg->worker_thread, NULL, _starpu_cpu_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 } else { workerarg->run_by_starpu = 0; } cpu++; break; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_WORKER: driver.id.cuda_id = cuda; if (_starpu_may_launch_driver(&pconfig->conf, &driver)) { STARPU_PTHREAD_CREATE_ON( workerarg->name, &workerarg->worker_thread, NULL, _starpu_cuda_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 } else { workerarg->run_by_starpu = 0; } cuda++; break; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: #ifndef STARPU_SIMGRID starpu_opencl_get_device(workerarg->devid, &driver.id.opencl_id); if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) { workerarg->run_by_starpu = 0; break; } #endif STARPU_PTHREAD_CREATE_ON( workerarg->name, &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 default: STARPU_ABORT(); } } cpu = 0; cuda = 0; for (worker = 0; worker < nworkers; worker++) { struct _starpu_worker *workerarg = &pconfig->workers[worker]; struct starpu_driver driver; driver.type = workerarg->arch; switch (workerarg->arch) { case STARPU_CPU_WORKER: driver.id.cpu_id = cpu; if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) { cpu++; break; } _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_initialized) STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); cpu++; break; case STARPU_CUDA_WORKER: driver.id.cuda_id = cuda; if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) { cuda++; break; } _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_initialized) STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); cuda++; break; #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: #ifndef STARPU_SIMGRID starpu_opencl_get_device(workerarg->devid, &driver.id.opencl_id); if (!_starpu_may_launch_driver(&pconfig->conf, &driver)) break; #endif _STARPU_DEBUG("waiting for worker %u initialization\n", worker); STARPU_PTHREAD_MUTEX_LOCK(&workerarg->mutex); while (!workerarg->worker_is_initialized) STARPU_PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&workerarg->mutex); break; #endif default: STARPU_ABORT(); } } _STARPU_DEBUG("finished launching drivers\n"); } void _starpu_set_local_worker_key(struct _starpu_worker *worker) { STARPU_PTHREAD_SETSPECIFIC(worker_key, worker); } struct _starpu_worker *_starpu_get_local_worker_key(void) { return (struct _starpu_worker *) STARPU_PTHREAD_GETSPECIFIC(worker_key); } /* Initialize the starpu_conf with default values */ int starpu_conf_init(struct starpu_conf *conf) { if (!conf) return -EINVAL; memset(conf, 0, sizeof(*conf)); conf->magic = 42; conf->sched_policy_name = starpu_getenv("STARPU_SCHED"); conf->sched_policy = NULL; /* Note that starpu_get_env_number returns -1 in case the variable is * not defined */ /* Backward compatibility: check the value of STARPU_NCPUS if * STARPU_NCPU is not set. */ conf->ncpus = starpu_get_env_number("STARPU_NCPU"); if (conf->ncpus == -1) conf->ncpus = starpu_get_env_number("STARPU_NCPUS"); conf->ncuda = starpu_get_env_number("STARPU_NCUDA"); conf->nopencl = starpu_get_env_number("STARPU_NOPENCL"); conf->calibrate = starpu_get_env_number("STARPU_CALIBRATE"); conf->bus_calibrate = starpu_get_env_number("STARPU_BUS_CALIBRATE"); 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->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 /* 64MiB by default */ conf->trace_buffer_size = starpu_get_env_number_default("STARPU_TRACE_BUFFER_SIZE", 64) << 20; return 0; } static void _starpu_conf_set_value_against_environment(char *name, int *value) { int number; number = starpu_get_env_number(name); if (number != -1) { *value = number; } } void _starpu_conf_check_environment(struct starpu_conf *conf) { char *sched = starpu_getenv("STARPU_SCHED"); if (sched) { conf->sched_policy_name = sched; } _starpu_conf_set_value_against_environment("STARPU_NCPUS", &conf->ncpus); _starpu_conf_set_value_against_environment("STARPU_NCPU", &conf->ncpus); _starpu_conf_set_value_against_environment("STARPU_NCUDA", &conf->ncuda); _starpu_conf_set_value_against_environment("STARPU_NOPENCL", &conf->nopencl); _starpu_conf_set_value_against_environment("STARPU_CALIBRATE", &conf->calibrate); _starpu_conf_set_value_against_environment("STARPU_BUS_CALIBRATE", &conf->bus_calibrate); #ifdef STARPU_SIMGRID if (conf->calibrate == 2) { _STARPU_DISP("Warning: History will be cleared due to calibrate or STARPU_CALIBRATE being set to 2. This will prevent simgrid from having task simulation times!"); } if (conf->bus_calibrate) { _STARPU_DISP("Warning: Bus calibration will be cleared due to bus_calibrate or STARPU_BUS_CALIBRATE being set. This will prevent simgrid from having data transfer simulation times!"); } #endif _starpu_conf_set_value_against_environment("STARPU_SINGLE_COMBINED_WORKER", &conf->single_combined_worker); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_COPY", &conf->disable_asynchronous_copy); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY", &conf->disable_asynchronous_cuda_copy); _starpu_conf_set_value_against_environment("STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY", &conf->disable_asynchronous_opencl_copy); } int starpu_init(struct starpu_conf *user_conf) { unsigned worker; int ret; /* This initializes _starpu_silent, thus needs to be early */ _starpu_util_init(); #ifdef STARPU_SIMGRID /* This initializes the simgrid thread library, thus needs to be early */ _starpu_simgrid_init(); #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_SIMGRID /* Warn when the lots of stacks malloc()-ated by simgrid for transfer * processes will take a long time to get initialized */ if (starpu_getenv("MALLOC_PERTURB_")) _STARPU_DISP("Warning: MALLOC_PERTURB_ is set, this makes simgrid runs 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\n"); #endif #ifdef STARPU_PERF_DEBUG _STARPU_DISP("Warning: StarPU was configured with --enable-perf-debug, which slows down a bit\n"); #endif #ifdef STARPU_MODEL_DEBUG _STARPU_DISP("Warning: StarPU was configured with --enable-model-debug, which slows down a bit\n"); #endif #ifdef STARPU_ENABLE_STATS _STARPU_DISP("Warning: StarPU was configured with --enable-stats, which slows down a bit\n"); #endif #endif #if defined(_WIN32) && !defined(__CYGWIN__) WSADATA wsadata; WSAStartup(MAKEWORD(1,0), &wsadata); #endif srand(2008); #ifdef HAVE_AYUDAME_H #ifndef AYU_RT_STARPU #define AYU_RT_STARPU 4 #endif if (AYU_event) { enum ayu_runtime_t ayu_rt = AYU_RT_STARPU; AYU_event(AYU_PREINIT, 0, (void*) &ayu_rt); } #endif /* store the pointer to the user explicit configuration during the * initialization */ if (user_conf == NULL) starpu_conf_init(&config.conf); else { if (user_conf->magic != 42) { _STARPU_DISP("starpu_conf structure needs to be initialized with starpu_conf_init\n"); return -EINVAL; } config.conf = *user_conf; } _starpu_conf_check_environment(&config.conf); /* Make a copy of arrays */ if (config.conf.sched_policy_name) config.conf.sched_policy_name = strdup(config.conf.sched_policy_name); if (config.conf.n_cuda_opengl_interoperability) { size_t size = config.conf.n_cuda_opengl_interoperability * sizeof(*config.conf.cuda_opengl_interoperability); unsigned *copy = malloc(size); memcpy(copy, config.conf.cuda_opengl_interoperability, size); config.conf.cuda_opengl_interoperability = copy; } if (config.conf.n_not_launched_drivers) { size_t size = config.conf.n_not_launched_drivers * sizeof(*config.conf.not_launched_drivers); struct starpu_driver *copy = malloc(size); memcpy(copy, config.conf.not_launched_drivers, size); config.conf.not_launched_drivers = copy; } _starpu_init_all_sched_ctxs(&config); _starpu_init_progression_hooks(); _starpu_init_tags(); #ifdef STARPU_USE_FXT _starpu_init_fxt_profiling(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(); ret = _starpu_build_topology(&config); if (ret) { starpu_perfmodel_free_sampling_directories(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); init_count--; _starpu_destroy_machine_config(&config); initialized = UNINITIALIZED; /* Let somebody else try to do it */ STARPU_PTHREAD_COND_SIGNAL(&init_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); return ret; } _starpu_task_init(); for (worker = 0; worker < config.topology.nworkers; worker++) _starpu_worker_init(&config.workers[worker], &config); disable_kernels = starpu_get_env_number("STARPU_DISABLE_KERNELS"); STARPU_PTHREAD_KEY_CREATE(&worker_key, NULL); struct starpu_sched_policy *selected_policy = _starpu_select_sched_policy(&config, config.conf.sched_policy_name); _starpu_create_sched_ctx(selected_policy, NULL, -1, 1, "init", 0, 0, 0, 0); _starpu_initialize_registered_performance_models(); /* Launch "basic" workers (ie. non-combined workers) */ _starpu_launch_drivers(&config); _starpu_watchdog_init(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); initialized = INITIALIZED; /* Tell everybody that we initialized */ STARPU_PTHREAD_COND_BROADCAST(&init_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); _STARPU_DEBUG("Initialisation finished\n"); return 0; } /* * Handle runtime termination */ static void _starpu_terminate_workers(struct _starpu_machine_config *pconfig) { int status = 0; unsigned workerid; for (workerid = 0; workerid < pconfig->topology.nworkers; workerid++) { starpu_wake_all_blocked_workers(); _STARPU_DEBUG("wait for worker %u\n", workerid); struct _starpu_worker_set *set = pconfig->workers[workerid].set; struct _starpu_worker *worker = &pconfig->workers[workerid]; /* in case StarPU termination code is called from a callback, * we have to check if pthread_self() is the worker itself */ if (set) { if (!set->joined) { #ifdef STARPU_SIMGRID status = starpu_pthread_join(set->worker_thread, NULL); #else if (!pthread_equal(pthread_self(), set->worker_thread)) status = starpu_pthread_join(set->worker_thread, NULL); #endif if (status) { #ifdef STARPU_VERBOSE _STARPU_DEBUG("starpu_pthread_join -> %d\n", status); #endif } set->joined = 1; } } else { if (!worker->run_by_starpu) goto out; #ifdef STARPU_SIMGRID status = starpu_pthread_join(worker->worker_thread, NULL); #else if (!pthread_equal(pthread_self(), worker->worker_thread)) status = starpu_pthread_join(worker->worker_thread, NULL); #endif if (status) { #ifdef STARPU_VERBOSE _STARPU_DEBUG("starpu_pthread_join -> %d\n", status); #endif } } out: STARPU_ASSERT(starpu_task_list_empty(&worker->local_tasks)); _starpu_sched_ctx_list_delete(&worker->sched_ctx_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(config.pause_depth > 0)) { STARPU_PTHREAD_MUTEX_LOCK(&pause_mutex); if (config.pause_depth > 0) { STARPU_PTHREAD_COND_WAIT(&pause_cond, &pause_mutex); } STARPU_PTHREAD_MUTEX_UNLOCK(&pause_mutex); } } unsigned _starpu_machine_is_running(void) { unsigned ret; /* running is just protected by a memory barrier */ STARPU_RMB(); ANNOTATE_HAPPENS_AFTER(&config.running); ret = config.running; ANNOTATE_HAPPENS_BEFORE(&config.running); return ret; } void starpu_pause() { STARPU_HG_DISABLE_CHECKING(config.pause_depth); config.pause_depth += 1; } void starpu_resume() { STARPU_PTHREAD_MUTEX_LOCK(&pause_mutex); config.pause_depth -= 1; if (!config.pause_depth) { STARPU_PTHREAD_COND_BROADCAST(&pause_cond); } STARPU_PTHREAD_MUTEX_UNLOCK(&pause_mutex); } unsigned _starpu_worker_can_block(unsigned memnode STARPU_ATTRIBUTE_UNUSED, struct _starpu_worker *worker STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_NON_BLOCKING_DRIVERS return 0; #else unsigned can_block = 1; struct starpu_driver driver; driver.type = worker->arch; switch (driver.type) { case STARPU_CPU_WORKER: driver.id.cpu_id = worker->devid; break; case STARPU_CUDA_WORKER: driver.id.cuda_id = worker->devid; break; #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: starpu_opencl_get_device(worker->devid, &driver.id.opencl_id); break; #endif default: goto always_launch; } if (!_starpu_may_launch_driver(&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(&config.running); pconfig->running = 0; /* running is just protected by a memory barrier */ ANNOTATE_HAPPENS_BEFORE(&config.running); STARPU_WMB(); starpu_wake_all_blocked_workers(); } void starpu_display_stats() { starpu_profiling_bus_helper_display_summary(); starpu_profiling_worker_helper_display_summary(); } void starpu_shutdown(void) { STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); init_count--; STARPU_ASSERT_MSG(init_count >= 0, "Number of calls to starpu_shutdown() can not be higher than the number of calls to starpu_init()\n"); if (init_count) { _STARPU_DEBUG("Still somebody needing StarPU, don't deinitialize\n"); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); return; } /* We're last */ initialized = CHANGING; STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); /* If the workers are frozen, no progress can be made. */ STARPU_ASSERT(config.pause_depth <= 0); starpu_task_wait_for_no_ready(); /* tell all workers to shutdown */ _starpu_kill_all_workers(&config); { int stats = starpu_get_env_number("STARPU_STATS"); if (stats != 0) { _starpu_display_msi_stats(); _starpu_display_alloc_cache_stats(); _starpu_display_comm_amounts(); } } starpu_profiling_bus_helper_display_summary(); starpu_profiling_worker_helper_display_summary(); _starpu_deinitialize_registered_performance_models(); _starpu_watchdog_shutdown(); /* wait for their termination */ _starpu_terminate_workers(&config); { int stats = starpu_get_env_number("STARPU_MEMORY_STATS"); if (stats != 0) { // Display statistics on data which have not been unregistered starpu_data_display_memory_stats(); } } _starpu_delete_all_sched_ctxs(); _starpu_destroy_topology(&config); #ifdef STARPU_USE_FXT _starpu_stop_fxt_profiling(); #endif _starpu_data_interface_shutdown(); /* Drop all remaining tags */ _starpu_tag_clear(); _starpu_close_debug_logfile(); STARPU_PTHREAD_KEY_DELETE(worker_key); _starpu_task_deinit(); STARPU_PTHREAD_MUTEX_LOCK(&init_mutex); initialized = UNINITIALIZED; /* Let someone else that wants to initialize it again do it */ STARPU_PTHREAD_COND_SIGNAL(&init_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&init_mutex); /* Clear memory */ free((char*) config.conf.sched_policy_name); if (config.conf.n_cuda_opengl_interoperability) free(config.conf.cuda_opengl_interoperability); if (config.conf.n_not_launched_drivers) free(config.conf.not_launched_drivers); #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_FINISH, 0, NULL); #endif _STARPU_DEBUG("Shutdown finished\n"); } unsigned starpu_worker_get_count(void) { return config.topology.nworkers; } int starpu_worker_get_count_by_type(enum starpu_worker_archtype type) { switch (type) { case STARPU_CPU_WORKER: return config.topology.ncpus; case STARPU_CUDA_WORKER: return config.topology.ncudagpus; case STARPU_OPENCL_WORKER: return config.topology.nopenclgpus; default: return -EINVAL; } } unsigned starpu_combined_worker_get_count(void) { return config.topology.ncombinedworkers; } unsigned starpu_cpu_worker_get_count(void) { return config.topology.ncpus; } unsigned starpu_cuda_worker_get_count(void) { return config.topology.ncudagpus; } unsigned starpu_opencl_worker_get_count(void) { return config.topology.nopenclgpus; } int starpu_asynchronous_copy_disabled(void) { return config.conf.disable_asynchronous_copy; } int starpu_asynchronous_cuda_copy_disabled(void) { return config.conf.disable_asynchronous_cuda_copy; } int starpu_asynchronous_opencl_copy_disabled(void) { return config.conf.disable_asynchronous_opencl_copy; } /* 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. */ 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; } } 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_devid(int id) { return config.workers[id].devid; } struct _starpu_worker *_starpu_get_worker_struct(unsigned id) { return &config.workers[id]; } unsigned starpu_worker_is_combined_worker(int id) { return id >= (int)config.topology.nworkers; } struct _starpu_sched_ctx *_starpu_get_sched_ctx_struct(unsigned id) { if (id == STARPU_NMAX_SCHED_CTXS) return NULL; return &config.sched_ctxs[id]; } struct _starpu_combined_worker *_starpu_get_combined_worker_struct(unsigned id) { unsigned basic_worker_count = starpu_worker_get_count(); STARPU_ASSERT(id >= basic_worker_count); return &config.combined_workers[id - basic_worker_count]; } enum starpu_worker_archtype starpu_worker_get_type(int id) { return config.workers[id].arch; } int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize) { unsigned nworkers = starpu_worker_get_count(); int cnt = 0; unsigned id; for (id = 0; id < nworkers; id++) { if (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 (starpu_worker_get_type(id) == type) { if (num == cnt) return id; cnt++; } } /* Not found */ return -1; } int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid) { unsigned nworkers = starpu_worker_get_count(); unsigned id; for (id = 0; id < nworkers; id++) if (starpu_worker_get_type(id) == type && starpu_worker_get_devid(id) == devid) return id; /* Not found */ return -1; } void starpu_worker_get_name(int id, char *dst, size_t maxlen) { char *name = config.workers[id].name; snprintf(dst, maxlen, "%s", name); } /* Retrieve the status which indicates what the worker is currently doing. */ enum _starpu_worker_status _starpu_worker_get_status(int workerid) { return config.workers[workerid].status; } /* Change the status of the worker which indicates what the worker is currently * doing (eg. executing a callback). */ void _starpu_worker_set_status(int workerid, enum _starpu_worker_status status) { config.workers[workerid].status = status; } void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond) { *sched_cond = &config.workers[workerid].sched_cond; *sched_mutex = &config.workers[workerid].sched_mutex; } int starpu_wakeup_worker(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex) { int success = 0; STARPU_PTHREAD_MUTEX_LOCK(mutex); if (config.workers[workerid].status == STATUS_SLEEPING) { config.workers[workerid].status = STATUS_WAKING_UP; STARPU_PTHREAD_COND_SIGNAL(cond); success = 1; } STARPU_PTHREAD_MUTEX_UNLOCK(mutex); return success; } 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 (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, worker; unsigned found = 0; for (id = 0; id < nworkers; id++) { found = 0; if (starpu_worker_get_type(id) == type) { /* Perhaps the array is too small ? */ if (cnt >= maxsize) return cnt; int s; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config.sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { struct starpu_worker_collection *workers = config.sched_ctxs[s].workers; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if(worker == id) { found = 1; break; } } if(found) break; } } if(!found) workerids[cnt++] = id; } } return cnt; } struct _starpu_sched_ctx* _starpu_get_initial_sched_ctx(void) { return &config.sched_ctxs[STARPU_GLOBAL_SCHED_CTX]; } int starpu_worker_get_nsched_ctxs(int workerid) { return config.workers[workerid].nsched_ctxs; } static 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_CUDA case STARPU_CUDA_WORKER: if (worker->devid == d->id.cuda_id) return worker; break; #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: { cl_device_id device; starpu_opencl_get_device(worker->devid, &device); if (device == d->id.opencl_id) return worker; break; } #endif default: _STARPU_DEBUG("Invalid device type\n"); return NULL; } } } return NULL; } int starpu_driver_run(struct starpu_driver *d) { if (!d) { _STARPU_DEBUG("Invalid argument\n"); return -EINVAL; } struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_run_cpu(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_run_cuda(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_run_opencl(worker); #endif default: _STARPU_DEBUG("Invalid device type\n"); return -EINVAL; } } int starpu_driver_init(struct starpu_driver *d) { STARPU_ASSERT(d); struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_cpu_driver_init(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_cuda_driver_init(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_opencl_driver_init(worker); #endif default: return -EINVAL; } } int starpu_driver_run_once(struct starpu_driver *d) { STARPU_ASSERT(d); struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_cpu_driver_run_once(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_cuda_driver_run_once(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_opencl_driver_run_once(worker); #endif default: return -EINVAL; } } int starpu_driver_deinit(struct starpu_driver *d) { STARPU_ASSERT(d); struct _starpu_worker *worker = _starpu_get_worker_from_driver(d); switch (d->type) { #ifdef STARPU_USE_CPU case STARPU_CPU_WORKER: return _starpu_cpu_driver_deinit(worker); #endif #ifdef STARPU_USE_CUDA case STARPU_CUDA_WORKER: return _starpu_cuda_driver_deinit(worker); #endif #ifdef STARPU_USE_OPENCL case STARPU_OPENCL_WORKER: return _starpu_opencl_driver_deinit(worker); #endif default: return -EINVAL; } } void starpu_get_version(int *major, int *minor, int *release) { *major = STARPU_MAJOR_VERSION; *minor = STARPU_MINOR_VERSION; *release = STARPU_RELEASE_VERSION; } starpu-1.1.5/src/core/task_bundle.h0000644000373600000000000000741212571536573014153 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CORE_TASK_BUNDLE_H__ #define __CORE_TASK_BUNDLE_H__ #include /* struct _starpu_task_bundle_entry * ================================ * Purpose * ======= * Structure used to describe a linked list containing tasks in _starpu_task_bundle. * * Fields * ====== * task Pointer to the task structure. * * next Pointer to the next element in the linked list. */ struct _starpu_task_bundle_entry { struct starpu_task *task; struct _starpu_task_bundle_entry *next; }; /* struct _starpu_task_bundle * ========================== * Purpose * ======= * Structure describing a list of tasks that should be scheduled on the same * worker whenever it's possible. * It must be considered as a hint given to the scheduler as there is no guarantee that * they will be executed on the same worker. * * Fields * ====== * mutex Mutex protecting the structure. * * list Array of tasks included in the bundle. * * closed Used to know if the user is still willing to * add/remove some tasks in the bundle. Especially useful for * the runtime to know whether it is safe to destroy a bundle. */ struct _starpu_task_bundle { /* Mutex protecting the bundle */ starpu_pthread_mutex_t mutex; struct _starpu_task_bundle_entry *list; int closed; }; /* struct _starpu_handle_list * ========================== * Purpose * ======= * Structure describing a list of handles sorted by address to speed-up * when looking for an element. * The list cannot containes duplicate handles. * * Fields * ====== * handle Pointer to the handle structure. * * access_mode Total access mode over the whole bundle. * * next Pointer to the next element in the linked list. */ struct _starpu_handle_list { starpu_data_handle_t handle; enum starpu_data_access_mode mode; struct _starpu_handle_list *next; }; /* _starpu_task_bundle_destroy * ========================== * Purpose * ======= * Destroy and deinitialize a bundle, * memory previoulsy allocated is freed. * * Arguments * ========= * bundle (input) * Bundle to destroy. */ void _starpu_task_bundle_destroy(starpu_task_bundle_t bundle); /* _insertion_handle_sorted * ======================== * Purpose * ======= * Insert an handle in a _starpu_handle_list, elements are sorted * in increasing order, considering their physical address. * As the list doesn't accept duplicate elements, a handle with the * same address as an handle contained in the list is not inserted, but * its mode access is merged with the one of the latter. * * Arguments * ========= * listp (input, output) * Pointer to the first element of the list. * In the case of an empty list or an inserted handle with small address, * it should have changed when the call returns. * * handle (input) * Handle to insert in the list. * * mode (input) * Access mode of the handle. */ void _insertion_handle_sorted(struct _starpu_handle_list **listp, starpu_data_handle_t handle, enum starpu_data_access_mode mode); #endif // __CORE_TASK_BUNDLE_H__ starpu-1.1.5/src/core/perfmodel/0002755000373600000000000000000012571541161013527 500000000000000starpu-1.1.5/src/core/perfmodel/perfmodel_history.c0000644000373600000000000012036612571536573017372 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #if !defined(_WIN32) || defined(__MINGW32__) || defined(__CYGWIN__) #include #include #endif #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #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) /* 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; static struct _starpu_perfmodel_list *registered_models = NULL; size_t _starpu_job_get_data_size(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned nimpl, struct _starpu_job *j) { struct starpu_task *task = j->task; if (model && model->per_arch[arch][nimpl].size_base) { return model->per_arch[arch][nimpl].size_base(task, arch, nimpl); } else if (model && model->size_base) { return model->size_base(task, nimpl); } else { unsigned nbuffers = task->cl->nbuffers; size_t size = 0; unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer); size += _starpu_data_get_size(handle); } return size; } } /* * History based model */ static void insert_history_entry(struct starpu_perfmodel_history_entry *entry, struct starpu_perfmodel_history_list **list, struct starpu_perfmodel_history_table **history_ptr) { struct starpu_perfmodel_history_list *link; struct starpu_perfmodel_history_table *table; link = (struct starpu_perfmodel_history_list *) malloc(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); table = (struct starpu_perfmodel_history_table*) malloc(sizeof(*table)); STARPU_ASSERT(table != NULL); table->footprint = entry->footprint; table->history_entry = entry; HASH_ADD_UINT32_T(*history_ptr, footprint, table); } static void dump_reg_model(FILE *f, struct starpu_perfmodel *model, unsigned arch, unsigned nimpl) { struct starpu_perfmodel_per_arch *per_arch_model; per_arch_model = &model->per_arch[arch][nimpl]; 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, "%-15le\t%-15le\t%-15le\t%-15le\t%-15le\t%-15le\t%u\t%-15lu\t%-15lu\n", reg_model->sumlnx, reg_model->sumlnx2, reg_model->sumlny, reg_model->sumlnxlny, alpha, beta, reg_model->nsample, reg_model->minx, reg_model->maxx); /* * Non-Linear Regression model */ double a = nan(""), b = nan(""), c = nan(""); if (model->type == STARPU_NL_REGRESSION_BASED) _starpu_regression_non_linear_power(per_arch_model->list, &a, &b, &c); fprintf(f, "# a\t\tb\t\tc\n"); fprintf(f, "%-15le\t%-15le\t%-15le\n", a, b, c); } static void scan_reg_model(FILE *f, 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", ®_model->sumlnx, ®_model->sumlnx2, ®_model->sumlny, ®_model->sumlnxlny); STARPU_ASSERT_MSG(res == 4, "Incorrect performance model file"); res = _starpu_read_double(f, "\t%le", ®_model->alpha); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file"); res = _starpu_read_double(f, "\t%le", ®_model->beta); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file"); 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"); /* 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\t", ®_model->a); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file"); res = _starpu_read_double(f, "%le\t", ®_model->b); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file"); res = _starpu_read_double(f, "%le\n", ®_model->c); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file"); /* 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); } static void dump_history_entry(FILE *f, struct starpu_perfmodel_history_entry *entry) { fprintf(f, "%08x\t%-15lu\t%-15le\t%-15le\t%-15le\t%-15le\t%-15le\t%u\n", entry->footprint, (unsigned long) entry->size, entry->flops, entry->mean, entry->deviation, entry->sum, entry->sum2, entry->nsample); } static void scan_history_entry(FILE *f, 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[256]; 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"); } if (entry) { entry->footprint = footprint; entry->size = size; entry->flops = flops; entry->mean = mean; entry->deviation = deviation; entry->sum = sum; entry->sum2 = sum2; entry->nsample = nsample; } } static void parse_per_arch_model_file(FILE *f, struct starpu_perfmodel_per_arch *per_arch_model, unsigned scan_history) { unsigned nentries; _starpu_drop_comments(f); int res = fscanf(f, "%u\n", &nentries); STARPU_ASSERT_MSG(res == 1, "Incorrect performance model file"); _STARPU_DEBUG("nentries:%u\n", nentries); scan_reg_model(f, &per_arch_model->regression); /* parse cpu entries */ unsigned i; for (i = 0; i < nentries; i++) { struct starpu_perfmodel_history_entry *entry = NULL; if (scan_history) { entry = (struct starpu_perfmodel_history_entry *) malloc(sizeof(struct starpu_perfmodel_history_entry)); STARPU_ASSERT(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); } scan_history_entry(f, entry); /* insert the entry in the hashtable and the list structures */ /* TODO: Insert it at the end of the list, to avoid reversing * the order... But efficiently! We may have a lot of entries */ if (scan_history) insert_history_entry(entry, &per_arch_model->list, &per_arch_model->history); } } static void parse_arch(FILE *f, struct starpu_perfmodel *model, unsigned scan_history, unsigned* arch, unsigned archmax) { struct starpu_perfmodel_per_arch dummy; unsigned nimpls, implmax, impl, i, ret; _STARPU_DEBUG("Parsing arch %u \n",*arch); /* Parsing number of implementation */ _starpu_drop_comments(f); ret = fscanf(f, "%u\n", &nimpls); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file"); /* Parsing each implementation */ implmax = STARPU_MIN(nimpls, STARPU_MAXIMPLEMENTATIONS); for (impl = 0; impl < implmax; impl++) { if(*arch < archmax) parse_per_arch_model_file(f, &model->per_arch[*arch][impl], scan_history); else parse_per_arch_model_file(f, &dummy, 0); } /* if the number of implementation is greater than STARPU_MAXIMPLEMENTATIONS * we skip the last implementation */ if (impl < nimpls) for (i = impl; impl < nimpls; i++) parse_per_arch_model_file(f, &dummy, 0); } static void parse_device(FILE *f, struct starpu_perfmodel *model, unsigned scan_history, unsigned * arch, unsigned archmax) { unsigned maxncore, ncore, ret; /* Parsing maximun number of worker for this device */ _starpu_drop_comments(f); ret = fscanf(f, "%u\n", &maxncore); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file"); /* Parsing each arch */ for(ncore=0; ncore < maxncore; ncore++) { parse_arch(f,model,scan_history,arch,archmax); (*arch)++; } } static void parse_archtype(FILE *f, struct starpu_perfmodel *model, unsigned scan_history, unsigned * arch, unsigned archmax) { unsigned ndevice, devid, ret; /* Parsing number of device for this archtype */ _starpu_drop_comments(f); ret = fscanf(f, "%u\n", &ndevice); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file"); /* Parsing each device for this archtype*/ for(devid=0; devid < ndevice; devid++) parse_device(f,model,scan_history,arch,archmax); } static void parse_model_file(FILE *f, struct starpu_perfmodel *model, unsigned scan_history) { int ret, version; unsigned arch, archmax; _STARPU_DEBUG("Start parsing\n"); /* 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 with a model version %d not being the current model version (%d)\n", version, _STARPU_PERFMODEL_VERSION); STARPU_ASSERT_MSG(ret == 1, "Incorrect performance model file"); /* Parsing each kind of archtype */ /* Parsing CPU */ arch = STARPU_CPU_DEFAULT; archmax = STARPU_CPU_DEFAULT + STARPU_MAXCPUS; parse_archtype(f, model, scan_history, &arch, archmax); /* Parsing CUDA */ arch = STARPU_CUDA_DEFAULT; archmax = STARPU_CUDA_DEFAULT + STARPU_MAXCUDADEVS; parse_archtype(f, model, scan_history, &arch, archmax); /* Parsing OpenCL */ arch = STARPU_OPENCL_DEFAULT; archmax = STARPU_OPENCL_DEFAULT + STARPU_MAXOPENCLDEVS; parse_archtype(f, model, scan_history, &arch, archmax); } static void dump_per_arch_model_file(FILE *f, struct starpu_perfmodel *model, unsigned arch, unsigned nimpl) { struct starpu_perfmodel_per_arch *per_arch_model; per_arch_model = &model->per_arch[arch][nimpl]; /* count the number of elements in the lists */ struct starpu_perfmodel_history_list *ptr = NULL; unsigned nentries = 0; if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { /* Dump the list of all entries in the history */ ptr = per_arch_model->list; while(ptr) { nentries++; ptr = ptr->next; } } /* header */ char archname[32]; starpu_perfmodel_get_arch_name((enum starpu_perfmodel_archtype) arch, archname, 32, nimpl); fprintf(f, "#####\n"); fprintf(f, "# Model for %s\n", archname); fprintf(f, "# number of entries\n%u\n", nentries); dump_reg_model(f, model, arch, nimpl); /* Dump the history into the model file in case it is necessary */ if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { fprintf(f, "# hash\t\tsize\t\tflops\t\tmean (us)\tdev (us)\t\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 unsigned get_n_entries(struct starpu_perfmodel *model, unsigned arch, unsigned impl) { struct starpu_perfmodel_per_arch *per_arch_model; per_arch_model = &model->per_arch[arch][impl]; /* count the number of elements in the lists */ struct starpu_perfmodel_history_list *ptr = NULL; unsigned nentries = 0; if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { /* Dump the list of all entries in the history */ ptr = per_arch_model->list; while(ptr) { nentries++; ptr = ptr->next; } } return nentries; } static void dump_model_file(FILE *f, struct starpu_perfmodel *model) { unsigned narch[4] = { 0, 0, 0, 0}; unsigned arch, arch_base = 0, my_narch = 0; unsigned nimpl; unsigned idx = 0; fprintf(f, "##################\n"); fprintf(f, "# Performance Model Version\n"); fprintf(f, "%d\n\n", _STARPU_PERFMODEL_VERSION); /* Finding the number of archs to write for each kind of device */ for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) { switch (arch) { case STARPU_CUDA_DEFAULT: case STARPU_OPENCL_DEFAULT: arch_base = arch; idx++; break; default: break; } if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (get_n_entries(model, arch, nimpl)) { narch[idx]=arch-arch_base+1; break; } } else if (model->type == STARPU_REGRESSION_BASED || model->type == STARPU_PER_ARCH || model->type == STARPU_COMMON) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (model->per_arch[arch][nimpl].regression.nsample) { narch[idx]=arch-arch_base+1; break; } } else { STARPU_ASSERT_MSG(0, "Unknown history-based performance model %d", model->type); } } /* Writing stuff */ char *name = "unknown"; unsigned substract_to_arch = 0; for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) { switch (arch) { case STARPU_CPU_DEFAULT: arch_base = arch; name = "CPU"; fprintf(f, "####################\n"); fprintf(f, "# %ss\n", name); fprintf(f, "# number of %s devices\n", name); fprintf(f, "1\n"); fprintf(f, "###############\n"); fprintf(f, "# CPU_0\n"); fprintf(f, "# number of workers on device CPU_0\n"); fprintf(f, "%u\n", my_narch = narch[0]); break; case STARPU_CUDA_DEFAULT: arch_base = arch; name = "CUDA"; substract_to_arch = STARPU_MAXCPUS; fprintf(f, "####################\n"); fprintf(f, "# %ss\n", name); fprintf(f, "# number of %s devices\n", name); fprintf(f, "%u\n", my_narch = narch[1]); break; case STARPU_OPENCL_DEFAULT: arch_base = arch; name = "OPENCL"; substract_to_arch += STARPU_MAXCUDADEVS; fprintf(f, "####################\n"); fprintf(f, "# %ss\n", name); fprintf(f, "# number of %ss devices\n", name); fprintf(f, "%u\n", my_narch = narch[2]); break; default: break; } unsigned max_impl = 0; if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (get_n_entries(model, arch, nimpl)) max_impl = nimpl + 1; } else if (model->type == STARPU_REGRESSION_BASED || model->type == STARPU_PER_ARCH || model->type == STARPU_COMMON) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) if (model->per_arch[arch][nimpl].regression.nsample) max_impl = nimpl + 1; } else STARPU_ASSERT_MSG(0, "Unknown history-based performance model %u", arch); if (arch >= my_narch + arch_base) continue; if(substract_to_arch) { fprintf(f, "###############\n"); fprintf(f, "# %s_%u\n", name, arch - substract_to_arch); fprintf(f, "# number of workers on device %s_%u\n", name, arch - substract_to_arch); fprintf(f, "1\n"); fprintf(f, "##########\n"); fprintf(f, "# 1 worker(s) in parallel\n"); } else { /* CPU */ fprintf(f, "##########\n"); fprintf(f, "# %u worker(s) in parallel\n", arch +1); } fprintf(f, "# number of implementations\n"); fprintf(f, "%u\n", max_impl); for (nimpl = 0; nimpl < max_impl; nimpl++) { dump_per_arch_model_file(f, model, arch, nimpl); } } fprintf(f,"####################\n"); fprintf(f,"# MICs\n"); fprintf(f,"# number of MIC devices\n"); fprintf(f,"0\n"); fprintf(f,"####################\n"); fprintf(f,"# SCCs\n"); fprintf(f,"# number of SCC devices\n"); fprintf(f,"0\n"); } static void initialize_per_arch_model(struct starpu_perfmodel_per_arch *per_arch_model) { per_arch_model->history = NULL; per_arch_model->list = NULL; per_arch_model->regression.nsample = 0; per_arch_model->regression.valid = 0; per_arch_model->regression.nl_valid = 0; } static void initialize_model(struct starpu_perfmodel *model) { unsigned arch; unsigned nimpl; for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { initialize_per_arch_model(&model->per_arch[arch][nimpl]); } } } static void get_model_debug_path(struct starpu_perfmodel *model, const char *arch, char *path, size_t maxlen) { STARPU_ASSERT(path); _starpu_get_perf_model_dir_debug(path, maxlen); strncat(path, model->symbol, maxlen); char hostname[65]; _starpu_gethostname(hostname, sizeof(hostname)); strncat(path, ".", maxlen); strncat(path, hostname, maxlen); strncat(path, ".", maxlen); strncat(path, arch, maxlen); strncat(path, ".debug", maxlen); } /* * Returns 0 is the model was already loaded, 1 otherwise. */ int _starpu_register_model(struct starpu_perfmodel *model) { /* If the model has already been loaded, there is nothing to do */ STARPU_PTHREAD_RWLOCK_RDLOCK(®istered_models_rwlock); if (model->is_loaded) { STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return 0; } STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); /* We have to make sure the model has not been loaded since the * last time we took the lock */ STARPU_PTHREAD_RWLOCK_WRLOCK(®istered_models_rwlock); if (model->is_loaded) { STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return 0; } /* add the model to a linked list */ struct _starpu_perfmodel_list *node = (struct _starpu_perfmodel_list *) malloc(sizeof(struct _starpu_perfmodel_list)); node->model = model; //model->debug_modelid = debug_modelid++; /* put this model at the beginning of the list */ node->next = registered_models; registered_models = node; #ifdef STARPU_MODEL_DEBUG _starpu_create_sampling_directory_if_needed(); unsigned arch; unsigned nimpl; for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { starpu_perfmodel_debugfilepath(model, arch, model->per_arch[arch][nimpl].debug_path, 256, nimpl); } } #endif STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return 1; } static void get_model_path(struct starpu_perfmodel *model, char *path, size_t maxlen) { char hostname[65]; _starpu_gethostname(hostname, sizeof(hostname)); const char *dot = strrchr(model->symbol, '.'); snprintf(path, maxlen, "%s/%s%s%s", _starpu_get_perf_model_dir_codelet(), model->symbol, dot?"":".", dot?"":hostname); } static void save_history_based_model(struct starpu_perfmodel *model) { STARPU_ASSERT(model); STARPU_ASSERT(model->symbol); /* TODO checks */ /* filename = $STARPU_PERF_MODEL_DIR/codelets/symbol.hostname */ char path[256]; get_model_path(model, path, 256); _STARPU_DEBUG("Opening performance model file %s for model %s\n", path, model->symbol); /* overwrite existing file, or create it */ FILE *f; f = fopen(path, "w+"); STARPU_ASSERT_MSG(f, "Could not save performance model %s\n", path); _starpu_fwrlock(f); _starpu_ftruncate(f); dump_model_file(f, model); _starpu_fwrunlock(f); fclose(f); } static void _starpu_dump_registered_models(void) { #ifndef STARPU_SIMGRID STARPU_PTHREAD_RWLOCK_WRLOCK(®istered_models_rwlock); struct _starpu_perfmodel_list *node; node = registered_models; _STARPU_DEBUG("DUMP MODELS !\n"); while (node) { save_history_based_model(node->model); node = node->next; } STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); #endif } void _starpu_initialize_registered_performance_models(void) { registered_models = NULL; STARPU_PTHREAD_RWLOCK_INIT(®istered_models_rwlock, NULL); _starpu_calibration_minimum = starpu_get_env_number_default("STARPU_CALIBRATE_MINIMUM", 10); } void _starpu_deinitialize_performance_model(struct starpu_perfmodel *model) { unsigned arch; unsigned nimpl; for (arch = 0; arch < STARPU_NARCH_VARIATIONS; arch++) { for (nimpl = 0; nimpl < STARPU_MAXIMPLEMENTATIONS; nimpl++) { struct starpu_perfmodel_per_arch *archmodel = &model->per_arch[arch][nimpl]; struct starpu_perfmodel_history_list *list, *plist; struct starpu_perfmodel_history_table *entry, *tmp; HASH_ITER(hh, archmodel->history, entry, tmp) { HASH_DEL(archmodel->history, entry); free(entry); } archmodel->history = NULL; list = archmodel->list; while (list) { free(list->entry); plist = list; list = list->next; free(plist); } archmodel->list = NULL; } } 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_list *node, *pnode; node = registered_models; _STARPU_DEBUG("FREE MODELS !\n"); while (node) { struct starpu_perfmodel *model = node->model; STARPU_PTHREAD_RWLOCK_WRLOCK(&model->model_rwlock); _starpu_deinitialize_performance_model(model); STARPU_PTHREAD_RWLOCK_UNLOCK(&model->model_rwlock); pnode = node; node = node->next; free(pnode); } registered_models = NULL; STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); STARPU_PTHREAD_RWLOCK_DESTROY(®istered_models_rwlock); starpu_perfmodel_free_sampling_directories(); } /* * XXX: We should probably factorize the beginning of the _starpu_load_*_model * functions. This is a bit tricky though, because we must be sure to unlock * registered_models_rwlock at the right place. */ void _starpu_load_per_arch_based_model(struct starpu_perfmodel *model) { STARPU_ASSERT(model && model->symbol); int already_loaded; STARPU_PTHREAD_RWLOCK_RDLOCK(®istered_models_rwlock); already_loaded = model->is_loaded; STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); if (already_loaded) 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_loaded) { STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return; } STARPU_PTHREAD_RWLOCK_INIT(&model->model_rwlock, NULL); STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); } void _starpu_load_common_based_model(struct starpu_perfmodel *model) { STARPU_ASSERT(model && model->symbol); int already_loaded; STARPU_PTHREAD_RWLOCK_RDLOCK(®istered_models_rwlock); already_loaded = model->is_loaded; STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); if (already_loaded) 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_loaded) { STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return; } STARPU_PTHREAD_RWLOCK_INIT(&model->model_rwlock, NULL); STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); } /* 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_ASSERT(model); STARPU_ASSERT(model->symbol); int already_loaded; STARPU_PTHREAD_RWLOCK_RDLOCK(®istered_models_rwlock); already_loaded = model->is_loaded; STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); if (already_loaded) 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_loaded) { STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); return; } STARPU_PTHREAD_RWLOCK_INIT(&model->model_rwlock, NULL); STARPU_PTHREAD_RWLOCK_WRLOCK(&model->model_rwlock); /* make sure the performance model directory exists (or create it) */ _starpu_create_sampling_directory_if_needed(); char path[256]; get_model_path(model, path, 256); _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; /* try to open an existing file and load it */ int res; res = access(path, F_OK); if (res == 0) { 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"); initialize_model(model); } else { /* We load the available file */ _STARPU_DEBUG("File exists\n"); FILE *f; f = fopen(path, "r"); STARPU_ASSERT(f); _starpu_frdlock(f); parse_model_file(f, model, scan_history); _starpu_frdunlock(f); fclose(f); } } else { _STARPU_DEBUG("File does not exists\n"); initialize_model(model); } _STARPU_DEBUG("Performance model file %s for model %s is loaded\n", path, model->symbol); model->is_loaded = 1; STARPU_PTHREAD_RWLOCK_UNLOCK(&model->model_rwlock); STARPU_PTHREAD_RWLOCK_UNLOCK(®istered_models_rwlock); } void starpu_perfmodel_directory(FILE *output) { fprintf(output, "directory: <%s>\n", _starpu_get_perf_model_dir_codelet()); } /* This function is intended to be used by external tools that should read * the performance model files */ int starpu_perfmodel_list(FILE *output) { #if !defined(_WIN32) || defined(__MINGW32__) || defined(__CYGWIN__) char *path; DIR *dp; struct dirent *ep; path = _starpu_get_perf_model_dir_codelet(); dp = opendir(path); if (dp != NULL) { while ((ep = readdir(dp))) { if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) fprintf(output, "file: <%s>\n", ep->d_name); } closedir (dp); } else { _STARPU_DISP("Could not open the perfmodel directory <%s>: %s\n", path, strerror(errno)); } return 0; #else fprintf(stderr,"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); initialize_model(model); /* where is the file if it exists ? */ char path[256]; get_model_path(model, path, 256); // _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; } FILE *f = fopen(path, "r"); STARPU_ASSERT(f); _starpu_frdlock(f); parse_model_file(f, model, 1); _starpu_frdunlock(f); res = fclose(f); STARPU_ASSERT(res == 0); return 0; } int starpu_perfmodel_unload_model(struct starpu_perfmodel *model) { free((char *)model->symbol); _starpu_deinitialize_performance_model(model); return 0; } void starpu_perfmodel_get_arch_name(enum starpu_perfmodel_archtype arch, char *archname, size_t maxlen,unsigned nimpl) { if (arch < STARPU_CUDA_DEFAULT) { if (arch == STARPU_CPU_DEFAULT) { /* NB: We could just use cpu_1 as well ... */ snprintf(archname, maxlen, "cpu_impl_%u",nimpl); } else { /* For combined CPU workers */ int cpu_count = arch - STARPU_CPU_DEFAULT + 1; snprintf(archname, maxlen, "cpu_%d_impl_%u", cpu_count,nimpl); } } else if ((STARPU_CUDA_DEFAULT <= arch) && (arch < STARPU_CUDA_DEFAULT + STARPU_MAXCUDADEVS)) { int devid = arch - STARPU_CUDA_DEFAULT; snprintf(archname, maxlen, "cuda_%d_impl_%u", devid,nimpl); } else if ((STARPU_OPENCL_DEFAULT <= arch) && (arch < STARPU_OPENCL_DEFAULT + STARPU_MAXOPENCLDEVS)) { int devid = arch - STARPU_OPENCL_DEFAULT; snprintf(archname, maxlen, "opencl_%d_impl_%u", devid,nimpl); } else { STARPU_ABORT(); } } void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, char *path, size_t maxlen, unsigned nimpl) { char archname[32]; starpu_perfmodel_get_arch_name(arch, archname, 32, nimpl); STARPU_ASSERT(path); get_model_debug_path(model, archname, path, maxlen); } double _starpu_regression_based_job_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, struct _starpu_job *j, unsigned nimpl) { double exp = NAN; size_t size = _starpu_job_get_data_size(model, arch, nimpl, j); struct starpu_perfmodel_regression_model *regmodel; regmodel = &model->per_arch[arch][nimpl].regression; if (regmodel->valid && size >= regmodel->minx * 0.9 && size <= regmodel->maxx * 1.1) exp = regmodel->alpha*pow((double)size, regmodel->beta); STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(exp) && !model->benchmarking) { char archname[32]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated enough for %s size %lu (only %u measurements from size %lu to %lu), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this.\n", model->symbol, archname, (unsigned long) size, regmodel->nsample, regmodel->minx, regmodel->maxx); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } return exp; } double _starpu_non_linear_regression_based_job_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, struct _starpu_job *j,unsigned nimpl) { double exp = NAN; size_t size = _starpu_job_get_data_size(model, arch, nimpl, j); struct starpu_perfmodel_regression_model *regmodel; regmodel = &model->per_arch[arch][nimpl].regression; if (regmodel->nl_valid && size >= regmodel->minx * 0.9 && size <= regmodel->maxx * 1.1) exp = regmodel->a*pow((double)size, regmodel->b) + regmodel->c; else { uint32_t key = _starpu_compute_buffers_footprint(model, arch, nimpl, j); struct starpu_perfmodel_per_arch *per_arch_model = &model->per_arch[arch][nimpl]; struct starpu_perfmodel_history_table *history; struct starpu_perfmodel_history_table *entry; STARPU_PTHREAD_RWLOCK_RDLOCK(&model->model_rwlock); history = per_arch_model->history; HASH_FIND_UINT32_T(history, &key, entry); STARPU_PTHREAD_RWLOCK_UNLOCK(&model->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; STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(exp) && !model->benchmarking) { char archname[32]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated enough for %s (only %u measurements), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this.\n", model->symbol, archname, entry && entry->history_entry ? entry->history_entry->nsample : 0); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } } return exp; } double _starpu_history_based_job_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, struct _starpu_job *j,unsigned nimpl) { double exp = NAN; struct starpu_perfmodel_per_arch *per_arch_model; struct starpu_perfmodel_history_entry *entry; struct starpu_perfmodel_history_table *history, *elt; uint32_t key = _starpu_compute_buffers_footprint(model, arch, nimpl, j); per_arch_model = &model->per_arch[arch][nimpl]; STARPU_PTHREAD_RWLOCK_RDLOCK(&model->model_rwlock); history = per_arch_model->history; HASH_FIND_UINT32_T(history, &key, elt); entry = (elt == NULL) ? NULL : elt->history_entry; STARPU_PTHREAD_RWLOCK_UNLOCK(&model->model_rwlock); /* Here helgrind would shout that this is unprotected access. * We do not care about racing access to the mean, we only want * a good-enough estimation */ if (entry && entry->nsample >= _starpu_calibration_minimum) /* TODO: report differently if we've scheduled really enough * of that task and the scheduler should perhaps put it aside */ /* Calibrated enough */ exp = entry->mean; STARPU_HG_DISABLE_CHECKING(model->benchmarking); if (isnan(exp) && !model->benchmarking) { char archname[32]; starpu_perfmodel_get_arch_name(arch, archname, sizeof(archname), nimpl); _STARPU_DISP("Warning: model %s is not calibrated enough for %s (only %u measurements), forcing calibration for this run. Use the STARPU_CALIBRATE environment variable to control this.\n", model->symbol, archname, entry ? entry->nsample : 0); _starpu_set_calibrate_flag(1); model->benchmarking = 1; } return exp; } double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype 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); } void _starpu_update_perfmodel_history(struct _starpu_job *j, struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned cpuid STARPU_ATTRIBUTE_UNUSED, double measured, unsigned nimpl) { if (model) { STARPU_PTHREAD_RWLOCK_WRLOCK(&model->model_rwlock); struct starpu_perfmodel_per_arch *per_arch_model = &model->per_arch[arch][nimpl]; if (model->type == STARPU_HISTORY_BASED || model->type == STARPU_NL_REGRESSION_BASED) { struct starpu_perfmodel_history_entry *entry; struct starpu_perfmodel_history_table *elt; struct starpu_perfmodel_history_list **list; uint32_t key = _starpu_compute_buffers_footprint(model, arch, nimpl, 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 */ entry = (struct starpu_perfmodel_history_entry *) malloc(sizeof(struct starpu_perfmodel_history_entry)); STARPU_ASSERT(entry); /* Tell helgrind that we do not care about * racing access to the sampling, we only want a * good-enough estimation */ STARPU_HG_DISABLE_CHECKING(entry->nsample); STARPU_HG_DISABLE_CHECKING(entry->mean); /* Do not take the first measurement into account, it is very often quite bogus */ /* TODO: it'd be good to use a better estimation heuristic, like the median, or latest n values, etc. */ entry->mean = 0; entry->sum = 0; entry->deviation = 0.0; entry->sum2 = 0; entry->size = _starpu_job_get_data_size(model, arch, nimpl, j); entry->flops = j->task->flops; entry->footprint = key; entry->nsample = 0; insert_history_entry(entry, list, &per_arch_model->history); } else { /* there is already some entry with the same footprint */ entry->sum += measured; entry->sum2 += measured*measured; entry->nsample++; unsigned n = entry->nsample; entry->mean = entry->sum / n; entry->deviation = sqrt((entry->sum2 - (entry->sum*entry->sum)/n)/n); if (j->task->flops != 0.) { if (entry->flops == 0.) entry->flops = j->task->flops; else if (((entry->flops - j->task->flops) / entry->flops) > 0.00001) /* Incoherent flops! forget about trying to record flops */ entry->flops = NAN; } } STARPU_ASSERT(entry); } if (model->type == STARPU_REGRESSION_BASED || model->type == STARPU_NL_REGRESSION_BASED) { struct starpu_perfmodel_regression_model *reg_model; reg_model = &per_arch_model->regression; /* update the regression model */ size_t job_size = _starpu_job_get_data_size(model, arch, nimpl, j); double logy, logx; logx = log((double)job_size); logy = log(measured); reg_model->sumlnx += logx; reg_model->sumlnx2 += logx*logx; reg_model->sumlny += logy; reg_model->sumlnxlny += logx*logy; if (reg_model->minx == 0 || job_size < reg_model->minx) reg_model->minx = job_size; if (reg_model->maxx == 0 || job_size > reg_model->maxx) reg_model->maxx = job_size; reg_model->nsample++; if (VALID_REGRESSION(reg_model)) { unsigned n = reg_model->nsample; double num = (n*reg_model->sumlnxlny - reg_model->sumlnx*reg_model->sumlny); double denom = (n*reg_model->sumlnx2 - reg_model->sumlnx*reg_model->sumlnx); reg_model->beta = num/denom; reg_model->alpha = exp((reg_model->sumlny - reg_model->beta*reg_model->sumlnx)/n); reg_model->valid = 1; } } #ifdef STARPU_MODEL_DEBUG struct starpu_task *task = j->task; FILE *f = fopen(per_arch_model->debug_path, "a+"); if (f == NULL) { _STARPU_DISP("Error <%s> when opening file <%s>\n", strerror(errno), per_arch_model->debug_path); return; } _starpu_fwrlock(f); if (!j->footprint_is_computed) (void) _starpu_compute_buffers_footprint(model, arch, nimpl, j); STARPU_ASSERT(j->footprint_is_computed); fprintf(f, "0x%x\t%lu\t%f\t%f\t%f\t%d\t\t", j->footprint, (unsigned long) _starpu_job_get_data_size(model, arch, nimpl, j), measured, task->predicted, task->predicted_transfer, cpuid); unsigned i; for (i = 0; i < task->cl->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"); _starpu_fwrunlock(f); fclose(f); #endif STARPU_PTHREAD_RWLOCK_UNLOCK(&model->model_rwlock); } } void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned cpuid, unsigned nimpl, double measured) { struct _starpu_job *job = _starpu_get_job_associated_to_task(task); _starpu_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); } starpu-1.1.5/src/core/perfmodel/regression.h0000644000373600000000000000202012571536573016003 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __REGRESSION_H__ #define __REGRESSION_H__ #include #include #include #include #include int _starpu_regression_non_linear_power(struct starpu_perfmodel_history_list *ptr, double *a, double *b, double *c); #endif // __REGRESSION_H__ starpu-1.1.5/src/core/perfmodel/perfmodel_bus.c0000644000373600000000000014046612571536573016465 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifdef STARPU_USE_CUDA #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #endif #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #ifdef STARPU_USE_OPENCL #include #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #define SIZE (32*1024*1024*sizeof(char)) #define NITER 128 #ifndef STARPU_SIMGRID static void _starpu_bus_force_sampling(void); #endif /* timing is in µs per byte (i.e. slowness, inverse of bandwidth) */ struct dev_timing { int cpu_id; double timing_htod; double latency_htod; double timing_dtoh; double latency_dtoh; }; /* TODO: measure latency */ static double bandwidth_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; static double latency_matrix[STARPU_MAXNODES][STARPU_MAXNODES]; static unsigned was_benchmarked = 0; static unsigned ncpus = 0; static unsigned ncuda = 0; static unsigned nopencl = 0; /* Benchmarking the performance of the bus */ #ifdef STARPU_USE_CUDA static uint64_t cuda_size[STARPU_MAXCUDADEVS]; static int cuda_affinity_matrix[STARPU_MAXCUDADEVS][STARPU_MAXCPUS]; static double cudadev_timing_htod[STARPU_MAXNODES] = {0.0}; static double cudadev_latency_htod[STARPU_MAXNODES] = {0.0}; static double cudadev_timing_dtoh[STARPU_MAXNODES] = {0.0}; static double cudadev_latency_dtoh[STARPU_MAXNODES] = {0.0}; #ifdef HAVE_CUDA_MEMCPY_PEER static double cudadev_timing_dtod[STARPU_MAXNODES][STARPU_MAXNODES] = {{0.0}}; static double cudadev_latency_dtod[STARPU_MAXNODES][STARPU_MAXNODES] = {{0.0}}; #endif static struct dev_timing cudadev_timing_per_cpu[STARPU_MAXNODES*STARPU_MAXCPUS]; #endif #ifdef STARPU_USE_OPENCL static uint64_t opencl_size[STARPU_MAXCUDADEVS]; static int opencl_affinity_matrix[STARPU_MAXOPENCLDEVS][STARPU_MAXCPUS]; static double opencldev_timing_htod[STARPU_MAXNODES] = {0.0}; static double opencldev_latency_htod[STARPU_MAXNODES] = {0.0}; static double opencldev_timing_dtoh[STARPU_MAXNODES] = {0.0}; static double opencldev_latency_dtoh[STARPU_MAXNODES] = {0.0}; static struct dev_timing opencldev_timing_per_cpu[STARPU_MAXNODES*STARPU_MAXCPUS]; #endif #ifdef STARPU_HAVE_HWLOC static hwloc_topology_t hwtopology; #endif #if (defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL)) && !defined(STARPU_SIMGRID) #ifdef STARPU_USE_CUDA static void measure_bandwidth_between_host_and_dev_on_cpu_with_cuda(int dev, int cpu, struct dev_timing *dev_timing_per_cpu) { struct _starpu_machine_config *config = _starpu_get_machine_config(); _starpu_bind_thread_on_cpu(config, cpu); size_t size = SIZE; /* Initialize CUDA context on the device */ /* We do not need to enable OpenGL interoperability at this point, * since we cleanly shutdown CUDA before returning. */ cudaSetDevice(dev); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* hack to force the initialization */ cudaFree(0); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* Get the maximum size which can be allocated on the device */ struct cudaDeviceProp prop; cudaError_t cures; cures = cudaGetDeviceProperties(&prop, dev); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cuda_size[dev] = prop.totalGlobalMem; if (size > prop.totalGlobalMem/4) size = prop.totalGlobalMem/4; /* Allocate a buffer on the device */ unsigned char *d_buffer; cures = cudaMalloc((void **)&d_buffer, size); STARPU_ASSERT(cures == cudaSuccess); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* Allocate a buffer on the host */ unsigned char *h_buffer; cures = cudaHostAlloc((void **)&h_buffer, size, 0); STARPU_ASSERT(cures == cudaSuccess); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* Fill them */ memset(h_buffer, 0, size); cudaMemset(d_buffer, 0, size); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); unsigned iter; double timing; double start; double end; /* Measure upload bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(d_buffer, h_buffer, size, cudaMemcpyHostToDevice); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod = timing/NITER/size; /* Measure download bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(h_buffer, d_buffer, size, cudaMemcpyDeviceToHost); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(d_buffer, h_buffer, 1, cudaMemcpyHostToDevice); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod = timing/NITER; /* Measure download latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpy(h_buffer, d_buffer, 1, cudaMemcpyDeviceToHost); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh = timing/NITER; /* Free buffers */ cudaFreeHost(h_buffer); cudaFree(d_buffer); cudaThreadExit(); } #ifdef HAVE_CUDA_MEMCPY_PEER static void measure_bandwidth_between_dev_and_dev_cuda(int src, int dst) { size_t size = SIZE; int can; /* Get the maximum size which can be allocated on the device */ struct cudaDeviceProp prop; cudaError_t cures; cures = cudaGetDeviceProperties(&prop, src); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); if (size > prop.totalGlobalMem/4) size = prop.totalGlobalMem/4; cures = cudaGetDeviceProperties(&prop, dst); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); if (size > prop.totalGlobalMem/4) size = prop.totalGlobalMem/4; /* Initialize CUDA context on the source */ /* We do not need to enable OpenGL interoperability at this point, * since we cleanly shutdown CUDA before returning. */ cudaSetDevice(src); if (starpu_get_env_number("STARPU_ENABLE_CUDA_GPU_GPU_DIRECT") != 0) { cures = cudaDeviceCanAccessPeer(&can, src, dst); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(dst, 0); if (!cures) _STARPU_DISP("GPU-Direct %d -> %d\n", dst, src); } } /* Allocate a buffer on the device */ unsigned char *s_buffer; cures = cudaMalloc((void **)&s_buffer, size); STARPU_ASSERT(cures == cudaSuccess); cudaMemset(s_buffer, 0, size); /* Initialize CUDA context on the destination */ /* We do not need to enable OpenGL interoperability at this point, * since we cleanly shutdown CUDA before returning. */ cudaSetDevice(dst); if (starpu_get_env_number("STARPU_ENABLE_CUDA_GPU_GPU_DIRECT") != 0) { cures = cudaDeviceCanAccessPeer(&can, dst, src); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(src, 0); if (!cures) _STARPU_DISP("GPU-Direct %d -> %d\n", src, dst); } } /* Allocate a buffer on the device */ unsigned char *d_buffer; cures = cudaMalloc((void **)&d_buffer, size); STARPU_ASSERT(cures == cudaSuccess); cudaMemset(d_buffer, 0, size); unsigned iter; double timing; double start; double end; /* Measure upload bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpyPeer(d_buffer, dst, s_buffer, src, size); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; cudadev_timing_dtod[src+1][dst+1] = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { cudaMemcpyPeer(d_buffer, dst, s_buffer, src, 1); cudaThreadSynchronize(); } end = starpu_timing_now(); timing = end - start; cudadev_latency_dtod[src+1][dst+1] = timing/NITER; /* Free buffers */ cudaFree(d_buffer); cudaSetDevice(src); cudaFree(s_buffer); cudaThreadExit(); } #endif #endif #ifdef STARPU_USE_OPENCL static void measure_bandwidth_between_host_and_dev_on_cpu_with_opencl(int dev, int cpu, struct dev_timing *dev_timing_per_cpu) { cl_context context; cl_command_queue queue; cl_int err=0; size_t size = SIZE; int not_initialized; struct _starpu_machine_config *config = _starpu_get_machine_config(); _starpu_bind_thread_on_cpu(config, cpu); /* Is the context already initialised ? */ starpu_opencl_get_context(dev, &context); not_initialized = (context == NULL); if (not_initialized == 1) _starpu_opencl_init_context(dev); /* Get context and queue */ starpu_opencl_get_context(dev, &context); starpu_opencl_get_queue(dev, &queue); /* Get the maximum size which can be allocated on the device */ cl_device_id device; cl_ulong maxMemAllocSize, totalGlobalMem; starpu_opencl_get_device(dev, &device); err = clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(maxMemAllocSize), &maxMemAllocSize, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); if (size > (size_t)maxMemAllocSize/4) size = maxMemAllocSize/4; err = clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE , sizeof(totalGlobalMem), &totalGlobalMem, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); opencl_size[dev] = totalGlobalMem; if (_starpu_opencl_get_device_type(dev) == CL_DEVICE_TYPE_CPU) { /* Let's not use too much RAM when running OpenCL on a CPU: it * would make the OS swap like crazy. */ size /= 2; } /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* Allocate a buffer on the device */ cl_mem d_buffer; d_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, size, NULL, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* Allocate a buffer on the host */ unsigned char *h_buffer; h_buffer = (unsigned char *)malloc(size); STARPU_ASSERT(h_buffer); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); /* Fill them */ memset(h_buffer, 0, size); err = clEnqueueWriteBuffer(queue, d_buffer, CL_TRUE, 0, size, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); /* hack to avoid third party libs to rebind threads */ _starpu_bind_thread_on_cpu(config, cpu); unsigned iter; double timing; double start; double end; /* Measure upload bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueWriteBuffer(queue, d_buffer, CL_TRUE, 0, size, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod = timing/NITER/size; /* Measure download bandwidth */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueReadBuffer(queue, d_buffer, CL_TRUE, 0, size, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh = timing/NITER/size; /* Measure upload latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueWriteBuffer(queue, d_buffer, CL_TRUE, 0, 1, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod = timing/NITER; /* Measure download latency */ start = starpu_timing_now(); for (iter = 0; iter < NITER; iter++) { err = clEnqueueReadBuffer(queue, d_buffer, CL_TRUE, 0, 1, h_buffer, 0, NULL, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); clFinish(queue); } end = starpu_timing_now(); timing = end - start; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh = timing/NITER; /* Free buffers */ err = clReleaseMemObject(d_buffer); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); free(h_buffer); /* Uninitiliaze OpenCL context on the device */ if (not_initialized == 1) _starpu_opencl_deinit_context(dev); } #endif /* NB: we want to sort the bandwidth by DECREASING order */ static int compar_dev_timing(const void *left_dev_timing, const void *right_dev_timing) { const struct dev_timing *left = (const struct dev_timing *)left_dev_timing; const struct dev_timing *right = (const struct dev_timing *)right_dev_timing; double left_dtoh = left->timing_dtoh; double left_htod = left->timing_htod; double right_dtoh = right->timing_dtoh; double right_htod = right->timing_htod; double timing_sum2_left = left_dtoh*left_dtoh + left_htod*left_htod; double timing_sum2_right = right_dtoh*right_dtoh + right_htod*right_htod; /* it's for a decreasing sorting */ return (timing_sum2_left > timing_sum2_right); } #ifdef STARPU_HAVE_HWLOC static int find_numa_node(hwloc_obj_t obj) { STARPU_ASSERT(obj); hwloc_obj_t current = obj; while (current->depth != HWLOC_OBJ_NODE) { current = current->parent; /* If we don't find a "node" obj before the root, this means * hwloc does not know whether there are numa nodes or not, so * we should not use a per-node sampling in that case. */ STARPU_ASSERT(current); } STARPU_ASSERT(current->depth == HWLOC_OBJ_NODE); return current->logical_index; } #endif static void measure_bandwidth_between_cpus_and_dev(int dev, struct dev_timing *dev_timing_per_cpu, char *type) { /* Either we have hwloc and we measure the bandwith between each GPU * and each NUMA node, or we don't have such NUMA information and we * measure the bandwith for each pair of (CPU, GPU), which is slower. * */ #ifdef STARPU_HAVE_HWLOC int cpu_depth = hwloc_get_type_depth(hwtopology, HWLOC_OBJ_CORE); int nnuma_nodes = hwloc_get_nbobjs_by_depth(hwtopology, HWLOC_OBJ_NODE); /* If no NUMA node was found, we assume that we have a single memory * bank. */ const unsigned no_node_obj_was_found = (nnuma_nodes == 0); unsigned *is_available_per_numa_node = NULL; double *dev_timing_htod_per_numa_node = NULL; double *dev_latency_htod_per_numa_node = NULL; double *dev_timing_dtoh_per_numa_node = NULL; double *dev_latency_dtoh_per_numa_node = NULL; if (!no_node_obj_was_found) { is_available_per_numa_node = (unsigned *)malloc(nnuma_nodes * sizeof(unsigned)); STARPU_ASSERT(is_available_per_numa_node); dev_timing_htod_per_numa_node = (double *)malloc(nnuma_nodes * sizeof(double)); STARPU_ASSERT(dev_timing_htod_per_numa_node); dev_latency_htod_per_numa_node = (double *)malloc(nnuma_nodes * sizeof(double)); STARPU_ASSERT(dev_latency_htod_per_numa_node); dev_timing_dtoh_per_numa_node = (double *)malloc(nnuma_nodes * sizeof(double)); STARPU_ASSERT(dev_timing_dtoh_per_numa_node); dev_latency_dtoh_per_numa_node = (double *)malloc(nnuma_nodes * sizeof(double)); STARPU_ASSERT(dev_latency_dtoh_per_numa_node); memset(is_available_per_numa_node, 0, nnuma_nodes*sizeof(unsigned)); } #endif unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].cpu_id = cpu; #ifdef STARPU_HAVE_HWLOC int numa_id = 0; if (!no_node_obj_was_found) { hwloc_obj_t obj = hwloc_get_obj_by_depth(hwtopology, cpu_depth, cpu); numa_id = find_numa_node(obj); if (is_available_per_numa_node[numa_id]) { /* We reuse the previous numbers for that NUMA node */ dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod = dev_timing_htod_per_numa_node[numa_id]; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod = dev_latency_htod_per_numa_node[numa_id]; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh = dev_timing_dtoh_per_numa_node[numa_id]; dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh = dev_latency_dtoh_per_numa_node[numa_id]; continue; } } #endif #ifdef STARPU_USE_CUDA if (strncmp(type, "CUDA", 4) == 0) measure_bandwidth_between_host_and_dev_on_cpu_with_cuda(dev, cpu, dev_timing_per_cpu); #endif #ifdef STARPU_USE_OPENCL if (strncmp(type, "OpenCL", 6) == 0) measure_bandwidth_between_host_and_dev_on_cpu_with_opencl(dev, cpu, dev_timing_per_cpu); #endif #ifdef STARPU_HAVE_HWLOC if (!no_node_obj_was_found && !is_available_per_numa_node[numa_id]) { /* Save the results for that NUMA node */ dev_timing_htod_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod; dev_latency_htod_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_htod; dev_timing_dtoh_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh; dev_latency_dtoh_per_numa_node[numa_id] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].latency_dtoh; is_available_per_numa_node[numa_id] = 1; } #endif } #ifdef STARPU_HAVE_HWLOC if (!no_node_obj_was_found) { free(is_available_per_numa_node); free(dev_timing_htod_per_numa_node); free(dev_latency_htod_per_numa_node); free(dev_timing_dtoh_per_numa_node); free(dev_latency_dtoh_per_numa_node); } #endif /* STARPU_HAVE_HWLOC */ } static void measure_bandwidth_between_host_and_dev(int dev, double *dev_timing_htod, double *dev_latency_htod, double *dev_timing_dtoh, double *dev_latency_dtoh, struct dev_timing *dev_timing_per_cpu, char *type) { measure_bandwidth_between_cpus_and_dev(dev, dev_timing_per_cpu, type); /* sort the results */ qsort(&(dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS]), ncpus, sizeof(struct dev_timing), compar_dev_timing); #ifdef STARPU_VERBOSE unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { unsigned current_cpu = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].cpu_id; double bandwidth_dtoh = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_dtoh; double bandwidth_htod = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+cpu].timing_htod; double bandwidth_sum2 = bandwidth_dtoh*bandwidth_dtoh + bandwidth_htod*bandwidth_htod; _STARPU_DISP("(%10s) BANDWIDTH GPU %d CPU %u - htod %f - dtoh %f - %f\n", type, dev, current_cpu, bandwidth_htod, bandwidth_dtoh, sqrt(bandwidth_sum2)); } unsigned best_cpu = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].cpu_id; _STARPU_DISP("(%10s) BANDWIDTH GPU %d BEST CPU %u\n", type, dev, best_cpu); #endif /* The results are sorted in a decreasing order, so that the best * measurement is currently the first entry. */ dev_timing_dtoh[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].timing_dtoh; dev_latency_dtoh[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].latency_dtoh; dev_timing_htod[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].timing_htod; dev_latency_htod[dev+1] = dev_timing_per_cpu[(dev+1)*STARPU_MAXCPUS+0].latency_htod; } #endif /* defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) */ static void benchmark_all_gpu_devices(void) { #ifdef STARPU_SIMGRID _STARPU_DISP("can not measure bus in simgrid mode, please run starpu_calibrate_bus in non-simgrid mode to make sure the bus performance model was calibrated\n"); STARPU_ABORT(); #else /* !SIMGRID */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) unsigned i; #endif #ifdef HAVE_CUDA_MEMCPY_PEER unsigned j; #endif _STARPU_DEBUG("Benchmarking the speed of the bus\n"); #ifdef STARPU_HAVE_HWLOC hwloc_topology_init(&hwtopology); hwloc_topology_load(hwtopology); #endif #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t former_cpuset = hwloc_bitmap_alloc(); hwloc_get_cpubind(hwtopology, former_cpuset, HWLOC_CPUBIND_THREAD); #elif __linux__ /* Save the current cpu binding */ cpu_set_t former_process_affinity; int ret; ret = sched_getaffinity(0, sizeof(former_process_affinity), &former_process_affinity); if (ret) { perror("sched_getaffinity"); STARPU_ABORT(); } #else #warning Missing binding support, StarPU will not be able to properly benchmark NUMA topology #endif struct _starpu_machine_config *config = _starpu_get_machine_config(); ncpus = _starpu_topology_get_nhwcpu(config); #ifdef STARPU_USE_CUDA ncuda = _starpu_get_cuda_device_count(); for (i = 0; i < ncuda; i++) { _STARPU_DISP("CUDA %d...\n", i); /* measure bandwidth between Host and Device i */ measure_bandwidth_between_host_and_dev(i, cudadev_timing_htod, cudadev_latency_htod, cudadev_timing_dtoh, cudadev_latency_dtoh, cudadev_timing_per_cpu, "CUDA"); } #ifdef HAVE_CUDA_MEMCPY_PEER for (i = 0; i < ncuda; i++) for (j = 0; j < ncuda; j++) if (i != j) { _STARPU_DISP("CUDA %d -> %d...\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 %d...\n", i); /* measure bandwith between Host and Device i */ measure_bandwidth_between_host_and_dev(i, opencldev_timing_htod, opencldev_latency_htod, opencldev_timing_dtoh, opencldev_latency_dtoh, opencldev_timing_per_cpu, "OpenCL"); } #endif #ifdef STARPU_HAVE_HWLOC hwloc_set_cpubind(hwtopology, former_cpuset, HWLOC_CPUBIND_THREAD); hwloc_bitmap_free(former_cpuset); #elif __linux__ /* Restore the former affinity */ ret = sched_setaffinity(0, sizeof(former_process_affinity), &former_process_affinity); if (ret) { perror("sched_setaffinity"); STARPU_ABORT(); } #endif #ifdef STARPU_HAVE_HWLOC hwloc_topology_destroy(hwtopology); #endif _STARPU_DEBUG("Benchmarking the speed of the bus is done.\n"); was_benchmarked = 1; #endif /* !SIMGRID */ } static void get_bus_path(const char *type, char *path, size_t maxlen) { char hostname[65]; _starpu_gethostname(hostname, sizeof(hostname)); snprintf(path, maxlen, "%s%s.%s", _starpu_get_perf_model_dir_bus(), hostname, type); } /* * Affinity */ #ifndef STARPU_SIMGRID static void get_affinity_path(char *path, size_t maxlen) { get_bus_path("affinity", path, maxlen); } static void load_bus_affinity_file_content(void) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) FILE *f; char path[256]; get_affinity_path(path, sizeof(path)); _STARPU_DEBUG("loading affinities from %s\n", path); f = fopen(path, "r"); STARPU_ASSERT(f); _starpu_frdlock(f); struct _starpu_machine_config *config = _starpu_get_machine_config(); ncpus = _starpu_topology_get_nhwcpu(config); unsigned gpu; #ifdef STARPU_USE_CUDA ncuda = _starpu_get_cuda_device_count(); for (gpu = 0; gpu < ncuda; gpu++) { int ret; unsigned dummy; _starpu_drop_comments(f); ret = fscanf(f, "%d\t", &dummy); STARPU_ASSERT(ret == 1); STARPU_ASSERT(dummy == gpu); unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { ret = fscanf(f, "%d\t", &cuda_affinity_matrix[gpu][cpu]); STARPU_ASSERT(ret == 1); } ret = fscanf(f, "\n"); STARPU_ASSERT(ret == 0); } #endif /* !STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL nopencl = _starpu_opencl_get_device_count(); for (gpu = 0; gpu < nopencl; gpu++) { int ret; unsigned dummy; _starpu_drop_comments(f); ret = fscanf(f, "%d\t", &dummy); STARPU_ASSERT(ret == 1); STARPU_ASSERT(dummy == gpu); unsigned cpu; for (cpu = 0; cpu < ncpus; cpu++) { ret = fscanf(f, "%d\t", &opencl_affinity_matrix[gpu][cpu]); STARPU_ASSERT(ret == 1); } ret = fscanf(f, "\n"); STARPU_ASSERT(ret == 0); } #endif /* !STARPU_USE_OPENCL */ _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[256]; 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(); } _starpu_frdlock(f); unsigned cpu; unsigned gpu; fprintf(f, "# GPU\t"); for (cpu = 0; cpu < ncpus; cpu++) fprintf(f, "CPU%u\t", cpu); fprintf(f, "\n"); #ifdef STARPU_USE_CUDA for (gpu = 0; gpu < ncuda; gpu++) { fprintf(f, "%d\t", gpu); for (cpu = 0; cpu < ncpus; cpu++) { fprintf(f, "%d\t", cudadev_timing_per_cpu[(gpu+1)*STARPU_MAXCPUS+cpu].cpu_id); } fprintf(f, "\n"); } #endif #ifdef STARPU_USE_OPENCL for (gpu = 0; gpu < nopencl; gpu++) { fprintf(f, "%d\t", gpu); for (cpu = 0; cpu < ncpus; cpu++) { fprintf(f, "%d\t", opencldev_timing_per_cpu[(gpu+1)*STARPU_MAXCPUS+cpu].cpu_id); } fprintf(f, "\n"); } #endif _starpu_frdunlock(f); fclose(f); #endif } #endif /* STARPU_SIMGRID */ static void generate_bus_affinity_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); write_bus_affinity_file_content(); } static void load_bus_affinity_file(void) { int res; char path[256]; get_affinity_path(path, sizeof(path)); res = access(path, F_OK); if (res) { /* File does not exist yet */ generate_bus_affinity_file(); } load_bus_affinity_file_content(); } #ifdef STARPU_USE_CUDA int *_starpu_get_cuda_affinity_vector(unsigned gpuid) { return cuda_affinity_matrix[gpuid]; } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_OPENCL int *_starpu_get_opencl_affinity_vector(unsigned gpuid) { return opencl_affinity_matrix[gpuid]; } #endif /* STARPU_USE_OPENCL */ void starpu_bus_print_affinity(FILE *f) { #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) unsigned cpu; unsigned gpu; #endif fprintf(f, "# GPU\tCPU in preference order (logical index)\n"); #ifdef STARPU_USE_CUDA fprintf(f, "# CUDA\n"); for(gpu = 0 ; gpu. Expected a number\n", path); fclose(f); return 0; } n = getc(f); if (n == '\n') break; if (n != '\t') { _STARPU_DISP("bogus character %c in latency file %s\n", n, path); fclose(f); return 0; } latency_matrix[src][dst] = latency; /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = '\t'; } /* No more values, take NAN */ for ( ; dst < STARPU_MAXNODES; dst++) latency_matrix[src][dst] = NAN; while (n == '\t') { /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = _starpu_read_double(f, "%lf", &latency); if (n && !isnan(latency)) { _STARPU_DISP("Too many nodes in latency file %s for this configuration (%d), use --enable-maxnodes to increase it\n", path, STARPU_MAXNODES); fclose(f); return 0; } n = getc(f); } if (n != '\n') { _STARPU_DISP("Bogus character %c in latency file %s\n", n, path); fclose(f); return 0; } /* Look out for EOF */ n = getc(f); if (n == EOF) break; ungetc(n, f); } _starpu_frdunlock(f); fclose(f); /* No more values, take NAN */ for ( ; src < STARPU_MAXNODES; src++) for (dst = 0; dst < STARPU_MAXNODES; dst++) latency_matrix[src][dst] = NAN; return 1; } #ifndef STARPU_SIMGRID static void write_bus_latency_file_content(void) { unsigned src, dst, maxnode; FILE *f; STARPU_ASSERT(was_benchmarked); char path[256]; get_latency_path(path, sizeof(path)); _STARPU_DEBUG("writing latencies to %s\n", path); f = fopen(path, "w+"); if (!f) { perror("fopen write_bus_latency_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } _starpu_fwrlock(f); _starpu_ftruncate(f); fprintf(f, "# "); for (dst = 0; dst < STARPU_MAXNODES; dst++) fprintf(f, "to %d\t\t", dst); fprintf(f, "\n"); maxnode = ncuda; #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif for (src = 0; src < STARPU_MAXNODES; src++) { for (dst = 0; dst < STARPU_MAXNODES; dst++) { double latency = 0.0; if ((src > maxnode) || (dst > maxnode)) { /* convention */ latency = NAN; } else if (src == dst) { latency = 0.0; } else { /* µs */ #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER if (src && src < ncuda && dst && dst <= ncuda) latency = cudadev_latency_dtod[src][dst]; else #endif { if (src && src <= ncuda) latency += cudadev_latency_dtoh[src]; if (dst && dst <= ncuda) latency += cudadev_latency_htod[dst]; } #endif #ifdef STARPU_USE_OPENCL if (src > ncuda) latency += opencldev_latency_dtoh[src-ncuda]; if (dst > ncuda) latency += opencldev_latency_htod[dst-ncuda]; #endif } if (dst) fputc('\t', f); fprintf(f, "%lf", latency); } fprintf(f, "\n"); } _starpu_fwrunlock(f); fclose(f); } #endif static void generate_bus_latency_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); #ifndef STARPU_SIMGRID write_bus_latency_file_content(); #endif } static void load_bus_latency_file(void) { int res; char path[256]; get_latency_path(path, sizeof(path)); res = access(path, F_OK); if (res || !load_bus_latency_file_content()) { /* File does not exist yet or is bogus */ generate_bus_latency_file(); } } /* * Bandwidth */ static void get_bandwidth_path(char *path, size_t maxlen) { get_bus_path("bandwidth", path, maxlen); } static int load_bus_bandwidth_file_content(void) { int n; unsigned src, dst; FILE *f; double bandwidth; char path[256]; 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(); } _starpu_frdlock(f); for (src = 0; src < STARPU_MAXNODES; src++) { _starpu_drop_comments(f); for (dst = 0; dst < STARPU_MAXNODES; dst++) { n = _starpu_read_double(f, "%lf", &bandwidth); if (n != 1) { _STARPU_DISP("Error while reading bandwidth file <%s>. Expected a number\n", path); fclose(f); return 0; } n = getc(f); if (n == '\n') break; if (n != '\t') { _STARPU_DISP("bogus character %c in bandwidth file %s\n", n, path); fclose(f); return 0; } bandwidth_matrix[src][dst] = bandwidth; /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = '\t'; } /* No more values, take NAN */ for ( ; dst < STARPU_MAXNODES; dst++) bandwidth_matrix[src][dst] = NAN; while (n == '\t') { /* Look out for \t\n */ n = getc(f); if (n == '\n') break; ungetc(n, f); n = _starpu_read_double(f, "%lf", &bandwidth); if (n && !isnan(bandwidth)) { _STARPU_DISP("Too many nodes in bandwidth file %s for this configuration (%d), use --enable-maxnodes to increase it\n", path, STARPU_MAXNODES); fclose(f); return 0; } n = getc(f); } if (n != '\n') { _STARPU_DISP("Bogus character %c in bandwidth file %s\n", n, path); fclose(f); return 0; } /* Look out for EOF */ n = getc(f); if (n == EOF) break; ungetc(n, f); } _starpu_frdunlock(f); fclose(f); /* No more values, take NAN */ for ( ; src < STARPU_MAXNODES; src++) for (dst = 0; dst < STARPU_MAXNODES; dst++) latency_matrix[src][dst] = NAN; return 1; } #ifndef STARPU_SIMGRID static void write_bus_bandwidth_file_content(void) { unsigned src, dst, maxnode; FILE *f; STARPU_ASSERT(was_benchmarked); char path[256]; get_bandwidth_path(path, sizeof(path)); _STARPU_DEBUG("writing bandwidth to %s\n", path); f = fopen(path, "w+"); STARPU_ASSERT(f); _starpu_fwrlock(f); _starpu_ftruncate(f); fprintf(f, "# "); for (dst = 0; dst < STARPU_MAXNODES; dst++) fprintf(f, "to %d\t\t", dst); fprintf(f, "\n"); maxnode = ncuda; #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif for (src = 0; src < STARPU_MAXNODES; src++) { for (dst = 0; dst < STARPU_MAXNODES; dst++) { double bandwidth; if ((src > maxnode) || (dst > maxnode)) { bandwidth = NAN; } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) else if (src != dst) { double slowness = 0.0; /* Total bandwidth is the harmonic mean of bandwidths */ #ifdef STARPU_USE_CUDA #ifdef HAVE_CUDA_MEMCPY_PEER if (src && src <= ncuda && dst && dst <= ncuda) /* Direct GPU-GPU transfert */ slowness = cudadev_timing_dtod[src][dst]; else #endif { if (src && src <= ncuda) slowness += cudadev_timing_dtoh[src]; if (dst && dst <= ncuda) slowness += cudadev_timing_htod[dst]; } #endif #ifdef STARPU_USE_OPENCL if (src > ncuda) slowness += opencldev_timing_dtoh[src-ncuda]; if (dst > ncuda) slowness += opencldev_timing_htod[dst-ncuda]; #endif bandwidth = 1.0/slowness; } #endif else { /* convention */ bandwidth = 0.0; } if (dst) fputc('\t', f); fprintf(f, "%f", bandwidth); } fprintf(f, "\n"); } _starpu_fwrunlock(f); fclose(f); } #endif /* STARPU_SIMGRID */ void starpu_bus_print_bandwidth(FILE *f) { unsigned src, dst, maxnode; maxnode = ncuda; #ifdef STARPU_USE_OPENCL maxnode += nopencl; #endif fprintf(f, "from/to\t"); fprintf(f, "RAM\t"); for (dst = 0; dst < ncuda; dst++) fprintf(f, "CUDA %d\t", dst); for (dst = 0; dst < nopencl; dst++) fprintf(f, "OpenCL%d\t", dst); fprintf(f, "\n"); for (src = 0; src <= maxnode; src++) { if (!src) fprintf(f, "RAM\t"); else if (src <= ncuda) fprintf(f, "CUDA %d\t", src-1); else fprintf(f, "OpenCL%d\t", src-ncuda-1); for (dst = 0; dst <= maxnode; dst++) fprintf(f, "%.0f\t", bandwidth_matrix[src][dst]); fprintf(f, "\n"); } fprintf(f, "\n"); for (src = 0; src <= maxnode; src++) { if (!src) fprintf(f, "RAM\t"); else if (src <= ncuda) fprintf(f, "CUDA %d\t", src-1); else fprintf(f, "OpenCL%d\t", src-ncuda-1); for (dst = 0; dst <= maxnode; dst++) fprintf(f, "%.0f\t", latency_matrix[src][dst]); fprintf(f, "\n"); } #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) if (ncuda != 0 || nopencl != 0) fprintf(f, "\nGPU\tCPU in preference order (logical index), host-to-device, device-to-host\n"); for (src = 1; src <= maxnode; src++) { struct dev_timing *timing; struct _starpu_machine_config *config = _starpu_get_machine_config(); unsigned config_ncpus = _starpu_topology_get_nhwcpu(config); unsigned cpu; #ifdef STARPU_USE_CUDA if (src <= ncuda) { fprintf(f, "CUDA %d\t", src-1); for (cpu = 0; cpu < config_ncpus; cpu++) { timing = &cudadev_timing_per_cpu[src*STARPU_MAXCPUS+cpu]; if (timing->timing_htod) fprintf(f, "%2d %.0f %.0f\t", timing->cpu_id, 1/timing->timing_htod, 1/timing->timing_dtoh); else fprintf(f, "%2d\t", cuda_affinity_matrix[src-1][cpu]); } } #ifdef STARPU_USE_OPENCL else #endif #endif #ifdef STARPU_USE_OPENCL { fprintf(f, "OpenCL%d\t", src-ncuda-1); for (cpu = 0; cpu < config_ncpus; cpu++) { timing = &opencldev_timing_per_cpu[(src-ncuda)*STARPU_MAXCPUS+cpu]; if (timing->timing_htod) fprintf(f, "%2d %.0f %.0f\t", timing->cpu_id, 1/timing->timing_htod, 1/timing->timing_dtoh); else fprintf(f, "%2d\t", opencl_affinity_matrix[src-1][cpu]); } } #endif fprintf(f, "\n"); } #endif } static void generate_bus_bandwidth_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); #ifndef STARPU_SIMGRID write_bus_bandwidth_file_content(); #endif } static void load_bus_bandwidth_file(void) { int res; char path[256]; get_bandwidth_path(path, sizeof(path)); res = access(path, F_OK); if (res || !load_bus_bandwidth_file_content()) { /* File does not exist yet or is bogus */ generate_bus_bandwidth_file(); } } #ifndef STARPU_SIMGRID /* * Config */ static void get_config_path(char *path, size_t maxlen) { get_bus_path("config", path, maxlen); } static void check_bus_config_file(void) { int res; char path[256]; struct _starpu_machine_config *config = _starpu_get_machine_config(); get_config_path(path, sizeof(path)); res = access(path, F_OK); if (res || config->conf.bus_calibrate > 0) { if (res) _STARPU_DISP("No performance model for the bus, calibrating...\n"); _starpu_bus_force_sampling(); if (res) _STARPU_DISP("... done\n"); } else { FILE *f; int ret; unsigned read_cuda = -1, read_opencl = -1; unsigned read_cpus = -1; // Loading configuration from file f = fopen(path, "r"); STARPU_ASSERT(f); _starpu_frdlock(f); _starpu_drop_comments(f); ret = fscanf(f, "%u\t", &read_cpus); STARPU_ASSERT(ret == 1); _starpu_drop_comments(f); ret = fscanf(f, "%d\t", &read_cuda); STARPU_ASSERT(ret == 1); _starpu_drop_comments(f); ret = fscanf(f, "%d\t", &read_opencl); STARPU_ASSERT(ret == 1); _starpu_drop_comments(f); _starpu_frdunlock(f); fclose(f); // Loading current configuration ncpus = _starpu_topology_get_nhwcpu(config); #ifdef STARPU_USE_CUDA ncuda = _starpu_get_cuda_device_count(); #endif #ifdef STARPU_USE_OPENCL nopencl = _starpu_opencl_get_device_count(); #endif // Checking if both configurations match if (read_cpus != ncpus) { _STARPU_DISP("Current configuration does not match the bus performance model (CPUS: (stored) %u != (current) %u), recalibrating...\n", read_cpus, ncpus); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } else if (read_cuda != ncuda) { _STARPU_DISP("Current configuration does not match the bus performance model (CUDA: (stored) %d != (current) %d), recalibrating...\n", read_cuda, ncuda); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } else if (read_opencl != nopencl) { _STARPU_DISP("Current configuration does not match the bus performance model (OpenCL: (stored) %d != (current) %d), recalibrating...\n", read_opencl, nopencl); _starpu_bus_force_sampling(); _STARPU_DISP("... done\n"); } } } static void write_bus_config_file_content(void) { FILE *f; char path[256]; STARPU_ASSERT(was_benchmarked); get_config_path(path, sizeof(path)); _STARPU_DEBUG("writing config to %s\n", path); f = fopen(path, "w+"); STARPU_ASSERT(f); _starpu_fwrlock(f); _starpu_ftruncate(f); fprintf(f, "# Current configuration\n"); fprintf(f, "%u # Number of CPUs\n", ncpus); fprintf(f, "%d # Number of CUDA devices\n", ncuda); fprintf(f, "%d # Number of OpenCL devices\n", nopencl); _starpu_fwrunlock(f); fclose(f); } static void generate_bus_config_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); write_bus_config_file_content(); } #endif /* !SIMGRID */ void _starpu_simgrid_get_platform_path(char *path, size_t maxlen) { get_bus_path("platform.xml", path, maxlen); } #ifndef STARPU_SIMGRID static void write_bus_platform_file_content(void) { FILE *f; char path[256]; unsigned i; STARPU_ASSERT(was_benchmarked); _starpu_simgrid_get_platform_path(path, sizeof(path)); _STARPU_DEBUG("writing platform to %s\n", path); f = fopen(path, "w+"); if (!f) { perror("fopen write_bus_platform_file_content"); _STARPU_DISP("path '%s'\n", path); fflush(stderr); STARPU_ABORT(); } _starpu_fwrlock(f); _starpu_ftruncate(f); fprintf(f, "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" ); for (i = 0; i < ncpus; i++) /* TODO: host memory for out-of-core simulation */ fprintf(f, " \n", i); for (i = 0; i < ncuda; i++) { fprintf(f, " \n", i); fprintf(f, " \n", #ifdef STARPU_USE_CUDA (unsigned long long) cuda_size[i] #else 0ULL #endif ); #ifdef HAVE_CUDA_MEMCPY_PEER fprintf(f, " \n"); #endif fprintf(f, " \n"); } for (i = 0; i < nopencl; i++) { fprintf(f, " \n", i); fprintf(f, " \n", #ifdef STARPU_USE_OPENCL (unsigned long long) opencl_size[i] #else 0ULL #endif ); fprintf(f, " \n"); } fprintf(f, "\n \n"); /* Compute maximum bandwidth, taken as machine bandwidth */ double max_bandwidth = 0; #ifdef STARPU_USE_CUDA for (i = 0; i < ncuda; i++) { double down_bw = 1.0 / cudadev_timing_dtoh[1+i]; double up_bw = 1.0 / cudadev_timing_htod[1+i]; if (max_bandwidth < down_bw) max_bandwidth = down_bw; if (max_bandwidth < up_bw) max_bandwidth = up_bw; } #endif #ifdef STARPU_USE_OPENCL for (i = 0; i < nopencl; i++) { double down_bw = 1.0 / opencldev_timing_dtoh[1+i]; double up_bw = 1.0 / opencldev_timing_htod[1+i]; if (max_bandwidth < down_bw) max_bandwidth = down_bw; if (max_bandwidth < up_bw) max_bandwidth = up_bw; } #endif fprintf(f, "\n \n\n", max_bandwidth*1000000); /* Write bandwidths & latencies */ #ifdef STARPU_USE_CUDA for (i = 0; i < ncuda; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%d", i); fprintf(f, " \n", i_name, 1000000. / cudadev_timing_htod[1+i], cudadev_latency_htod[1+i]/1000000.); fprintf(f, " \n", i_name, 1000000. / cudadev_timing_dtoh[1+i], cudadev_latency_dtoh[1+i]/1000000.); } #ifdef HAVE_CUDA_MEMCPY_PEER for (i = 0; i < ncuda; i++) { unsigned j; char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%d", i); for (j = 0; j < ncuda; j++) { char j_name[16]; if (j == i) continue; snprintf(j_name, sizeof(j_name), "CUDA%d", j); fprintf(f, " \n", i_name, j_name, 1000000. / cudadev_timing_dtod[1+i][1+j], cudadev_latency_dtod[1+i][1+j]/1000000.); } } #endif #endif #ifdef STARPU_USE_OPENCL for (i = 0; i < nopencl; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "OpenCL%d", i); fprintf(f, " \n", i_name, 1000000 / opencldev_timing_htod[1+i], opencldev_latency_htod[1+i]/1000000.); fprintf(f, " \n", i_name, 1000000 / opencldev_timing_dtoh[1+i], opencldev_latency_dtoh[1+i]/1000000.); } #endif /* Write routes */ #ifdef STARPU_USE_CUDA for (i = 0; i < ncuda; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%d", i); fprintf(f, " \n", i_name, i_name); fprintf(f, " \n", i_name, i_name); } #ifdef HAVE_CUDA_MEMCPY_PEER for (i = 0; i < ncuda; i++) { unsigned j; char i_name[16]; snprintf(i_name, sizeof(i_name), "CUDA%d", i); for (j = 0; j < ncuda; j++) { char j_name[16]; if (j == i) continue; snprintf(j_name, sizeof(j_name), "CUDA%d", j); fprintf(f, " \n", i_name, j_name, i_name, j_name); } } #endif #endif #ifdef STARPU_USE_OPENCL for (i = 0; i < nopencl; i++) { char i_name[16]; snprintf(i_name, sizeof(i_name), "OpenCL%d", i); fprintf(f, " \n", i_name, i_name); fprintf(f, " \n", i_name, i_name); } #endif fprintf(f, " \n" " \n" ); _starpu_fwrunlock(f); fclose(f); } static void generate_bus_platform_file(void) { if (!was_benchmarked) benchmark_all_gpu_devices(); write_bus_platform_file_content(); } static void check_bus_platform_file(void) { int res; char path[256]; _starpu_simgrid_get_platform_path(path, sizeof(path)); res = access(path, F_OK); if (res) { /* File does not exist yet */ generate_bus_platform_file(); } } /* * Generic */ static void _starpu_bus_force_sampling(void) { _STARPU_DEBUG("Force bus sampling ...\n"); _starpu_create_sampling_directory_if_needed(); generate_bus_affinity_file(); generate_bus_latency_file(); generate_bus_bandwidth_file(); generate_bus_config_file(); generate_bus_platform_file(); } #endif /* !SIMGRID */ void _starpu_load_bus_performance_files(void) { _starpu_create_sampling_directory_if_needed(); #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_SIMGRID) ncuda = _starpu_get_cuda_device_count(); #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_USE_SIMGRID) nopencl = _starpu_opencl_get_device_count(); #endif #ifndef STARPU_SIMGRID check_bus_config_file(); load_bus_affinity_file(); #endif load_bus_latency_file(); load_bus_bandwidth_file(); #ifndef STARPU_SIMGRID check_bus_platform_file(); #endif } /* (in MB/s) */ double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node) { return bandwidth_matrix[src_node][dst_node]; } /* (in µs) */ double starpu_transfer_latency(unsigned src_node, unsigned dst_node) { return latency_matrix[src_node][dst_node]; } /* (in µs) */ double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size) { double bandwidth = bandwidth_matrix[src_node][dst_node]; double latency = latency_matrix[src_node][dst_node]; struct _starpu_machine_topology *topology = &_starpu_get_machine_config()->topology; return latency + (size/bandwidth)*2*(topology->ncudagpus+topology->nopenclgpus); } starpu-1.1.5/src/core/perfmodel/perfmodel_nan.c0000644000373600000000000000335612571536573016444 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS 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_HAVE_WINDOWS */ int _starpu_read_double(FILE *f, char *format, double *val) { #ifdef STARPU_HAVE_WINDOWS /** Windows cannot read NAN values, yes, it is really bad ... */ _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.1.5/src/core/perfmodel/perfmodel_print.c0000644000373600000000000001561612571536573017026 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 Université de Bordeaux * Copyright (C) 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * 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 static void _starpu_perfmodel_print_history_based(struct starpu_perfmodel_per_arch *per_arch_model, char *parameter, uint32_t *footprint, FILE *output) { struct starpu_perfmodel_history_list *ptr; ptr = per_arch_model->list; if (!parameter && ptr) fprintf(output, "# hash\t\tsize\t\tflops\t\tmean (us)\tstddev (us)\t\tn\n"); while (ptr) { struct starpu_perfmodel_history_entry *entry = ptr->entry; if (!footprint || entry->footprint == *footprint) { if (!parameter) { /* There isn't a parameter that is explicitely requested, so we display all parameters */ printf("%08x\t%-15lu\t%-15le\t%-15le\t%-15le\t%u\n", entry->footprint, (unsigned long) entry->size, entry->flops, entry->mean, entry->deviation, entry->nsample); } else { /* only display the parameter that was specifically requested */ if (strcmp(parameter, "mean") == 0) { printf("%-15le\n", entry->mean); } if (strcmp(parameter, "stddev") == 0) { printf("%-15le\n", entry->deviation); return; } } } ptr = ptr->next; } } void starpu_perfmodel_print(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output) { struct starpu_perfmodel_per_arch *arch_model = &model->per_arch[arch][nimpl]; char archname[32]; if (arch_model->regression.nsample || arch_model->regression.valid || arch_model->regression.nl_valid || arch_model->list) { starpu_perfmodel_get_arch_name(arch, archname, 32, nimpl); fprintf(output, "performance model for %s\n", archname); } if (parameter == NULL) { /* no specific parameter was requested, so we display everything */ if (arch_model->regression.nsample) { fprintf(output, "\tRegression : #sample = %u\n", arch_model->regression.nsample); } /* Only display the regression model if we could actually build a model */ if (arch_model->regression.valid) { fprintf(output, "\tLinear: y = alpha size ^ beta\n"); fprintf(output, "\t\talpha = %e\n", arch_model->regression.alpha); fprintf(output, "\t\tbeta = %e\n", arch_model->regression.beta); } else { //fprintf(output, "\tLinear model is INVALID\n"); } if (arch_model->regression.nl_valid) { fprintf(output, "\tNon-Linear: y = a size ^b + c\n"); fprintf(output, "\t\ta = %e\n", arch_model->regression.a); fprintf(output, "\t\tb = %e\n", arch_model->regression.b); fprintf(output, "\t\tc = %e\n", arch_model->regression.c); } else { //fprintf(output, "\tNon-Linear model is INVALID\n"); } _starpu_perfmodel_print_history_based(arch_model, parameter, footprint, output); #if 0 char debugname[1024]; starpu_perfmodel_debugfilepath(model, arch, debugname, 1024, nimpl); printf("\t debug file path : %s\n", debugname); #endif } else { /* only display the parameter that was specifically requested */ if (strcmp(parameter, "a") == 0) { printf("%e\n", arch_model->regression.a); return; } if (strcmp(parameter, "b") == 0) { printf("%e\n", arch_model->regression.b); return; } if (strcmp(parameter, "c") == 0) { printf("%e\n", arch_model->regression.c); return; } if (strcmp(parameter, "alpha") == 0) { printf("%e\n", arch_model->regression.alpha); return; } if (strcmp(parameter, "beta") == 0) { printf("%e\n", arch_model->regression.beta); return; } if (strcmp(parameter, "path-file-debug") == 0) { char debugname[256]; starpu_perfmodel_debugfilepath(model, arch, debugname, 1024, nimpl); printf("%s\n", debugname); return; } if ((strcmp(parameter, "mean") == 0) || (strcmp(parameter, "stddev") == 0)) { _starpu_perfmodel_print_history_based(arch_model, parameter, footprint, output); return; } /* TODO display if it's valid ? */ fprintf(output, "Unknown parameter requested, aborting.\n"); exit(-1); } } int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output) { if (arch == NULL) { /* display all architectures */ unsigned archid; unsigned implid; for (archid = 0; archid < STARPU_NARCH_VARIATIONS; archid++) { for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) { /* Display all codelets on each arch */ starpu_perfmodel_print(model, (enum starpu_perfmodel_archtype) archid, implid, parameter, footprint, output); } } } else { if (strcmp(arch, "cpu") == 0) { int implid; for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) starpu_perfmodel_print(model, STARPU_CPU_DEFAULT,implid, parameter, footprint, output); /* Display all codelets on cpu */ return 0; } int k; if (sscanf(arch, "cpu:%d", &k) == 1) { /* For combined CPU workers */ if ((k < 1) || (k > STARPU_MAXCPUS)) { fprintf(output, "Invalid CPU size\n"); exit(-1); } int implid; for (implid = 0; implid < STARPU_MAXIMPLEMENTATIONS; implid++) starpu_perfmodel_print(model, (enum starpu_perfmodel_archtype) (STARPU_CPU_DEFAULT + k - 1), implid, parameter, footprint, output); return 0; } if (strcmp(arch, "cuda") == 0) { unsigned archid; int implid; for (archid = STARPU_CUDA_DEFAULT; archid < STARPU_CUDA_DEFAULT + STARPU_MAXCUDADEVS; archid++) { for (implid = 0; implid #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif /* This flag indicates whether performance models should be calibrated or not. * 0: models need not be calibrated * 1: models must be calibrated * 2: models must be calibrated, existing models are overwritten. */ static unsigned calibrate_flag = 0; void _starpu_set_calibrate_flag(unsigned val) { calibrate_flag = val; } unsigned _starpu_get_calibrate_flag(void) { return calibrate_flag; } enum starpu_perfmodel_archtype starpu_worker_get_perf_archtype(int 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 < (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, enum starpu_perfmodel_archtype arch, struct starpu_task *task, unsigned nimpl) { double exp = NAN; double (*per_arch_cost_function)(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl); double (*per_arch_cost_model)(struct starpu_data_descr *); per_arch_cost_function = model->per_arch[arch][nimpl].cost_function; per_arch_cost_model = model->per_arch[arch][nimpl].cost_model; if (per_arch_cost_function) exp = per_arch_cost_function(task, arch, nimpl); else if (per_arch_cost_model) exp = per_arch_cost_model(task->buffers); return exp; } /* * Common model */ double starpu_worker_get_relative_speedup(enum starpu_perfmodel_archtype perf_archtype) { if (perf_archtype < STARPU_CUDA_DEFAULT) { return _STARPU_CPU_ALPHA * (perf_archtype + 1); } else if (perf_archtype < STARPU_OPENCL_DEFAULT) { return _STARPU_CUDA_ALPHA; } else if (perf_archtype < STARPU_NARCH_VARIATIONS) { return _STARPU_OPENCL_ALPHA; } STARPU_ABORT(); /* Never reached ! */ return NAN; } static double common_task_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, struct starpu_task *task, unsigned nimpl) { double exp; double alpha; if (model->cost_function) { exp = model->cost_function(task, nimpl); alpha = starpu_worker_get_relative_speedup(arch); STARPU_ASSERT(!_STARPU_IS_ZERO(alpha)); return (exp/alpha); } else if (model->cost_model) { exp = model->cost_model(task->buffers); alpha = starpu_worker_get_relative_speedup(arch); STARPU_ASSERT(!_STARPU_IS_ZERO(alpha)); return (exp/alpha); } return NAN; } void _starpu_load_perfmodel(struct starpu_perfmodel *model) { if (!model || model->is_loaded) return; int load_model = _starpu_register_model(model); if (!load_model) return; switch (model->type) { case STARPU_PER_ARCH: _starpu_load_per_arch_based_model(model); break; case STARPU_COMMON: _starpu_load_common_based_model(model); break; case STARPU_HISTORY_BASED: case STARPU_NL_REGRESSION_BASED: _starpu_load_history_based_model(model, 1); break; case STARPU_REGRESSION_BASED: _starpu_load_history_based_model(model, 0); break; default: STARPU_ABORT(); } model->is_loaded = 1; } static double starpu_model_expected_perf(struct starpu_task *task, struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned nimpl) { if (model) { if (model->symbol) _starpu_load_perfmodel(model); struct _starpu_job *j = _starpu_get_job_associated_to_task(task); switch (model->type) { case STARPU_PER_ARCH: return per_arch_task_expected_perf(model, arch, task, nimpl); case STARPU_COMMON: return common_task_expected_perf(model, arch, task, nimpl); case STARPU_HISTORY_BASED: return _starpu_history_based_job_expected_perf(model, arch, j, nimpl); case STARPU_REGRESSION_BASED: return _starpu_regression_based_job_expected_perf(model, arch, j, nimpl); case STARPU_NL_REGRESSION_BASED: return _starpu_non_linear_regression_based_job_expected_perf(model, arch, j,nimpl); default: STARPU_ABORT(); } } /* no model was found */ return 0.0; } double starpu_task_expected_length(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl) { return starpu_model_expected_perf(task, task->cl->model, arch, nimpl); } double starpu_task_expected_power(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl) { return starpu_model_expected_perf(task, task->cl->power_model, arch, nimpl); } double starpu_task_expected_conversion_time(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl) { unsigned i; double sum = 0.0; enum starpu_node_kind node_kind; for (i = 0; i < task->cl->nbuffers; i++) { starpu_data_handle_t handle; struct starpu_task *conversion_task; handle = STARPU_TASK_GET_HANDLE(task, i); if (!_starpu_data_is_multiformat_handle(handle)) continue; if (arch < STARPU_CUDA_DEFAULT) node_kind = STARPU_CPU_RAM; else if (arch < STARPU_OPENCL_DEFAULT) node_kind = STARPU_CUDA_RAM; else node_kind = STARPU_OPENCL_RAM; if (!_starpu_handle_needs_conversion_task_for_arch(handle, node_kind)) continue; conversion_task = _starpu_create_conversion_task_for_arch(handle, node_kind); sum += starpu_task_expected_length(conversion_task, arch, nimpl); _starpu_spin_lock(&handle->header_lock); handle->refcnt--; handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); starpu_task_clean(conversion_task); free(conversion_task); } return sum; } /* Predict the transfer time (in µs) to move a handle to a memory node */ double starpu_data_expected_transfer_time(starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode) { /* If we don't need to read the content of the handle */ if (!(mode & STARPU_R)) return 0.0; if (_starpu_is_data_present_or_requested(handle, memory_node)) return 0.0; size_t size = _starpu_data_get_size(handle); /* XXX in case we have an abstract piece of data (eg. with the * void interface, this does not introduce any overhead, and we * don't even want to consider the latency that is not * relevant). */ if (size == 0) return 0.0; int src_node = _starpu_select_src_node(handle, memory_node); if (src_node < 0) /* Will just create it in place. Ideally we should take the * time to create it into account */ return 0.0; return starpu_transfer_predict(src_node, memory_node, size); } /* Data transfer performance modeling */ double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task) { unsigned nbuffers = task->cl->nbuffers; 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_CODELET_GET_MODE(task->cl, buffer); penalty += starpu_data_expected_transfer_time(handle, memory_node, mode); } return penalty; } /* Return the expected duration of the entire task bundle in µs */ double starpu_task_bundle_expected_length(starpu_task_bundle_t bundle, enum starpu_perfmodel_archtype 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 power consumption of the entire task bundle in J */ double starpu_task_bundle_expected_power(starpu_task_bundle_t bundle, enum starpu_perfmodel_archtype arch, unsigned nimpl) { double expected_power = 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_power = starpu_task_expected_power(entry->task, arch, nimpl); /* In case the task is not calibrated, we consider the task * ends immediately. */ if (task_power > 0.0) expected_power += task_power; entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return expected_power; } /* 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; for (b = 0; b < task->cl->nbuffers; b++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, b); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(task->cl, b); if (!(mode & STARPU_R)) continue; /* Insert the handle in the sorted list in case * it's not already in that list. */ _insertion_handle_sorted(&handles, handle, mode); } } entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); /* Compute the sum of data transfer time, and destroy the list */ double total_exp = 0.0; while (handles) { struct _starpu_handle_list *current = handles; handles = handles->next; double exp; exp = starpu_data_expected_transfer_time(current->handle, memory_node, current->mode); total_exp += exp; free(current); } return total_exp; } static int directory_existence_was_tested = 0; static char *_perf_model_dir = NULL; static char *_perf_model_dir_codelet = NULL; static char *_perf_model_dir_bus = NULL; static char *_perf_model_dir_debug = NULL; #define _PERF_MODEL_DIR_MAXLEN 256 void _starpu_set_perf_model_dirs() { _perf_model_dir = malloc(_PERF_MODEL_DIR_MAXLEN); _perf_model_dir_codelet = malloc(_PERF_MODEL_DIR_MAXLEN); _perf_model_dir_bus = malloc(_PERF_MODEL_DIR_MAXLEN); _perf_model_dir_debug = malloc(_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", STARPU_PERF_MODEL_DIR); #else snprintf(_perf_model_dir, _PERF_MODEL_DIR_MAXLEN, "%s/.starpu/sampling/", _starpu_get_home_path()); #endif char *path = starpu_getenv("STARPU_PERF_MODEL_DIR"); if (path) { snprintf(_perf_model_dir, _PERF_MODEL_DIR_MAXLEN, "%s/", path); } snprintf(_perf_model_dir_codelet, _PERF_MODEL_DIR_MAXLEN, "%s/codelets/%d/", _perf_model_dir, _STARPU_PERFMODEL_VERSION); snprintf(_perf_model_dir_bus, _PERF_MODEL_DIR_MAXLEN, "%s/bus/", _perf_model_dir); snprintf(_perf_model_dir_debug, _PERF_MODEL_DIR_MAXLEN, "%s/debug/", _perf_model_dir); } char *_starpu_get_perf_model_dir_codelet() { _starpu_create_sampling_directory_if_needed(); return _perf_model_dir_codelet; } char *_starpu_get_perf_model_dir_bus() { _starpu_create_sampling_directory_if_needed(); return _perf_model_dir_bus; } char *_starpu_get_perf_model_dir_debug() { _starpu_create_sampling_directory_if_needed(); return _perf_model_dir_debug; } void _starpu_create_sampling_directory_if_needed(void) { if (!directory_existence_was_tested) { _starpu_set_perf_model_dirs(); /* The performance of the codelets are stored in * $STARPU_PERF_MODEL_DIR/codelets/ while those of the bus are stored in * $STARPU_PERF_MODEL_DIR/bus/ so that we don't have name collisions */ /* Testing if a directory exists and creating it otherwise may not be safe: it is possible that the permission are changed in between. Instead, we create it and check if it already existed before */ _starpu_mkpath_and_check(_perf_model_dir, S_IRWXU); /* Per-task performance models */ _starpu_mkpath_and_check(_perf_model_dir_codelet, S_IRWXU); /* Performance of the memory subsystem */ _starpu_mkpath_and_check(_perf_model_dir_bus, S_IRWXU); /* Performance debug measurements */ _starpu_mkpath(_perf_model_dir_debug, S_IRWXU); directory_existence_was_tested = 1; } } void starpu_perfmodel_free_sampling_directories(void) { free(_perf_model_dir); _perf_model_dir = NULL; free(_perf_model_dir_codelet); _perf_model_dir_codelet = NULL; free(_perf_model_dir_bus); _perf_model_dir_bus = NULL; free(_perf_model_dir_debug); _perf_model_dir_debug = NULL; directory_existence_was_tested = 0; } starpu-1.1.5/src/core/perfmodel/perfmodel.h0000644000373600000000000000667212571536573015621 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013, 2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PERFMODEL_H__ #define __PERFMODEL_H__ #include #include #include #include /** * 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 42 struct _starpu_perfmodel_list { struct _starpu_perfmodel_list *next; struct starpu_perfmodel *model; }; struct starpu_data_descr; struct _starpu_job; enum starpu_perfmodel_archtype; 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, enum starpu_perfmodel_archtype arch, struct _starpu_job *j, unsigned nimpl); int _starpu_register_model(struct starpu_perfmodel *model); void _starpu_load_per_arch_based_model(struct starpu_perfmodel *model); void _starpu_load_common_based_model(struct starpu_perfmodel *model); void _starpu_load_history_based_model(struct starpu_perfmodel *model, unsigned scan_history); void _starpu_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, enum starpu_perfmodel_archtype arch, struct _starpu_job *j, unsigned nimpl); double _starpu_non_linear_regression_based_job_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, struct _starpu_job *j, unsigned nimpl); void _starpu_update_perfmodel_history(struct _starpu_job *j, struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned cpuid, double measured, unsigned nimpl); void _starpu_create_sampling_directory_if_needed(void); void _starpu_load_bus_performance_files(void); void _starpu_set_calibrate_flag(unsigned val); unsigned _starpu_get_calibrate_flag(void); #if defined(STARPU_USE_CUDA) int *_starpu_get_cuda_affinity_vector(unsigned gpuid); #endif #if defined(STARPU_USE_OPENCL) int *_starpu_get_opencl_affinity_vector(unsigned gpuid); #endif int _starpu_read_double(FILE *f, char *format, double *val); void _starpu_simgrid_get_platform_path(char *path, size_t maxlen); #endif // __PERFMODEL_H__ starpu-1.1.5/src/core/perfmodel/regression.c0000644000373600000000000001017112571536573016004 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2011 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #define MAXREGITER 1000 #define EPS 1.0e-10 static double compute_b(double c, unsigned n, unsigned *x, double *y) { double b; /* X = log (x) , Y = log (y - c) */ double sumxy = 0.0; double sumx = 0.0; double sumx2 = 0.0; double sumy = 0.0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); sumxy += xi*yi; sumx += xi; sumx2 += xi*xi; sumy += yi; } b = (n * sumxy - sumx * sumy) / (n*sumx2 - sumx*sumx); return b; } static double compute_a(double c, double b, unsigned n, unsigned *x, double *y) { double a; /* X = log (x) , Y = log (y - c) */ double sumx = 0.0; double sumy = 0.0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); sumx += xi; sumy += yi; } a = (sumy - b*sumx) / n; return a; } /* returns r */ static double test_r(double c, unsigned n, unsigned *x, double *y) { double r; // printf("test c = %e\n", c); /* X = log (x) , Y = log (y - c) */ double sumxy = 0.0; double sumx = 0.0; double sumx2 = 0.0; double sumy = 0.0; double sumy2 = 0.0; unsigned i; for (i = 0; i < n; i++) { double xi = log(x[i]); double yi = log(y[i]-c); // printf("Xi = %e, Yi = %e\n", xi, yi); sumxy += xi*yi; sumx += xi; sumx2 += xi*xi; sumy += yi; sumy2 += yi*yi; } //printf("sumxy %e\n", sumxy); //printf("sumx %e\n", sumx); //printf("sumx2 %e\n", sumx2); //printf("sumy %e\n", sumy); //printf("sumy2 %e\n", sumy2); r = (n * sumxy - sumx * sumy) / sqrt( (n* sumx2 - sumx*sumx) * (n*sumy2 - sumy*sumy) ); return r; } static unsigned find_list_size(struct starpu_perfmodel_history_list *list_history) { unsigned cnt = 0; struct starpu_perfmodel_history_list *ptr = list_history; while (ptr) { cnt++; ptr = ptr->next; } return cnt; } static double find_list_min(double *y, unsigned n) { double min = 1.0e30; unsigned i; for (i = 0; i < n; i++) { min = STARPU_MIN(min, y[i]); } return min; } static void dump_list(unsigned *x, double *y, struct starpu_perfmodel_history_list *list_history) { struct starpu_perfmodel_history_list *ptr = list_history; unsigned i = 0; while (ptr) { x[i] = ptr->entry->size; y[i] = ptr->entry->mean; ptr = ptr->next; i++; } } /* y = ax^b + c * return 0 if success, -1 otherwise * if success, a, b and c are modified * */ int _starpu_regression_non_linear_power(struct starpu_perfmodel_history_list *ptr, double *a, double *b, double *c) { unsigned n = find_list_size(ptr); unsigned *x = (unsigned *) malloc(n*sizeof(unsigned)); STARPU_ASSERT(x); double *y = (double *) malloc(n*sizeof(double)); STARPU_ASSERT(y); dump_list(x, y, ptr); double cmin = 0.0; double cmax = find_list_min(y, n); unsigned iter; double err = 100000.0; for (iter = 0; iter < MAXREGITER; iter++) { double c1, c2; double r1, r2; double radius = 0.01; c1 = cmin + (0.5-radius)*(cmax - cmin); c2 = cmin + (0.5+radius)*(cmax - cmin); r1 = test_r(c1, n, x, y); r2 = test_r(c2, n, x, y); double err1, err2; err1 = fabs(1.0 - r1); err2 = fabs(1.0 - r2); if (err1 < err2) { cmax = (cmin + cmax)/2; } else { /* 2 is better */ cmin = (cmin + cmax)/2; } if (fabs(err - STARPU_MIN(err1, err2)) < EPS) break; err = STARPU_MIN(err1, err2); } *c = (cmin + cmax)/2; *b = compute_b(*c, n, x, y); *a = exp(compute_a(*c, *b, n, x, y)); free(x); free(y); return 0; } starpu-1.1.5/src/core/task_bundle.c0000644000373600000000000001414312571536573014145 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 Université de Bordeaux * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2012 Inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include /* Initialize a task bundle */ void starpu_task_bundle_create(starpu_task_bundle_t *bundle) { *bundle = (starpu_task_bundle_t) malloc(sizeof(struct _starpu_task_bundle)); STARPU_ASSERT(*bundle); STARPU_PTHREAD_MUTEX_INIT(&(*bundle)->mutex, NULL); /* Of course at the beginning a bundle is open, * user can insert and remove tasks from it */ (*bundle)->closed = 0; /* Start with an empty list */ (*bundle)->list = NULL; } int starpu_task_bundle_insert(starpu_task_bundle_t bundle, struct starpu_task *task) { STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); if (bundle->closed) { /* The bundle is closed, we cannot add task anymore */ STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return -EPERM; } if (task->status != STARPU_TASK_INVALID) { /* The task has already been submitted, it's too late to put it * into a bundle now. */ STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return -EINVAL; } /* Insert a task at the end of the bundle */ struct _starpu_task_bundle_entry *entry; entry = (struct _starpu_task_bundle_entry *) malloc(sizeof(struct _starpu_task_bundle_entry)); STARPU_ASSERT(entry); entry->task = task; entry->next = NULL; if (!bundle->list) { bundle->list = entry; } else { struct _starpu_task_bundle_entry *item; item = bundle->list; while (item->next) item = item->next; item->next = entry; } /* Mark the task as belonging the bundle */ task->bundle = bundle; STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return 0; } int starpu_task_bundle_remove(starpu_task_bundle_t bundle, struct starpu_task *task) { struct _starpu_task_bundle_entry *item; STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); item = bundle->list; /* List is empty, there is no way the task * belong to it */ if (!item) { STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return -ENOENT; } STARPU_ASSERT_MSG(task->bundle == bundle, "Task %p was not in bundle %p, but in bundle %p", task, bundle, task->bundle); task->bundle = NULL; if (item->task == task) { /* Remove the first element */ bundle->list = item->next; free(item); /* If the list is now empty, deinitialize the bundle */ if (bundle->closed && bundle->list == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); _starpu_task_bundle_destroy(bundle); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); return 0; } /* Go through the list until we find the right task, * then we delete it */ while (item->next) { struct _starpu_task_bundle_entry *next; next = item->next; if (next->task == task) { /* Remove the next element */ item->next = next->next; STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); free(next); return 0; } item = next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); /* We could not find the task in the bundle */ return -ENOENT; } /* Close a bundle. No task can be added to a closed bundle. Tasks can still be * removed from a closed bundle. A closed bundle automatically gets * deinitialized when it becomes empty. A closed bundle cannot be reopened. */ void starpu_task_bundle_close(starpu_task_bundle_t bundle) { STARPU_PTHREAD_MUTEX_LOCK(&bundle->mutex); /* If the bundle is already empty, we deinitialize it now as the * user closed it and thus don't intend to insert new tasks in it. */ if (bundle->list == NULL) { STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); _starpu_task_bundle_destroy(bundle); return; } /* Mark the bundle as closed */ bundle->closed = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); } void _starpu_task_bundle_destroy(starpu_task_bundle_t bundle) { /* Remove all entries from the bundle (which is likely to be empty) */ while (bundle->list) { struct _starpu_task_bundle_entry *entry = bundle->list; bundle->list = bundle->list->next; free(entry); } STARPU_PTHREAD_MUTEX_DESTROY(&bundle->mutex); free(bundle); } void _insertion_handle_sorted(struct _starpu_handle_list **listp, starpu_data_handle_t handle, enum starpu_data_access_mode mode) { STARPU_ASSERT(listp); struct _starpu_handle_list *list = *listp; /* If the list is empty or the handle's address the smallest among the * list, we insert it as first element */ if (!list || list->handle > handle) { struct _starpu_handle_list *link = (struct _starpu_handle_list *) malloc(sizeof(struct _starpu_handle_list)); STARPU_ASSERT(link); 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 = (struct _starpu_handle_list *) malloc(sizeof(struct _starpu_handle_list)); STARPU_ASSERT(link); link->handle = handle; link->mode = mode; link->next = prev->next; prev->next = link; } } starpu-1.1.5/src/core/progress_hook.h0000644000373600000000000000147712571536573014551 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __PROGRESS_HOOK_H__ #define __PROGRESS_HOOK_H__ void _starpu_init_progression_hooks(void); unsigned _starpu_execute_registered_progression_hooks(void); #endif /* !__PROGRESS_HOOK_H__ */ starpu-1.1.5/src/core/sched_ctx_list.h0000644000373600000000000000235612571536573014661 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_CONTEXT_LIST_H__ #define __SCHED_CONTEXT_LIST_H__ struct _starpu_sched_ctx_list { struct _starpu_sched_ctx_list *next; unsigned sched_ctx; }; void _starpu_sched_ctx_list_init(struct _starpu_sched_ctx_list *list); void _starpu_sched_ctx_list_add(struct _starpu_sched_ctx_list **list, unsigned sched_ctx); void _starpu_sched_ctx_list_remove(struct _starpu_sched_ctx_list **list, unsigned sched_ctx); unsigned _starpu_sched_ctx_list_get_sched_ctx(struct _starpu_sched_ctx_list *list, unsigned sched_ctx); void _starpu_sched_ctx_list_delete(struct _starpu_sched_ctx_list **list); #endif // __SCHED_CONTEXT_H__ starpu-1.1.5/src/core/topology.h0000644000373600000000000000413012571536573013526 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __TOPOLOGY_H__ #define __TOPOLOGY_H__ #include #include #include #include /* TODO actually move this struct into this header */ struct _starpu_machine_config; /* Detect the number of memory nodes and where to bind the different workers. */ int _starpu_build_topology(struct _starpu_machine_config *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); /* Bind the current thread on the CPU logically identified by "cpuid". The * logical ordering of the processors is either that of hwloc (if available), * or the ordering exposed by the OS. */ void _starpu_bind_thread_on_cpu(struct _starpu_machine_config *config, unsigned cpuid); struct _starpu_combined_worker; /* Bind the current thread on the set of CPUs for the given combined worker. */ void _starpu_bind_thread_on_cpus(struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED, struct _starpu_combined_worker *combined_worker); #endif // __TOPOLOGY_H__ starpu-1.1.5/src/core/topology.c0000644000373600000000000007040412571536573013530 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef STARPU_SIMGRID #include #endif static unsigned topology_is_initialized = 0; static int nobind; #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) struct handle_entry { UT_hash_handle hh; unsigned gpuid; }; # if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) /* Entry in the `devices_using_cuda' hash table. */ static struct handle_entry *devices_using_cuda; # endif static unsigned may_bind_automatically[STARPU_OPENCL_WORKER+1] = { 0 }; #endif // defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) /* * Discover the topology of the machine */ #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) static void _starpu_initialize_workers_gpuid (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_bindid indicates the successive cpu 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 * cpus. */ /* what do we use, explicit value, env. variable, or round-robin ? */ if ((strval = starpu_getenv(varname))) { /* 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_gpuid ( 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_gpuid( 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; entry2 = (struct handle_entry *) malloc(sizeof(*entry2)); STARPU_ASSERT(entry2 != NULL); entry2->gpuid = devid; HASH_ADD_INT(devices_already_used, gpuid, entry2); tmp[nb] = devid; nb ++; } } struct handle_entry *entry, *tempo; HASH_ITER(hh, devices_already_used, entry, tempo) { HASH_DEL(devices_already_used, entry); free(entry); } for (i=nb ; iworkers_opencl_gpuid, tmp, sizeof(unsigned)*STARPU_NMAXWORKERS); } } static inline int _starpu_get_next_opencl_gpuid (struct _starpu_machine_config *config) { unsigned i = ((config->current_opencl_gpuid++) % config->topology.nopenclgpus); return (int)config->topology.workers_opencl_gpuid[i]; } #endif 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; #ifndef STARPU_SIMGRID #ifdef STARPU_HAVE_HWLOC hwloc_topology_init(&topology->hwtopology); hwloc_topology_load(topology->hwtopology); #endif #endif _starpu_cpu_discover_devices(config); _starpu_cuda_discover_devices(config); _starpu_opencl_discover_devices(config); topology_is_initialized = 1; } /* * Bind workers on the different processors */ static void _starpu_initialize_workers_bindid (struct _starpu_machine_config *config) { char *strval; unsigned i; struct _starpu_machine_topology *topology = &config->topology; config->current_bindid = 0; /* conf->workers_bindid indicates the successive cpu 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 * cpus. */ /* what do we use, explicit value, env. variable, or round-robin ? */ if ((strval = starpu_getenv("STARPU_WORKERS_CPUID"))) { /* 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_CUDAID * env. variable */ for (i = 0; i < STARPU_NMAXWORKERS; i++) { if (!wrap) { long int val; val = strtol(strval, &endptr, 10); if (endptr != strval) { topology->workers_bindid[i] = (unsigned)(val % topology->nhwcpus); 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; 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 { /* by default, we take a round robin policy */ for (i = 0; i < STARPU_NMAXWORKERS; i++) topology->workers_bindid[i] = (unsigned)(i % topology->nhwcpus); } } /* This function gets the identifier of the next cpu on which to bind a * worker. In case a list of preferred cpus was specified, we look for a an * available cpu among the list if possible, otherwise a round-robin policy is * used. */ static inline int _starpu_get_next_bindid (struct _starpu_machine_config *config, int *preferred_binding, int npreferred) { struct _starpu_machine_topology *topology = &config->topology; unsigned found = 0; int current_preferred; for (current_preferred = 0; current_preferred < npreferred; current_preferred++) { if (found) break; unsigned requested_cpu = preferred_binding[current_preferred]; /* can we bind the worker on the requested cpu ? */ unsigned ind; for (ind = config->current_bindid; ind < topology->nhwcpus; ind++) { if (topology->workers_bindid[ind] == requested_cpu) { /* the cpu is available, we use it ! In order * to make sure that it will not be used again * later on, we remove the entry from the * list */ topology->workers_bindid[ind] = topology->workers_bindid[config->current_bindid]; topology->workers_bindid[config->current_bindid] = requested_cpu; found = 1; break; } } } unsigned i = ((config->current_bindid++) % STARPU_NMAXWORKERS); return (int)topology->workers_bindid[i]; } unsigned _starpu_topology_get_nhwcpu (struct _starpu_machine_config *config) { #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) _starpu_init_cuda(); #endif _starpu_init_topology(config); return config->topology.nhwcpus; } static int _starpu_init_machine_config(struct _starpu_machine_config *config) { int i; for (i = 0; i < STARPU_NMAXWORKERS; i++) config->workers[i].workerid = i; struct _starpu_machine_topology *topology = &config->topology; topology->nworkers = 0; topology->ncombinedworkers = 0; topology->nsched_ctxs = 0; #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) _starpu_opencl_init(); #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) _starpu_init_cuda(); #endif _starpu_init_topology(config); _starpu_initialize_workers_bindid(config); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) int ncuda = config->conf.ncuda; if (ncuda != 0) { /* The user did not disable CUDA. We need to initialize CUDA * early to count the number of devices */ _starpu_init_cuda(); int nb_devices = _starpu_get_cuda_device_count(); if (ncuda == -1) { /* Nothing was specified, so let's choose ! */ ncuda = nb_devices; } else { if (ncuda > nb_devices) { /* The user requires more CUDA devices than * there is available */ _STARPU_DISP("Warning: %d CUDA devices requested. Only %d available.\n", ncuda, nb_devices); ncuda = nb_devices; } } } /* Now we know how many CUDA devices will be used */ topology->ncudagpus = ncuda; STARPU_ASSERT(topology->ncudagpus <= STARPU_MAXCUDADEVS); _starpu_initialize_workers_cuda_gpuid(config); unsigned cudagpu; for (cudagpu = 0; cudagpu < topology->ncudagpus; cudagpu++) { int worker_idx = topology->nworkers + cudagpu; config->workers[worker_idx].arch = STARPU_CUDA_WORKER; int devid = _starpu_get_next_cuda_gpuid(config); enum starpu_perfmodel_archtype arch = (enum starpu_perfmodel_archtype)((int)STARPU_CUDA_DEFAULT + devid); config->workers[worker_idx].devid = devid; config->workers[worker_idx].perf_arch = arch; config->workers[worker_idx].worker_mask = STARPU_CUDA; config->worker_mask |= STARPU_CUDA; struct handle_entry *entry; entry = (struct handle_entry *) malloc(sizeof(*entry)); STARPU_ASSERT(entry != NULL); entry->gpuid = devid; HASH_ADD_INT(devices_using_cuda, gpuid, entry); } topology->nworkers += topology->ncudagpus; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) int nopencl = config->conf.nopencl; if (nopencl != 0) { /* The user did not disable OPENCL. We need to initialize * OpenCL early to count the number of devices */ _starpu_opencl_init(); int nb_devices; nb_devices = _starpu_opencl_get_device_count(); if (nopencl == -1) { /* Nothing was specified, so let's choose ! */ nopencl = nb_devices; if (nopencl > STARPU_MAXOPENCLDEVS) { _STARPU_DISP("Warning: %d OpenCL devices available. Only %d enabled. Use configure option --enable-maxopencldadev=xxx to update the maximum value of supported OpenCL devices.\n", nb_devices, STARPU_MAXOPENCLDEVS); nopencl = STARPU_MAXOPENCLDEVS; } } else { /* Let's make sure this value is OK. */ if (nopencl > nb_devices) { /* The user requires more OpenCL devices than * there is available */ _STARPU_DISP("Warning: %d OpenCL devices requested. Only %d available.\n", nopencl, nb_devices); nopencl = nb_devices; } /* Let's make sure this value is OK. */ if (nopencl > STARPU_MAXOPENCLDEVS) { _STARPU_DISP("Warning: %d OpenCL devices requested. Only %d enabled. Use configure option --enable-maxopencldev=xxx to update the maximum value of supported OpenCL devices.\n", nopencl, STARPU_MAXOPENCLDEVS); nopencl = STARPU_MAXOPENCLDEVS; } } } topology->nopenclgpus = nopencl; STARPU_ASSERT(topology->nopenclgpus + topology->nworkers <= STARPU_NMAXWORKERS); _starpu_initialize_workers_opencl_gpuid(config); unsigned openclgpu; for (openclgpu = 0; openclgpu < topology->nopenclgpus; openclgpu++) { int worker_idx = topology->nworkers + openclgpu; int devid = _starpu_get_next_opencl_gpuid(config); if (devid == -1) { // There is no more devices left topology->nopenclgpus = openclgpu; break; } config->workers[worker_idx].arch = STARPU_OPENCL_WORKER; enum starpu_perfmodel_archtype arch = (enum starpu_perfmodel_archtype)((int)STARPU_OPENCL_DEFAULT + devid); config->workers[worker_idx].devid = devid; config->workers[worker_idx].perf_arch = arch; config->workers[worker_idx].worker_mask = STARPU_OPENCL; config->worker_mask |= STARPU_OPENCL; } topology->nworkers += topology->nopenclgpus; #endif /* we put the CPU section after the accelerator : in case there was an * accelerator found, we devote one cpu */ #if defined(STARPU_USE_CPU) || defined(STARPU_SIMGRID) int ncpu = config->conf.ncpus; if (ncpu != 0) { if (ncpu == -1) { unsigned already_busy_cpus = topology->ncudagpus + topology->nopenclgpus; long avail_cpus = (long) topology->nhwcpus - (long) already_busy_cpus; if (avail_cpus < 0) avail_cpus = 0; ncpu = STARPU_MIN(avail_cpus, STARPU_MAXCPUS); } else { if (ncpu > STARPU_MAXCPUS) { _STARPU_DISP("Warning: %d CPU devices requested. Only %d enabled. Use configure option --enable-maxcpus=xxx to update the maximum value of supported CPU devices.\n", ncpu, STARPU_MAXCPUS); ncpu = STARPU_MAXCPUS; } } } topology->ncpus = ncpu; STARPU_ASSERT(topology->ncpus + topology->nworkers <= STARPU_NMAXWORKERS); unsigned cpu; for (cpu = 0; cpu < topology->ncpus; cpu++) { int worker_idx = topology->nworkers + cpu; config->workers[worker_idx].arch = STARPU_CPU_WORKER; config->workers[worker_idx].perf_arch = STARPU_CPU_DEFAULT; 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++) { #ifdef STARPU_HAVE_HWLOC struct _starpu_worker *workerarg = &config->workers[worker]; hwloc_bitmap_free(workerarg->initial_hwloc_cpu_set); hwloc_bitmap_free(workerarg->current_hwloc_cpu_set); #endif } #ifdef STARPU_HAVE_HWLOC hwloc_topology_destroy(config->topology.hwtopology); #endif topology_is_initialized = 0; #ifdef STARPU_USE_CUDA struct handle_entry *entry, *tmp; HASH_ITER(hh, devices_using_cuda, entry, tmp) { HASH_DEL(devices_using_cuda, entry); free(entry); } devices_using_cuda = NULL; #endif #if defined(STARPU_USE_CUDA) || defined(STARPU_USE_OPENCL) int i; for (i=0; i 0) return; #ifdef STARPU_HAVE_HWLOC const struct hwloc_topology_support *support; #ifdef STARPU_USE_OPENCL _starpu_opencl_init(); #endif #ifdef STARPU_USE_CUDA _starpu_init_cuda(); #endif _starpu_init_topology(config); support = hwloc_topology_get_support (config->topology.hwtopology); if (support->cpubind->set_thisthread_cpubind) { hwloc_obj_t obj = hwloc_get_obj_by_depth (config->topology.hwtopology, config->cpu_depth, cpuid); hwloc_bitmap_t set = obj->cpuset; int ret; hwloc_bitmap_singlify(set); ret = hwloc_set_cpubind (config->topology.hwtopology, set, HWLOC_CPUBIND_THREAD); if (ret) { perror("hwloc_set_cpubind"); STARPU_ABORT(); } } #elif defined(HAVE_PTHREAD_SETAFFINITY_NP) && defined(__linux__) int ret; /* fix the thread on the correct cpu */ cpu_set_t aff_mask; CPU_ZERO(&aff_mask); CPU_SET(cpuid, &aff_mask); starpu_pthread_t self = pthread_self(); ret = pthread_setaffinity_np(self, sizeof(aff_mask), &aff_mask); if (ret) { perror("binding thread"); STARPU_ABORT(); } #elif defined(_WIN32) DWORD mask = 1 << cpuid; if (!SetThreadAffinityMask(GetCurrentThread(), mask)) { _STARPU_ERROR("SetThreadMaskAffinity(%lx) failed\n", mask); } #else #warning no CPU binding support #endif } void _starpu_bind_thread_on_cpus ( struct _starpu_machine_config *config STARPU_ATTRIBUTE_UNUSED, struct _starpu_combined_worker *combined_worker STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID return; #endif #ifdef STARPU_HAVE_HWLOC const struct hwloc_topology_support *support; #ifdef STARPU_USE_OPENC _starpu_opencl_init(); #endif #ifdef STARPU_USE_CUDA _starpu_init_cuda(); #endif _starpu_init_topology(config); support = hwloc_topology_get_support(config->topology.hwtopology); if (support->cpubind->set_thisthread_cpubind) { hwloc_bitmap_t set = combined_worker->hwloc_cpu_set; int ret; ret = hwloc_set_cpubind (config->topology.hwtopology, set, HWLOC_CPUBIND_THREAD); if (ret) { perror("binding thread"); STARPU_ABORT(); } } #else #warning no parallel worker CPU binding support #endif } static void _starpu_init_workers_binding (struct _starpu_machine_config *config) { /* launch one thread per CPU */ unsigned ram_memory_node; /* a single cpu is dedicated for the accelerators */ int accelerator_bindid = -1; /* note that even if the CPU cpu are not used, we always have a RAM * node */ /* TODO : support NUMA ;) */ ram_memory_node = _starpu_memory_node_register(STARPU_CPU_RAM, -1); #ifdef STARPU_SIMGRID char name[16]; xbt_dynar_t hosts = MSG_hosts_as_dynar(); msg_host_t host = MSG_get_host_by_name("RAM"); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(0, host); #endif /* We will store all the busid of the different (src, dst) * combinations in a matrix which we initialize here. */ _starpu_initialize_busid_matrix(); unsigned worker; for (worker = 0; worker < config->topology.nworkers; worker++) { unsigned memory_node = -1; unsigned is_a_set_of_accelerators = 0; struct _starpu_worker *workerarg = &config->workers[worker]; /* Perhaps the worker has some "favourite" bindings */ int *preferred_binding = NULL; int npreferred = 0; /* select the memory node that contains worker's memory */ switch (workerarg->arch) { case STARPU_CPU_WORKER: /* "dedicate" a cpu cpu to that worker */ is_a_set_of_accelerators = 0; memory_node = ram_memory_node; _starpu_memory_node_add_nworkers(ram_memory_node); break; #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) case STARPU_CUDA_WORKER: #ifndef STARPU_SIMGRID if (may_bind_automatically[STARPU_CUDA_WORKER]) { /* StarPU is allowed to bind threads automatically */ preferred_binding = _starpu_get_cuda_affinity_vector(workerarg->devid); npreferred = config->topology.nhwcpus; } #endif is_a_set_of_accelerators = 0; memory_node = _starpu_memory_node_register(STARPU_CUDA_RAM, workerarg->devid); #ifdef STARPU_SIMGRID const char* cuda_memcpy_peer; snprintf(name, sizeof(name), "CUDA%d", workerarg->devid); host = MSG_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memory_node, host); cuda_memcpy_peer = MSG_host_get_property_value(host, "memcpy_peer"); #endif _starpu_memory_node_add_nworkers(memory_node); _starpu_register_bus(0, memory_node); _starpu_register_bus(memory_node, 0); if ( #ifdef STARPU_SIMGRID cuda_memcpy_peer && atoll(cuda_memcpy_peer) #elif defined(HAVE_CUDA_MEMCPY_PEER) 1 #else /* MEMCPY_PEER */ 0 #endif /* MEMCPY_PEER */ ) { unsigned worker2; for (worker2 = 0; worker2 < worker; worker2++) { struct _starpu_worker *workerarg2 = &config->workers[worker2]; if (workerarg2->arch == STARPU_CUDA_WORKER) { unsigned memory_node2 = starpu_worker_get_memory_node(worker2); _starpu_register_bus(memory_node2, memory_node); _starpu_register_bus(memory_node, memory_node2); } } } break; #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) case STARPU_OPENCL_WORKER: #ifndef STARPU_SIMGRID if (may_bind_automatically[STARPU_OPENCL_WORKER]) { /* StarPU is allowed to bind threads automatically */ preferred_binding = _starpu_get_opencl_affinity_vector(workerarg->devid); npreferred = config->topology.nhwcpus; } #endif is_a_set_of_accelerators = 0; memory_node = _starpu_memory_node_register(STARPU_OPENCL_RAM, workerarg->devid); #ifdef STARPU_SIMGRID snprintf(name, sizeof(name), "OpenCL%d", workerarg->devid); host = MSG_get_host_by_name(name); STARPU_ASSERT(host); _starpu_simgrid_memory_node_set_host(memory_node, host); #endif _starpu_memory_node_add_nworkers(memory_node); _starpu_register_bus(0, memory_node); _starpu_register_bus(memory_node, 0); break; #endif default: STARPU_ABORT(); } if (is_a_set_of_accelerators) { if (accelerator_bindid == -1) accelerator_bindid = _starpu_get_next_bindid(config, preferred_binding, npreferred); workerarg->bindid = accelerator_bindid; } else { workerarg->bindid = _starpu_get_next_bindid(config, preferred_binding, npreferred); } workerarg->memory_node = memory_node; #ifdef __GLIBC__ /* Save the initial cpuset */ CPU_ZERO(&workerarg->initial_cpu_set); CPU_SET(workerarg->bindid, &workerarg->initial_cpu_set); CPU_ZERO(&workerarg->current_cpu_set); CPU_SET(workerarg->bindid, &workerarg->current_cpu_set); #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC /* Put the worker descriptor in the userdata field of the * hwloc object describing the CPU */ hwloc_obj_t worker_obj; worker_obj = hwloc_get_obj_by_depth (config->topology.hwtopology, config->cpu_depth, workerarg->bindid); worker_obj->userdata = &config->workers[worker]; /* Clear the cpu set and set the cpu */ workerarg->initial_hwloc_cpu_set = hwloc_bitmap_dup (worker_obj->cpuset); workerarg->current_hwloc_cpu_set = hwloc_bitmap_dup (worker_obj->cpuset); #endif } #ifdef STARPU_SIMGRID xbt_dynar_free(&hosts); #endif } int _starpu_build_topology (struct _starpu_machine_config *config) { int ret; unsigned i; ret = _starpu_init_machine_config(config); if (ret) return ret; /* for the data management library */ _starpu_memory_nodes_init(); _starpu_init_workers_binding(config); config->cpus_nodeid = -1; config->cuda_nodeid = -1; config->opencl_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_ANY_WORKER: STARPU_ASSERT(0); } } return 0; } void _starpu_destroy_topology (struct _starpu_machine_config *config) { /* cleanup StarPU internal data structures */ _starpu_memory_nodes_deinit(); _starpu_destroy_machine_config(config); } void starpu_topology_print (FILE *output) { struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; unsigned core; unsigned worker; unsigned nworkers = starpu_worker_get_count(); unsigned ncombinedworkers = topology->ncombinedworkers; for (core = 0; core < topology->nhwcpus; core++) { fprintf(output, "core %u\t", core); for (worker = 0; worker < nworkers + ncombinedworkers; worker++) { if (worker < nworkers) { if (topology->workers_bindid[worker] == core) { 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]] == core) fprintf(output, "comb %u\t", worker-nworkers); } } } fprintf(output, "\n"); } } starpu-1.1.5/src/core/task.h0000644000373600000000000000636112571536573012624 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CORE_TASK_H__ #define __CORE_TASK_H__ #include #include #include /* Internal version of starpu_task_destroy: don't check task->destroy flag */ void _starpu_task_destroy(struct starpu_task *task); /* A pthread key is used to store the task currently executed on the thread. * _starpu_task_init initializes this pthread key and * _starpu_set_current_task updates its current value. */ void _starpu_task_init(void); void _starpu_task_deinit(void); void _starpu_set_current_task(struct starpu_task *task); /* NB the second argument makes it possible to count regenerable tasks only * once. */ int _starpu_submit_job(struct _starpu_job *j); int _starpu_task_submit_nodeps(struct starpu_task *task); void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[], int check); /* Returns the job structure (which is the internal data structure associated * to a task). */ struct _starpu_job *_starpu_get_job_associated_to_task(struct starpu_task *task); /* 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); 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]; } #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); #endif // __CORE_TASK_H__ starpu-1.1.5/src/core/debug.c0000644000373600000000000000612612571536574012743 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013, 2015 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_VERBOSE /* we want a single writer at the same time to have a log that is readable */ static starpu_pthread_mutex_t logfile_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static FILE *logfile = NULL; #endif /* Tell gdb whether FXT is compiled in or not */ int _starpu_use_fxt #ifdef STARPU_USE_FXT = 1 #endif ; void _starpu_open_debug_logfile(void) { #ifdef STARPU_VERBOSE /* what is the name of the file ? default = "starpu.log" */ char *logfile_name; logfile_name = starpu_getenv("STARPU_LOGFILENAME"); if (!logfile_name) { logfile_name = "starpu.log"; } logfile = fopen(logfile_name, "w+"); STARPU_ASSERT(logfile); #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. */ #ifdef HAVE_AYUDAME_H 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; codelets = 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 starpu-1.1.5/src/core/dependencies/0002755000373600000000000000000012571541161014200 500000000000000starpu-1.1.5/src/core/dependencies/tags.h0000644000373600000000000000437412571536573015250 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2011 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __TAGS_H__ #define __TAGS_H__ #include #include #include #include #define _STARPU_TAG_SIZE (sizeof(starpu_tag_t)*8) enum _starpu_tag_state { /* this tag is not declared by any task */ STARPU_INVALID_STATE, /* _starpu_tag_declare was called to associate the tag to a task */ STARPU_ASSOCIATED, /* some task dependencies are not fulfilled yet */ STARPU_BLOCKED, /* the task can be (or has been) submitted to the scheduler (all deps * fulfilled) */ STARPU_READY, // useless ... // /* the task has been submitted to the scheduler */ // STARPU_SCHEDULED, /* the task has been performed */ STARPU_DONE }; struct _starpu_job; struct _starpu_tag { /* Lock for this structure. Locking order is in dependency order: a tag * must not be locked before locking a tag it depends on */ struct _starpu_spinlock lock; starpu_tag_t id; /* an identifier for the task */ enum _starpu_tag_state state; struct _starpu_cg_list tag_successors; struct _starpu_job *job; /* which job is associated to the tag if any ? */ unsigned is_assigned; unsigned is_submitted; }; void _starpu_init_tags(void); void _starpu_notify_dependencies(struct _starpu_job *j); void _starpu_notify_tag_dependencies(struct _starpu_tag *tag); void _starpu_tag_declare(starpu_tag_t id, struct _starpu_job *job); void _starpu_tag_set_ready(struct _starpu_tag *tag); unsigned _starpu_submit_job_enforce_task_deps(struct _starpu_job *j); void _starpu_tag_clear(void); #endif // __TAGS_H__ starpu-1.1.5/src/core/dependencies/data_concurrency.h0000644000373600000000000000222612571536573017627 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DATA_CONCURRENCY_H__ #define __DATA_CONCURRENCY_H__ #include unsigned _starpu_submit_job_enforce_data_deps(struct _starpu_job *j); int _starpu_notify_data_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); #endif // __DATA_CONCURRENCY_H__ starpu-1.1.5/src/core/dependencies/cg.h0000644000373600000000000000605712571536573014703 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __CG_H__ #define __CG_H__ #include #include /* we do not necessarily want to allocate room for 256 dependencies, but we want to handle the few situation where there are a lot of dependencies as well */ #define STARPU_DYNAMIC_DEPS_SIZE 1 /* randomly choosen ! */ #ifndef STARPU_DYNAMIC_DEPS_SIZE #define STARPU_NMAXDEPS 256 #endif struct _starpu_job; /* Completion Group list, records both the number of expected notifications * before the completion can start, and the list of successors when the * completion is finished. */ struct _starpu_cg_list { /* Protects atomicity of the list and the terminated flag */ struct _starpu_spinlock lock; /* Number of notifications to be waited for */ unsigned ndeps; /* how many deps ? */ unsigned ndeps_completed; /* how many deps are done ? */ /* Whether the completion is finished. * For restartable/restarted tasks, only the first iteration is taken into account here. */ unsigned terminated; /* List of successors */ unsigned nsuccs; /* how many successors ? */ #ifdef STARPU_DYNAMIC_DEPS_SIZE unsigned succ_list_size; /* How many allocated items in succ */ struct _starpu_cg **succ; #else struct _starpu_cg *succ[STARPU_NMAXDEPS]; #endif }; enum _starpu_cg_type { STARPU_CG_APPS=(1<<0), STARPU_CG_TAG=(1<<1), STARPU_CG_TASK=(1<<2) }; /* Completion Group */ struct _starpu_cg { unsigned ntags; /* number of tags depended on */ unsigned remaining; /* number of remaining tags */ enum _starpu_cg_type cg_type; union { /* STARPU_CG_TAG */ struct _starpu_tag *tag; /* STARPU_CG_TASK */ struct _starpu_job *job; /* STARPU_CG_APPS */ /* in case this completion group is related to an application, * we have to explicitely wake the waiting thread instead of * reschedule the corresponding task */ struct { unsigned completed; starpu_pthread_mutex_t cg_mutex; starpu_pthread_cond_t cg_cond; } succ_apps; } succ; }; void _starpu_cg_list_init(struct _starpu_cg_list *list); void _starpu_cg_list_deinit(struct _starpu_cg_list *list); int _starpu_add_successor_to_cg_list(struct _starpu_cg_list *successors, struct _starpu_cg *cg); void _starpu_notify_cg(struct _starpu_cg *cg); void _starpu_notify_cg_list(struct _starpu_cg_list *successors); void _starpu_notify_task_dependencies(struct _starpu_job *j); #endif // __CG_H__ starpu-1.1.5/src/core/dependencies/dependencies.c0000644000373600000000000000243712571536573016731 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include /* We assume that the job will not disappear under our hands */ void _starpu_notify_dependencies(struct _starpu_job *j) { STARPU_ASSERT(j); STARPU_ASSERT(j->task); /* unlock tasks depending on that task */ _starpu_notify_task_dependencies(j); /* unlock tags depending on that task */ if (j->task->use_tag) _starpu_notify_tag_dependencies(j->tag); } starpu-1.1.5/src/core/dependencies/cg.c0000644000373600000000000001373612571536573014700 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2012 inria * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include void _starpu_cg_list_init(struct _starpu_cg_list *list) { _starpu_spin_init(&list->lock); list->ndeps = 0; list->ndeps_completed = 0; list->terminated = 0; list->nsuccs = 0; #ifdef STARPU_DYNAMIC_DEPS_SIZE /* this is a small initial default value ... may be changed */ list->succ_list_size = 0; list->succ = NULL; #endif } void _starpu_cg_list_deinit(struct _starpu_cg_list *list) { unsigned id; for (id = 0; id < list->nsuccs; id++) { struct _starpu_cg *cg = list->succ[id]; /* We remove the reference on the completion group, and free it * if there is no more reference. */ unsigned ntags = STARPU_ATOMIC_ADD(&cg->ntags, -1); if (ntags == 0) free(list->succ[id]); } #ifdef STARPU_DYNAMIC_DEPS_SIZE free(list->succ); #endif _starpu_spin_destroy(&list->lock); } /* Returns whether the completion was already terminated, and caller should * thus immediately proceed. */ int _starpu_add_successor_to_cg_list(struct _starpu_cg_list *successors, struct _starpu_cg *cg) { int ret; STARPU_ASSERT(cg); _starpu_spin_lock(&successors->lock); ret = successors->terminated; /* where should that cg should be put in the array ? */ unsigned index = successors->nsuccs++; #ifdef STARPU_DYNAMIC_DEPS_SIZE if (index >= successors->succ_list_size) { /* the successor list is too small */ if (successors->succ_list_size > 0) successors->succ_list_size *= 2; else successors->succ_list_size = 4; successors->succ = (struct _starpu_cg **) 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; } /* Note: in case of a tag, it must be already locked */ void _starpu_notify_cg(struct _starpu_cg *cg) { STARPU_ASSERT(cg); ANNOTATE_HAPPENS_BEFORE(&cg->remaining); unsigned remaining = STARPU_ATOMIC_ADD(&cg->remaining, -1); if (remaining == 0) { ANNOTATE_HAPPENS_AFTER(&cg->remaining); cg->remaining = cg->ntags; struct _starpu_tag *tag; struct _starpu_cg_list *tag_successors, *job_successors; struct _starpu_job *j; /* 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: { tag = cg->succ.tag; tag_successors = &tag->tag_successors; tag_successors->ndeps_completed++; /* Note: the tag is already locked by the * caller. */ if ((tag->state == STARPU_BLOCKED) && (tag_successors->ndeps == tag_successors->ndeps_completed)) { /* reset the counter so that we can reuse the completion group */ tag_successors->ndeps_completed = 0; _starpu_tag_set_ready(tag); } break; } case STARPU_CG_TASK: { j = cg->succ.job; STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); job_successors = &j->job_successors; unsigned ndeps_completed = STARPU_ATOMIC_ADD(&job_successors->ndeps_completed, 1); STARPU_ASSERT(job_successors->ndeps >= ndeps_completed); /* Need to atomically test submitted and check * dependencies, since this is concurrent with * _starpu_submit_job */ if (j->submitted && job_successors->ndeps == ndeps_completed && j->task->status == STARPU_TASK_BLOCKED_ON_TASK) { /* That task has already passed tag checks, * do not do them again since the tag has been cleared! */ _starpu_enforce_deps_starting_from_task(j); } else STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); break; } default: STARPU_ABORT(); } } } /* Caller just has to promise that the list will not disappear. * _starpu_notify_cg_list protects the list itself. * No job lock should be held, since we might want to immediately call the callback of an empty task. */ void _starpu_notify_cg_list(struct _starpu_cg_list *successors) { unsigned succ; _starpu_spin_lock(&successors->lock); /* Note: some thread might be concurrently adding other items */ for (succ = 0; succ < successors->nsuccs; succ++) { struct _starpu_cg *cg = successors->succ[succ]; STARPU_ASSERT(cg); unsigned cg_type = cg->cg_type; if (cg_type == STARPU_CG_APPS) { /* Remove the temporary ref to the cg */ memmove(&successors->succ[succ], &successors->succ[succ+1], (successors->nsuccs-(succ+1)) * sizeof(successors->succ[succ])); succ--; successors->nsuccs--; } _starpu_spin_unlock(&successors->lock); struct _starpu_tag *cgtag = NULL; if (cg_type == STARPU_CG_TAG) { cgtag = cg->succ.tag; STARPU_ASSERT(cgtag); _starpu_spin_lock(&cgtag->lock); } _starpu_notify_cg(cg); if (cg_type == STARPU_CG_TAG) _starpu_spin_unlock(&cgtag->lock); _starpu_spin_lock(&successors->lock); } successors->terminated = 1; _starpu_spin_unlock(&successors->lock); } starpu-1.1.5/src/core/dependencies/tags.c0000644000373600000000000003062712571536573015243 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY 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 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 = (struct _starpu_cg *) malloc(sizeof(struct _starpu_cg)); STARPU_ASSERT(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 = (struct _starpu_cg *) malloc(sizeof(struct _starpu_cg)); STARPU_ASSERT(cg); cg->ntags = ntags; cg->remaining = ntags; cg->cg_type = STARPU_CG_TAG; cg->succ.tag = tag; tag->tag_successors.ndeps++; return cg; } static struct _starpu_tag *_starpu_tag_init(starpu_tag_t id) { struct _starpu_tag *tag; tag = (struct _starpu_tag *) malloc(sizeof(struct _starpu_tag)); STARPU_ASSERT(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 remaining STARPU_ATTRIBUTE_UNUSED = STARPU_ATOMIC_ADD(&cg->remaining, -1); if (!ntags && (cg->cg_type == STARPU_CG_TAG)) /* Last tag this cg depends on, cg becomes unreferenced */ free(cg); } #ifdef STARPU_DYNAMIC_DEPS_SIZE free(tag->tag_successors.succ); #endif _starpu_spin_unlock(&tag->lock); _starpu_spin_destroy(&tag->lock); free(tag); } } /* * Staticly initializing tag_global_rwlock seems to lead to weird errors * on Darwin, so we do it dynamically. */ void _starpu_init_tags(void) { STARPU_PTHREAD_RWLOCK_INIT(&tag_global_rwlock, NULL); } void starpu_tag_remove(starpu_tag_t id) { struct _starpu_tag_table *entry; #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_REMOVETASK, id + AYUDAME_OFFSET, NULL); #endif STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); HASH_FIND_UINT64_T(tag_htbl, &id, entry); if (entry) HASH_DEL(tag_htbl, entry); STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); if (entry) { _starpu_tag_free(entry->tag); free(entry); } } void _starpu_tag_clear(void) { STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); /* XXX: _starpu_tag_free takes the tag spinlocks while we are keeping * the global rwlock. This contradicts the lock order of * starpu_tag_wait_array. Should not be a problem in practice since * _starpu_tag_clear is called at shutdown only. */ struct _starpu_tag_table *entry, *tmp; HASH_ITER(hh, tag_htbl, entry, tmp) { HASH_DEL(tag_htbl, entry); _starpu_tag_free(entry->tag); free(entry); } STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); } static struct _starpu_tag *_gettag_struct(starpu_tag_t id) { /* search if the tag is already declared or not */ struct _starpu_tag_table *entry; struct _starpu_tag *tag; HASH_FIND_UINT64_T(tag_htbl, &id, entry); if (entry != NULL) tag = entry->tag; else { /* the tag does not exist yet : create an entry */ tag = _starpu_tag_init(id); struct _starpu_tag_table *entry2; entry2 = (struct _starpu_tag_table *) malloc(sizeof(*entry2)); STARPU_ASSERT(entry2 != NULL); entry2->id = id; entry2->tag = tag; HASH_ADD_UINT64_T(tag_htbl, id, entry2); #ifdef HAVE_AYUDAME_H if (AYU_event) { int64_t AYU_data[2] = {0, 0}; STARPU_ASSERT(id < AYUDAME_OFFSET); AYU_event(AYU_ADDTASK, id + AYUDAME_OFFSET, AYU_data); } #endif } return tag; } static struct _starpu_tag *gettag_struct(starpu_tag_t id) { struct _starpu_tag *tag; STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); tag = _gettag_struct(id); STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); return tag; } /* lock should be taken */ void _starpu_tag_set_ready(struct _starpu_tag *tag) { /* mark this tag as ready to run */ tag->state = STARPU_READY; /* declare it to the scheduler ! */ struct _starpu_job *j = tag->job; /* In case the task job is going to be scheduled immediately, and if * the task is "empty", calling _starpu_push_task would directly try to enforce * the dependencies of the task, and therefore it would try to grab the * lock again, resulting in a deadlock. */ _starpu_spin_unlock(&tag->lock); /* enforce data dependencies */ STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); _starpu_enforce_deps_starting_from_task(j); _starpu_spin_lock(&tag->lock); #ifdef HAVE_AYUDAME_H if (AYU_event) { intptr_t id = 0; AYU_event(AYU_PRERUNTASK, tag->id + AYUDAME_OFFSET, &id); AYU_event(AYU_POSTRUNTASK, tag->id + AYUDAME_OFFSET, NULL); } #endif } /* the lock must be taken ! */ static void _starpu_tag_add_succ(struct _starpu_tag *tag, struct _starpu_cg *cg) { STARPU_ASSERT(tag); _starpu_add_successor_to_cg_list(&tag->tag_successors, cg); if (tag->state == STARPU_DONE) { /* the tag was already completed sooner */ _starpu_notify_cg(cg); } } void _starpu_notify_tag_dependencies(struct _starpu_tag *tag) { _starpu_spin_lock(&tag->lock); if (tag->state == STARPU_DONE) { _starpu_spin_unlock(&tag->lock); return; } tag->state = STARPU_DONE; _STARPU_TRACE_TAG_DONE(tag); _starpu_notify_cg_list(&tag->tag_successors); _starpu_spin_unlock(&tag->lock); } void starpu_tag_restart(starpu_tag_t id) { struct _starpu_tag *tag = gettag_struct(id); _starpu_spin_lock(&tag->lock); STARPU_ASSERT_MSG(tag->state == STARPU_DONE || tag->state == STARPU_INVALID_STATE || tag->state == STARPU_ASSOCIATED || tag->state == STARPU_BLOCKED, "Only completed tags can be restarted (%llu was %d)", (unsigned long long) id, tag->state); tag->state = STARPU_BLOCKED; _starpu_spin_unlock(&tag->lock); } void starpu_tag_notify_from_apps(starpu_tag_t id) { struct _starpu_tag *tag = gettag_struct(id); _starpu_notify_tag_dependencies(tag); } void _starpu_tag_declare(starpu_tag_t id, struct _starpu_job *job) { _STARPU_TRACE_TAG(id, job); job->task->use_tag = 1; struct _starpu_tag *tag= gettag_struct(id); _starpu_spin_lock(&tag->lock); /* Note: a tag can be shared by several tasks, when it is used to * detect when either of them are finished. We however don't allow * several tasks to share a tag when it is used to wake them by * dependency */ if (tag->job != job) tag->is_assigned++; tag->job = job; job->tag = tag; /* the tag is now associated to a job */ /* When the same tag may be signaled several times by different tasks, * and it's already done, we should not reset the "done" state. * When the tag is simply used by the same task several times, we have * to do so. */ if (job->task->regenerate || job->submitted == 2 || tag->state != STARPU_DONE) tag->state = STARPU_ASSOCIATED; #ifdef HAVE_AYUDAME_H if (AYU_event) { uintptr_t AYU_data1[3] = {id+AYUDAME_OFFSET, 0, 0}; uintptr_t AYU_data2[3] = {job->job_id, 0, 0}; AYU_event(AYU_ADDDEPENDENCY, job->job_id, AYU_data1); AYU_event(AYU_ADDDEPENDENCY, id+AYUDAME_OFFSET, AYU_data2); } #endif _starpu_spin_unlock(&tag->lock); } void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array) { if (!ndeps) return; unsigned i; /* create the associated completion group */ struct _starpu_tag *tag_child = gettag_struct(id); _starpu_spin_lock(&tag_child->lock); struct _starpu_cg *cg = create_cg_tag(ndeps, tag_child); _starpu_spin_unlock(&tag_child->lock); for (i = 0; i < ndeps; i++) { starpu_tag_t dep_id = array[i]; /* id depends on dep_id * so cg should be among dep_id's successors*/ _STARPU_TRACE_TAG_DEPS(id, dep_id); _starpu_bound_tag_dep(id, dep_id); struct _starpu_tag *tag_dep = gettag_struct(dep_id); STARPU_ASSERT(tag_dep != tag_child); _starpu_spin_lock(&tag_dep->lock); _starpu_spin_lock(&tag_child->lock); _starpu_tag_add_succ(tag_dep, cg); #ifdef HAVE_AYUDAME_H if (AYU_event) { uintptr_t AYU_data[3] = {dep_id+AYUDAME_OFFSET, 0, 0}; AYU_event(AYU_ADDDEPENDENCY, id+AYUDAME_OFFSET, AYU_data); } #endif _starpu_spin_unlock(&tag_child->lock); _starpu_spin_unlock(&tag_dep->lock); } } void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...) { if (!ndeps) return; unsigned i; /* create the associated completion group */ struct _starpu_tag *tag_child = gettag_struct(id); _starpu_spin_lock(&tag_child->lock); struct _starpu_cg *cg = create_cg_tag(ndeps, tag_child); _starpu_spin_unlock(&tag_child->lock); va_list pa; va_start(pa, ndeps); for (i = 0; i < ndeps; i++) { starpu_tag_t dep_id; dep_id = va_arg(pa, starpu_tag_t); /* id depends on dep_id * so cg should be among dep_id's successors*/ _STARPU_TRACE_TAG_DEPS(id, dep_id); _starpu_bound_tag_dep(id, dep_id); struct _starpu_tag *tag_dep = gettag_struct(dep_id); STARPU_ASSERT(tag_dep != tag_child); _starpu_spin_lock(&tag_dep->lock); _starpu_spin_lock(&tag_child->lock); _starpu_tag_add_succ(tag_dep, cg); #ifdef HAVE_AYUDAME_H if (AYU_event) { uintptr_t AYU_data[3] = {dep_id+AYUDAME_OFFSET, 0, 0}; AYU_event(AYU_ADDDEPENDENCY, id+AYUDAME_OFFSET, AYU_data); } #endif _starpu_spin_unlock(&tag_child->lock); _starpu_spin_unlock(&tag_dep->lock); } va_end(pa); } /* this function may be called by the application (outside callbacks !) */ int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id) { unsigned i; unsigned current; struct _starpu_tag *tag_array[ntags]; _STARPU_LOG_IN(); /* It is forbidden to block within callbacks or codelets */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_tag_wait must not be called from a task or callback"); STARPU_PTHREAD_RWLOCK_WRLOCK(&tag_global_rwlock); /* only wait the tags that are not done yet */ for (i = 0, current = 0; i < ntags; i++) { struct _starpu_tag *tag = _gettag_struct(id[i]); _starpu_spin_lock(&tag->lock); if (tag->state == STARPU_DONE) { /* that tag is done already */ _starpu_spin_unlock(&tag->lock); } else { tag_array[current] = tag; current++; } } STARPU_PTHREAD_RWLOCK_UNLOCK(&tag_global_rwlock); if (current == 0) { /* all deps are already fulfilled */ _STARPU_LOG_OUT_TAG("all deps are already fulfilled"); return 0; } /* there is at least one task that is not finished */ struct _starpu_cg *cg = create_cg_apps(current); for (i = 0; i < current; i++) { _starpu_tag_add_succ(tag_array[i], cg); _starpu_spin_unlock(&tag_array[i]->lock); } STARPU_PTHREAD_MUTEX_LOCK(&cg->succ.succ_apps.cg_mutex); while (!cg->succ.succ_apps.completed) STARPU_PTHREAD_COND_WAIT(&cg->succ.succ_apps.cg_cond, &cg->succ.succ_apps.cg_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&cg->succ.succ_apps.cg_mutex); STARPU_PTHREAD_MUTEX_DESTROY(&cg->succ.succ_apps.cg_mutex); STARPU_PTHREAD_COND_DESTROY(&cg->succ.succ_apps.cg_cond); free(cg); _STARPU_LOG_OUT(); return 0; } int starpu_tag_wait(starpu_tag_t id) { return starpu_tag_wait_array(1, &id); } starpu-1.1.5/src/core/dependencies/implicit_data_deps.c0000644000373600000000000005206612571536573020124 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #if 0 # define _STARPU_DEP_DEBUG(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__); #else # define _STARPU_DEP_DEBUG(fmt, ...) #endif static void _starpu_add_ghost_dependency(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, unsigned long previous STARPU_ATTRIBUTE_UNUSED, struct starpu_task *next STARPU_ATTRIBUTE_UNUSED) { struct _starpu_job *next_job = _starpu_get_job_associated_to_task(next); _starpu_bound_job_id_dep(handle, next_job, previous); #ifdef HAVE_AYUDAME_H if (AYU_event) { uintptr_t AYU_data[3] = { previous, (uintptr_t) handle, (uintptr_t) handle }; AYU_event(AYU_ADDDEPENDENCY, next_job->job_id, AYU_data); } #endif } static void _starpu_add_dependency(starpu_data_handle_t handle STARPU_ATTRIBUTE_UNUSED, struct starpu_task *previous STARPU_ATTRIBUTE_UNUSED, struct starpu_task *next STARPU_ATTRIBUTE_UNUSED) { _starpu_add_ghost_dependency(handle, _starpu_get_job_associated_to_task(previous)->job_id, next); } /* Read after Write (RAW) or Read after Read (RAR) */ static void _starpu_add_reader_after_writer(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 writer if any */ if (handle->last_sync_task && handle->last_sync_task != post_sync_task) { _STARPU_DEP_DEBUG("RAW %p\n", handle); 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 #ifdef HAVE_AYUDAME_H || AYU_event #endif ) && handle->last_submitted_ghost_sync_id_is_valid) { _STARPU_TRACE_GHOST_TASK_DEPS(handle->last_submitted_ghost_sync_id, _starpu_get_job_associated_to_task(pre_sync_task)->job_id); _starpu_add_ghost_dependency(handle, handle->last_submitted_ghost_sync_id, pre_sync_task); _STARPU_DEP_DEBUG("dep ID%lu -> %p\n", handle->last_submitted_ghost_sync_id, pre_sync_task); } if (!pre_sync_task->cl) { /* Add a reference to be released in _starpu_handle_job_termination */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_get_job_associated_to_task(pre_sync_task)->implicit_dep_handle = handle; } } /* Write after Read (WAR) */ static void _starpu_add_writer_after_readers(starpu_data_handle_t handle, struct starpu_task *pre_sync_task, struct starpu_task *post_sync_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 == post_sync_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 != post_sync_task); task_array[i++] = l->task; _starpu_add_dependency(handle, l->task, pre_sync_task); _STARPU_DEP_DEBUG("dep %p -> %p\n", l->task, pre_sync_task); struct _starpu_task_wrapper_dlist *prev = l; l = l->next; prev->task = NULL; prev->next = NULL; prev->prev = NULL; } _starpu_task_declare_deps_array(pre_sync_task, naccessors, task_array, 0); } #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { /* Declare all dependencies with ghost accessors */ struct _starpu_jobid_list *ghost_accessors_id = handle->last_submitted_ghost_accessors_id; while (ghost_accessors_id) { unsigned long id = ghost_accessors_id->id; _STARPU_TRACE_GHOST_TASK_DEPS(id, _starpu_get_job_associated_to_task(pre_sync_task)->job_id); _starpu_add_ghost_dependency(handle, id, pre_sync_task); _STARPU_DEP_DEBUG("dep ID%lu -> %p\n", id, pre_sync_task); struct _starpu_jobid_list *prev = ghost_accessors_id; ghost_accessors_id = ghost_accessors_id->next; free(prev); } handle->last_submitted_ghost_accessors_id = NULL; } handle->last_submitted_accessors.next = &handle->last_submitted_accessors; handle->last_submitted_accessors.prev = &handle->last_submitted_accessors; handle->last_sync_task = post_sync_task; if (!post_sync_task->cl) { /* Add a reference to be released in _starpu_handle_job_termination */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_get_job_associated_to_task(post_sync_task)->implicit_dep_handle = handle; } } /* Write after Write (WAW) */ static void _starpu_add_writer_after_writer(starpu_data_handle_t handle, struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task) { /* (Read) Write */ /* This task depends on the previous writer */ 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"); } /* If there is a ghost writer instead, we * should declare a ghost dependency here, and * invalidate the ghost value. */ #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { if (handle->last_submitted_ghost_sync_id_is_valid) { _STARPU_TRACE_GHOST_TASK_DEPS(handle->last_submitted_ghost_sync_id, _starpu_get_job_associated_to_task(pre_sync_task)->job_id); _starpu_add_ghost_dependency(handle, handle->last_submitted_ghost_sync_id, pre_sync_task); _STARPU_DEP_DEBUG("dep ID%lu -> %p\n", handle->last_submitted_ghost_sync_id, pre_sync_task); handle->last_submitted_ghost_sync_id_is_valid = 0; } else { _STARPU_DEP_DEBUG("No dep ID\n"); } } handle->last_sync_task = post_sync_task; if (!post_sync_task->cl) { /* Add a reference to be released in _starpu_handle_job_termination */ _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); _starpu_get_job_associated_to_task(post_sync_task)->implicit_dep_handle = handle; } } /* This function adds the implicit task dependencies introduced by data * sequential consistency. Two tasks are provided: pre_sync and post_sync which * respectively indicates which task is going to depend on the previous deps * and on which task future deps should wait. In the case of a dependency * introduced by a task submission, both tasks are just the submitted task, but * in the case of user interactions with the DSM, these may be different tasks. * */ /* NB : handle->sequential_consistency_mutex must be hold by the caller; * returns a task, to be submitted after releasing that mutex. */ struct starpu_task *_starpu_detect_implicit_data_deps_with_handle(struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task, struct _starpu_task_wrapper_dlist *post_sync_task_dependency_slot, starpu_data_handle_t handle, enum starpu_data_access_mode mode) { struct starpu_task *task = NULL; STARPU_ASSERT(!(mode & STARPU_SCRATCH)); _STARPU_LOG_IN(); if (handle->sequential_consistency) { struct _starpu_job *pre_sync_job = _starpu_get_job_associated_to_task(pre_sync_task); struct _starpu_job *post_sync_job = _starpu_get_job_associated_to_task(post_sync_task); /* 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; _STARPU_DEP_DEBUG("Tasks %p %p\n", pre_sync_task, post_sync_task); /* In case we are generating the DAG, we add an implicit * dependency between the pre and the post sync tasks in case * they are not the same. */ if (pre_sync_task != post_sync_task #ifndef STARPU_USE_FXT && _starpu_bound_recording #endif ) { _STARPU_TRACE_GHOST_TASK_DEPS(pre_sync_job->job_id, post_sync_job->job_id); _starpu_bound_task_dep(post_sync_job, pre_sync_job); } enum starpu_data_access_mode previous_mode = handle->last_submitted_mode; if (mode & STARPU_W) { _STARPU_DEP_DEBUG("W %p\n", handle); if (previous_mode & STARPU_W) { _STARPU_DEP_DEBUG("WAW %p\n", handle); _starpu_add_writer_after_writer(handle, pre_sync_task, post_sync_task); } else { /* The task submitted previously were in read-only * mode: this task must depend on all those read-only * tasks and we get rid of the list of readers */ _STARPU_DEP_DEBUG("WAR %p\n", handle); _starpu_add_writer_after_readers(handle, pre_sync_task, post_sync_task); } } else { _STARPU_DEP_DEBUG("R %p %d -> %d\n", handle, previous_mode, mode); /* Add a reader, after a writer or a reader. */ STARPU_ASSERT(pre_sync_task); STARPU_ASSERT(post_sync_task); STARPU_ASSERT(mode & (STARPU_R|STARPU_REDUX)); if (!(previous_mode & STARPU_W) && (mode != previous_mode)) { /* Read after Redux or Redux after Read: we * insert a dummy synchronization task so that * we don't need to have a gigantic number of * dependencies between all readers and all * redux tasks. */ /* Create an empty task */ struct starpu_task *new_sync_task; new_sync_task = starpu_task_create(); STARPU_ASSERT(new_sync_task); new_sync_task->cl = NULL; #ifdef STARPU_USE_FXT _starpu_get_job_associated_to_task(new_sync_task)->model_name = "sync_task_redux"; #endif _starpu_add_writer_after_readers(handle, new_sync_task, new_sync_task); task = new_sync_task; } _starpu_add_reader_after_writer(handle, pre_sync_task, post_sync_task, post_sync_task_dependency_slot); } handle->last_submitted_mode = mode; } _STARPU_LOG_OUT(); return task; } /* Create the implicit dependencies for a newly submitted task */ void _starpu_detect_implicit_data_deps(struct starpu_task *task) { STARPU_ASSERT(task->cl); _STARPU_LOG_IN(); if (!task->sequential_consistency) return; /* We don't want to enforce a sequential consistency for tasks that are * not visible to the application. */ struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (j->reduction_task) return; unsigned nbuffers = task->cl->nbuffers; struct _starpu_task_wrapper_dlist *dep_slots = _STARPU_JOB_GET_DEP_SLOTS(j); unsigned buffer; for (buffer = 0; buffer < nbuffers; buffer++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, buffer); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(task->cl, buffer); struct starpu_task *new_task; /* Scratch memory does not introduce any deps */ if (mode & STARPU_SCRATCH) continue; STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); new_task = _starpu_detect_implicit_data_deps_with_handle(task, task, &dep_slots[buffer], handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } } _STARPU_LOG_OUT(); } /* This function is called when a task has been executed so that we don't * create dependencies to task that do not exist anymore. */ /* NB: We maintain a list of "ghost deps" in case FXT is enabled. Ghost * dependencies are the dependencies that are implicitely enforced by StarPU * even if they do not imply a real dependency. For instance in the following * sequence, f(Ar) g(Ar) h(Aw), we expect to have h depend on both f and g, but * if h is submitted after the termination of f or g, StarPU will not create a * dependency as this is not needed anymore. */ /* the sequential_consistency_mutex of the handle has to be already held */ void _starpu_release_data_enforce_sequential_consistency(struct starpu_task *task, struct _starpu_task_wrapper_dlist *task_dependency_slot, starpu_data_handle_t handle) { STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); if (handle->sequential_consistency) { /* If this is the last writer, there is no point in adding * extra deps to that tasks that does not exists anymore */ if (task == handle->last_sync_task) { handle->last_sync_task = NULL; #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { /* Save the previous writer as the ghost last writer */ handle->last_submitted_ghost_sync_id_is_valid = 1; struct _starpu_job *ghost_job = _starpu_get_job_associated_to_task(task); handle->last_submitted_ghost_sync_id = ghost_job->job_id; } } /* Same if this is one of the readers: we go through the list * of readers and remove the task if it is found. */ if (task_dependency_slot && task_dependency_slot->next) { #ifdef STARPU_DEBUG /* Make sure we are removing ourself from the proper handle */ struct _starpu_task_wrapper_dlist *l; for (l = task_dependency_slot->prev; l->task; l = l->prev) ; STARPU_ASSERT(l == &handle->last_submitted_accessors); for (l = task_dependency_slot->next; l->task; l = l->next) ; STARPU_ASSERT(l == &handle->last_submitted_accessors); #endif STARPU_ASSERT(task_dependency_slot->task == task); task_dependency_slot->next->prev = task_dependency_slot->prev; task_dependency_slot->prev->next = task_dependency_slot->next; task_dependency_slot->task = NULL; task_dependency_slot->next = NULL; task_dependency_slot->prev = NULL; #ifndef STARPU_USE_FXT if (_starpu_bound_recording) #endif { /* Save the job id of the reader task in the ghost reader linked list list */ struct _starpu_job *ghost_reader_job = _starpu_get_job_associated_to_task(task); struct _starpu_jobid_list *link = (struct _starpu_jobid_list *) malloc(sizeof(struct _starpu_jobid_list)); STARPU_ASSERT(link); link->next = handle->last_submitted_ghost_accessors_id; link->id = ghost_reader_job->job_id; handle->last_submitted_ghost_accessors_id = link; } } } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } /* This is the same as _starpu_release_data_enforce_sequential_consistency, but * for all data of a task */ void _starpu_release_task_enforce_sequential_consistency(struct _starpu_job *j) { struct starpu_task *task = j->task; struct _starpu_data_descr *descrs = _STARPU_JOB_GET_ORDERED_BUFFERS(j); struct _starpu_task_wrapper_dlist *slots = _STARPU_JOB_GET_DEP_SLOTS(j); if (!task->cl) return; unsigned nbuffers = task->cl->nbuffers; unsigned index; /* Release all implicit dependencies */ for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, index); _starpu_release_data_enforce_sequential_consistency(task, &slots[index], handle); } for (index = 0; index < nbuffers; index++) { starpu_data_handle_t handle = descrs[index].handle; if (index && descrs[index-1].handle == descrs[index].handle) /* We have already released this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles */ continue; /* Release the reference acquired in _starpu_push_task_output */ _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (!_starpu_data_check_not_busy(handle)) _starpu_spin_unlock(&handle->header_lock); } } void _starpu_add_post_sync_tasks(struct starpu_task *post_sync_task, starpu_data_handle_t handle) { _STARPU_LOG_IN(); STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); if (handle->sequential_consistency) { handle->post_sync_tasks_cnt++; struct _starpu_task_wrapper_list *link = (struct _starpu_task_wrapper_list *) malloc(sizeof(struct _starpu_task_wrapper_list)); link->task = post_sync_task; link->next = handle->post_sync_tasks; handle->post_sync_tasks = link; } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); _STARPU_LOG_OUT(); } void _starpu_unlock_post_sync_tasks(starpu_data_handle_t handle) { struct _starpu_task_wrapper_list *post_sync_tasks = NULL; unsigned do_submit_tasks = 0; /* Here helgrind would shout that this is an unprotected access, but * count can only be zero if we don't have to care about * post_sync_tasks_cnt at all. */ if (STARPU_RUNNING_ON_VALGRIND || handle->post_sync_tasks_cnt) { STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); if (--handle->post_sync_tasks_cnt == 0) { /* unlock all tasks : we need not hold the lock while unlocking all these tasks */ do_submit_tasks = 1; post_sync_tasks = handle->post_sync_tasks; handle->post_sync_tasks = NULL; } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } if (do_submit_tasks) { struct _starpu_task_wrapper_list *link = post_sync_tasks; while (link) { /* There is no need to depend on that task now, since it was already unlocked */ _starpu_release_data_enforce_sequential_consistency(link->task, &_starpu_get_job_associated_to_task(link->task)->implicit_dep_slot, handle); int ret = _starpu_task_submit_internally(link->task); STARPU_ASSERT(!ret); struct _starpu_task_wrapper_list *tmp = link; link = link->next; free(tmp); } } } /* If sequential consistency mode is enabled, this function blocks until the * handle is available in the requested access mode. */ int _starpu_data_wait_until_available(starpu_data_handle_t handle, enum starpu_data_access_mode mode, const char *sync_name) { /* If sequential consistency is enabled, wait until data is available */ STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); int sequential_consistency = handle->sequential_consistency; if (sequential_consistency) { struct starpu_task *sync_task, *new_task; sync_task = starpu_task_create(); sync_task->detach = 0; sync_task->destroy = 1; #ifdef STARPU_USE_FXT _starpu_get_job_associated_to_task(sync_task)->model_name = sync_name; #endif /* It is not really a RW access, but we want to make sure that * all previous accesses are done */ new_task = _starpu_detect_implicit_data_deps_with_handle(sync_task, sync_task, &_starpu_get_job_associated_to_task(sync_task)->implicit_dep_slot, handle, mode); STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); if (new_task) { int ret = _starpu_task_submit_internally(new_task); STARPU_ASSERT(!ret); } /* TODO detect if this is superflous */ int ret = _starpu_task_submit_internally(sync_task); STARPU_ASSERT(!ret); ret = starpu_task_wait(sync_task); STARPU_ASSERT(ret == 0); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } return 0; } /* This data is about to be freed, clean our stuff */ void _starpu_data_clear_implicit(starpu_data_handle_t handle) { struct _starpu_jobid_list *list; STARPU_PTHREAD_MUTEX_LOCK(&handle->sequential_consistency_mutex); list = handle->last_submitted_ghost_accessors_id; while (list) { struct _starpu_jobid_list *next = list->next; free(list); list = next; } STARPU_PTHREAD_MUTEX_UNLOCK(&handle->sequential_consistency_mutex); } starpu-1.1.5/src/core/dependencies/data_concurrency.c0000644000373600000000000003275712571536573017636 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012,2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include /* * We have a kind of dining philosophers problem: various tasks are accessing * various data concurrently in different modes: STARPU_R, STARPU_RW, STARPU_W, * STARPU_SCRATCH and STARPU_REDUX. STARPU_RW is managed as a STARPU_W access. * We have the following constraints: * * - A single STARPU_W access is allowed at a time. * - Concurrent STARPU_R accesses are allowed. * - Concurrent STARPU_SCRATCH accesses are allowed. * - Concurrent STARPU_REDUX accesses are allowed. * * What we do here is implementing the Dijkstra solutions: handles are sorted * by pointer value order, and tasks call * _starpu_attempt_to_submit_data_request for each requested data in that order * (see _starpu_sort_task_handles call in _starpu_submit_job_enforce_data_deps). * * _starpu_attempt_to_submit_data_request will either: * - obtain access to the data, and thus the task can proceed with acquiring * other data (see _submit_job_enforce_data_deps) * - queue a request on the data handle * * When a task finishes, it calls _starpu_notify_data_dependencies for each * data, to free its acquisitions. This will look whether the first queued * request can be fulfilled, and in such case make the task try to acquire its * next data. * * The same mechanism is used for application data aquisition * (starpu_data_acquire). */ /* * Check to see whether the first queued request can proceed, and return it in * such case. */ /* the header lock must be taken by the caller */ static struct _starpu_data_requester *may_unlock_data_req_list_head(starpu_data_handle_t handle) { struct _starpu_data_requester_list *req_list; if (handle->reduction_refcnt > 0) { req_list = &handle->reduction_req_list; } else { if (_starpu_data_requester_list_empty(&handle->reduction_req_list)) req_list = &handle->req_list; else req_list = &handle->reduction_req_list; } /* if there is no one to unlock ... */ if (_starpu_data_requester_list_empty(req_list)) return NULL; /* if there is no reference to the data anymore, we can use it */ if (handle->refcnt == 0) return _starpu_data_requester_list_pop_front(req_list); if (handle->current_mode == STARPU_W) return NULL; /* data->current_mode == STARPU_R, so we can process more readers */ struct _starpu_data_requester *r = _starpu_data_requester_list_front(req_list); enum starpu_data_access_mode r_mode = r->mode; if (r_mode == STARPU_RW) r_mode = STARPU_W; /* If this is a STARPU_R, STARPU_SCRATCH or STARPU_REDUX type of * access, we only proceed if the cuurrent mode is the same as the * requested mode. */ if (r_mode == handle->current_mode) return _starpu_data_requester_list_pop_front(req_list); else return NULL; } /* Try to submit a data request, in case the request can be processed * immediatly, return 0, if there is still a dependency that is not compatible * with the current mode, the request is put in the per-handle list of * "requesters", and this function returns 1. */ 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 (mode == STARPU_RW) mode = STARPU_W; /* Take the lock protecting the header. We try to do some progression * in case this is called from a worker, otherwise we just wait for the * lock to be available. */ if (request_from_codelet) { int cpt = 0; while (cpt < STARPU_SPIN_MAXTRY && _starpu_spin_trylock(&handle->header_lock)) { cpt++; _starpu_datawizard_progress(_starpu_memory_node_get_local_key(), 0); } if (cpt == STARPU_SPIN_MAXTRY) _starpu_spin_lock(&handle->header_lock); } else { _starpu_spin_lock(&handle->header_lock); } /* If we have a request that is not used for the reduction, and that a * reduction is pending, we put it at the end of normal list, and we * use the reduction_req_list instead */ unsigned pending_reduction = (handle->reduction_refcnt > 0); unsigned frozen = 0; /* If we are currently performing a reduction, we freeze any request * that is not explicitely a reduction task. */ unsigned is_a_reduction_task = (request_from_codelet && j->reduction_task); if (pending_reduction && !is_a_reduction_task) frozen = 1; /* If there is currently nobody accessing the piece of data, or it's * not another writter and if this is the same type of access as the * current one, we can proceed. */ unsigned put_in_list = 1; enum starpu_data_access_mode previous_mode = handle->current_mode; if (!frozen && ((handle->refcnt == 0) || (!(mode == STARPU_W) && (handle->current_mode == mode)))) { /* Detect whether this is the end of a reduction phase */ /* We don't want to start multiple reductions of the * same handle at the same time ! */ if ((handle->reduction_refcnt == 0) && (previous_mode == STARPU_REDUX) && (mode != STARPU_REDUX)) { _starpu_data_end_reduction_mode(handle); /* Since we need to perform a mode change, we freeze * the request if needed. */ put_in_list = (handle->reduction_refcnt > 0); } else { put_in_list = 0; } } if (put_in_list) { /* there cannot be multiple writers or a new writer * while the data is in read mode */ handle->busy_count++; /* enqueue the request */ struct _starpu_data_requester *r = _starpu_data_requester_new(); r->mode = mode; r->is_requested_by_codelet = request_from_codelet; r->j = j; r->buffer_index = buffer_index; r->ready_data_callback = callback; r->argcb = argcb; /* We put the requester in a specific list if this is a reduction task */ struct _starpu_data_requester_list *req_list = is_a_reduction_task?&handle->reduction_req_list:&handle->req_list; _starpu_data_requester_list_push_back(req_list, r); /* failed */ put_in_list = 1; } else { handle->refcnt++; handle->busy_count++; /* Do not write to handle->current_mode if it is already * R. This avoids a spurious warning from helgrind when * the following happens: * acquire(R) in thread A * acquire(R) in thread B * release_data_on_node() in thread A * helgrind would shout that the latter reads current_mode * unsafely. * * This actually basically explains helgrind that it is a * shared R acquisition. */ if (mode != STARPU_R || handle->current_mode != mode) handle->current_mode = mode; if ((mode == STARPU_REDUX) && (previous_mode != STARPU_REDUX)) _starpu_data_start_reduction_mode(handle); /* success */ put_in_list = 0; } _starpu_spin_unlock(&handle->header_lock); return put_in_list; } 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); } static unsigned attempt_to_submit_data_request_from_job(struct _starpu_job *j, unsigned buffer_index) { /* Note that we do not access j->task->handles, but j->ordered_buffers * which is a sorted copy of it. */ starpu_data_handle_t handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buffer_index); enum starpu_data_access_mode mode = _STARPU_JOB_GET_ORDERED_BUFFER_MODE(j, buffer_index); 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 */ static unsigned _submit_job_enforce_data_deps(struct _starpu_job *j, unsigned start_buffer_index) { unsigned buf; unsigned nbuffers = j->task->cl->nbuffers; for (buf = start_buffer_index; buf < nbuffers; buf++) { if (buf) { starpu_data_handle_t handle_m1 = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf-1); starpu_data_handle_t handle = _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(j, buf); if (handle_m1 == handle) /* We have already requested this data, skip it. This * depends on ordering putting writes before reads, see * _starpu_compar_handles. */ continue; } j->task->status = STARPU_TASK_BLOCKED_ON_DATA; if (attempt_to_submit_data_request_from_job(j, buf)) { return 1; } } return 0; } /* Sort the data used by the given job by handle pointer value order, and * acquire them in that order */ unsigned _starpu_submit_job_enforce_data_deps(struct _starpu_job *j) { struct starpu_codelet *cl = j->task->cl; if ((cl == NULL) || (cl->nbuffers == 0)) return 0; /* 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; for (i=0 ; inbuffers ; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(j->task, i); _STARPU_JOB_SET_ORDERED_BUFFER_HANDLE(j, handle, i); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(j->task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_MODE(j, mode, i); int node = -1; if (j->task->cl->specific_nodes) node = STARPU_CODELET_GET_NODE(j->task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_NODE(j, node, i); } _starpu_sort_task_handles(_STARPU_JOB_GET_ORDERED_BUFFERS(j), cl->nbuffers); return _submit_job_enforce_data_deps(j, 0); } /* This request got fulfilled, continue with the other requests of the * corresponding job */ static unsigned unlock_one_requester(struct _starpu_data_requester *r) { struct _starpu_job *j = r->j; unsigned nbuffers = j->task->cl->nbuffers; unsigned buffer_index = r->buffer_index; if (buffer_index + 1 < nbuffers) /* not all buffers are protected yet */ return _submit_job_enforce_data_deps(j, buffer_index + 1); else return 0; } /* This is called when a task is finished with a piece of data * (or on starpu_data_release) * * The header lock must already be taken by the caller. * This may free the handle if it was lazily unregistered (1 is returned in * that case). The handle pointer thus becomes invalid for the caller. */ int _starpu_notify_data_dependencies(starpu_data_handle_t handle) { _starpu_spin_checklocked(&handle->header_lock); /* A data access has finished so we remove a reference. */ STARPU_ASSERT(handle->refcnt > 0); handle->refcnt--; STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (_starpu_data_check_not_busy(handle)) /* Handle was destroyed, nothing left to do. */ return 1; /* 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); } struct _starpu_data_requester *r; while ((r = may_unlock_data_req_list_head(handle))) { /* STARPU_RW accesses are treated as STARPU_W */ enum starpu_data_access_mode r_mode = r->mode; if (r_mode == STARPU_RW) r_mode = STARPU_W; int put_in_list = 1; if ((handle->reduction_refcnt == 0) && (handle->current_mode == STARPU_REDUX) && (r_mode != STARPU_REDUX)) { _starpu_data_end_reduction_mode(handle); /* Since we need to perform a mode change, we freeze * the request if needed. */ put_in_list = (handle->reduction_refcnt > 0); } else { put_in_list = 0; } if (put_in_list) { /* We need to put the request back because we must * perform a reduction before. */ _starpu_data_requester_list_push_front(&handle->req_list, r); } else { /* The data is now attributed to that request so we put a * reference on it. */ handle->refcnt++; handle->busy_count++; enum starpu_data_access_mode previous_mode = handle->current_mode; handle->current_mode = r_mode; /* In case we enter in a reduction mode, we invalidate all per * worker replicates. Note that the "per_node" replicates are * kept intact because we'll reduce a valid copy of the * "per-node replicate" with the per-worker replicates .*/ if ((r_mode == STARPU_REDUX) && (previous_mode != STARPU_REDUX)) _starpu_data_start_reduction_mode(handle); _starpu_spin_unlock(&handle->header_lock); if (r->is_requested_by_codelet) { if (!unlock_one_requester(r)) _starpu_push_task(r->j); } else { STARPU_ASSERT(r->ready_data_callback); /* execute the callback associated with the data requester */ r->ready_data_callback(r->argcb); } _starpu_data_requester_delete(r); _starpu_spin_lock(&handle->header_lock); STARPU_ASSERT(handle->busy_count > 0); handle->busy_count--; if (_starpu_data_check_not_busy(handle)) return 1; } } return 0; } starpu-1.1.5/src/core/dependencies/implicit_data_deps.h0000644000373600000000000000360612571536573020125 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012, 2014-2015 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __IMPLICIT_DATA_DEPS_H__ #define __IMPLICIT_DATA_DEPS_H__ #include #include struct starpu_task *_starpu_detect_implicit_data_deps_with_handle(struct starpu_task *pre_sync_task, struct starpu_task *post_sync_task, struct _starpu_task_wrapper_dlist *post_sync_task_dependency_slot, starpu_data_handle_t handle, enum starpu_data_access_mode mode); void _starpu_detect_implicit_data_deps(struct starpu_task *task); void _starpu_release_data_enforce_sequential_consistency(struct starpu_task *task, struct _starpu_task_wrapper_dlist *task_dependency_slot, starpu_data_handle_t handle); void _starpu_release_task_enforce_sequential_consistency(struct _starpu_job *j); void _starpu_add_post_sync_tasks(struct starpu_task *post_sync_task, starpu_data_handle_t handle); void _starpu_unlock_post_sync_tasks(starpu_data_handle_t handle); /* This function blocks until the handle is available in the requested mode */ int _starpu_data_wait_until_available(starpu_data_handle_t handle, enum starpu_data_access_mode mode, const char *sync_name); void _starpu_data_clear_implicit(starpu_data_handle_t handle); #endif // __IMPLICIT_DATA_DEPS_H__ starpu-1.1.5/src/core/dependencies/task_deps.c0000644000373600000000000001042312571536573016252 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include static struct _starpu_cg *create_cg_task(unsigned ntags, struct _starpu_job *j) { struct _starpu_cg *cg = (struct _starpu_cg *) malloc(sizeof(struct _starpu_cg)); STARPU_ASSERT(cg); cg->ntags = ntags; cg->remaining = ntags; cg->cg_type = STARPU_CG_TASK; cg->succ.job = j; j->job_successors.ndeps++; return cg; } static void _starpu_task_add_succ(struct _starpu_job *j, struct _starpu_cg *cg) { STARPU_ASSERT(j); if (_starpu_add_successor_to_cg_list(&j->job_successors, cg)) /* the task was already completed sooner */ _starpu_notify_cg(cg); } void _starpu_notify_task_dependencies(struct _starpu_job *j) { _starpu_notify_cg_list(&j->job_successors); } /* task depends on the tasks in task array */ void _starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[], int check) { if (ndeps == 0) return; struct _starpu_job *job; job = _starpu_get_job_associated_to_task(task); STARPU_PTHREAD_MUTEX_LOCK(&job->sync_mutex); if (check) STARPU_ASSERT_MSG(!job->submitted || !task->destroy || task->detach, "Task dependencies have to be set before submission (submitted %u destroy %d detach %d)", job->submitted, task->destroy, task->detach); else STARPU_ASSERT_MSG(job->terminated <= 1, "Task dependencies have to be set before termination (terminated %u)", job->terminated); struct _starpu_cg *cg = create_cg_task(ndeps, job); STARPU_PTHREAD_MUTEX_UNLOCK(&job->sync_mutex); unsigned i; for (i = 0; i < ndeps; i++) { struct starpu_task *dep_task = task_array[i]; struct _starpu_job *dep_job; struct _starpu_cg *back_cg = NULL; dep_job = _starpu_get_job_associated_to_task(dep_task); STARPU_ASSERT_MSG(dep_job != job, "A task must not depend on itself."); STARPU_PTHREAD_MUTEX_LOCK(&dep_job->sync_mutex); if (check) { STARPU_ASSERT_MSG(!dep_job->submitted || !dep_job->task->destroy || dep_job->task->detach, "Unless it is not to be destroyed automatically, a task dependencies have to be set before submission"); STARPU_ASSERT_MSG(dep_job->submitted != 2, "For resubmited tasks, dependencies have to be set before first re-submission"); STARPU_ASSERT_MSG(!dep_job->submitted || !dep_job->task->regenerate, "For regenerated tasks, dependencies have to be set before first submission"); } else STARPU_ASSERT_MSG(dep_job->terminated <= 1, "Task dependencies have to be set before termination (terminated %u)", dep_job->terminated); if (dep_job->task->regenerate) { /* Make sure we don't regenerate the dependency before this task is finished */ back_cg = create_cg_task(1, dep_job); /* Just do not take that dependency into account for the first submission */ dep_job->job_successors.ndeps_completed++; } STARPU_PTHREAD_MUTEX_UNLOCK(&dep_job->sync_mutex); _STARPU_TRACE_TASK_DEPS(dep_job, job); _starpu_bound_task_dep(job, dep_job); #ifdef HAVE_AYUDAME_H if (AYU_event && check) { uintptr_t AYU_data[3] = {dep_job->job_id, 0, 0}; AYU_event(AYU_ADDDEPENDENCY, job->job_id, AYU_data); } #endif _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); } starpu-1.1.5/src/core/detect_combined_workers.h0000644000373600000000000000144412571536573016543 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include /* Initialize combined workers */ void _starpu_sched_find_worker_combinations(int *workerids, int nworkers); starpu-1.1.5/src/core/errorcheck.h0000644000373600000000000000423312571536573014005 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __ERRORCHECK_H__ #define __ERRORCHECK_H__ #include /* This type describes in which state a worker may be. */ enum _starpu_worker_status { /* invalid status (for instance if we request the status of some thread * that is not controlled by StarPU */ STATUS_INVALID, /* everything that does not fit the other status */ STATUS_UNKNOWN, /* during the initialization */ STATUS_INITIALIZING, /* during the execution of a codelet */ STATUS_EXECUTING, /* during the execution of the callback */ STATUS_CALLBACK, /* while executing the scheduler code */ STATUS_SCHEDULING, /* while sleeping because there is nothing to do */ STATUS_SLEEPING, /* while a sleeping worker is about to wake up (to avoid waking twice for the same worker) */ STATUS_WAKING_UP }; /* 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_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.1.5/src/core/sched_policy.c0000644000373600000000000006333212571536573014323 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include static int use_prefetch = 0; int starpu_get_prefetch_flag(void) { return use_prefetch; } static struct starpu_sched_policy *predefined_policies[] = { &_starpu_sched_eager_policy, &_starpu_sched_prio_policy, &_starpu_sched_random_policy, &_starpu_sched_ws_policy, &_starpu_sched_dm_policy, &_starpu_sched_dmda_policy, &_starpu_sched_dmda_ready_policy, &_starpu_sched_dmda_sorted_policy, &_starpu_sched_parallel_heft_policy, &_starpu_sched_peager_policy, NULL }; struct starpu_sched_policy **starpu_sched_get_predefined_policies() { return predefined_policies; } struct starpu_sched_policy *_starpu_get_sched_policy(struct _starpu_sched_ctx *sched_ctx) { return sched_ctx->sched_policy; } /* * Methods to initialize the scheduling policy */ static void load_sched_policy(struct starpu_sched_policy *sched_policy, struct _starpu_sched_ctx *sched_ctx) { STARPU_ASSERT(sched_policy); #ifdef STARPU_VERBOSE if (sched_policy->policy_name) { if (sched_policy->policy_description) _STARPU_DEBUG("Use %s scheduler (%s)\n", sched_policy->policy_name, sched_policy->policy_description); else _STARPU_DEBUG("Use %s scheduler \n", sched_policy->policy_name); } #endif struct starpu_sched_policy *policy = sched_ctx->sched_policy; memcpy(policy, sched_policy, sizeof(*policy)); } static struct starpu_sched_policy *find_sched_policy_from_name(const char *policy_name) { if (!policy_name) return NULL; if (strncmp(policy_name, "heft", 5) == 0) { _STARPU_DISP("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) fprintf(stderr, "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(void) { 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(stderr, "\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(stderr, "%s\t-> %s\n", p->policy_name, p->policy_description); } fprintf(stderr, "\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); /* First, we check whether the application explicitely gave a scheduling policy or not */ if (!selected_policy && 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 (!selected_policy && sched_pol_name) selected_policy = find_sched_policy_from_name(sched_pol_name); /* Perhaps there was no policy that matched the name */ if (selected_policy) return selected_policy; /* If no policy was specified, we use the greedy policy as a default */ return &_starpu_sched_eager_policy; } void _starpu_init_sched_policy(struct _starpu_machine_config *config, struct _starpu_sched_ctx *sched_ctx, struct starpu_sched_policy *selected_policy) { /* Perhaps we have to display some help */ display_sched_help_message(); /* Prefetch is activated by default */ use_prefetch = starpu_get_env_number("STARPU_PREFETCH"); if (use_prefetch == -1) use_prefetch = 1; /* Set calibrate flag */ _starpu_set_calibrate_flag(config->conf.calibrate); load_sched_policy(selected_policy, sched_ctx); _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->init_sched(sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } void _starpu_deinit_sched_policy(struct _starpu_sched_ctx *sched_ctx) { struct starpu_sched_policy *policy = sched_ctx->sched_policy; if (policy->deinit_sched) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; policy->deinit_sched(sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } static void _starpu_push_task_on_specific_worker_notify_sched(struct starpu_task *task, struct _starpu_worker *worker, int workerid, int perf_workerid) { /* if we push a task on a specific worker, notify all the sched_ctxs the worker belongs to */ struct _starpu_sched_ctx *sched_ctx; struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); if (sched_ctx->sched_policy != NULL && sched_ctx->sched_policy->push_task_notify) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->push_task_notify(task, workerid, perf_workerid, sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } } /* Enqueue a task into the list of tasks explicitely attached to a worker. In * case workerid identifies a combined worker, a task will be enqueued into * each worker of the combination. */ static int _starpu_push_task_on_specific_worker(struct starpu_task *task, int workerid) { int nbasic_workers = (int)starpu_worker_get_count(); /* Is this a basic worker or a combined worker ? */ int is_basic_worker = (workerid < nbasic_workers); unsigned memory_node; struct _starpu_worker *worker = NULL; struct _starpu_combined_worker *combined_worker = NULL; if (is_basic_worker) { worker = _starpu_get_worker_struct(workerid); memory_node = worker->memory_node; } else { combined_worker = _starpu_get_combined_worker_struct(workerid); memory_node = combined_worker->memory_node; } if (use_prefetch) starpu_prefetch_task_input_on_node(task, memory_node); if (is_basic_worker) _starpu_push_task_on_specific_worker_notify_sched(task, worker, workerid, workerid); else { /* Notify all workers of the combined worker */ int worker_size = combined_worker->worker_size; int *combined_workerid = combined_worker->combined_workerid; int j; for (j = 0; j < worker_size; j++) { int subworkerid = combined_workerid[j]; _starpu_push_task_on_specific_worker_notify_sched(task, _starpu_get_worker_struct(subworkerid), subworkerid, workerid); } } #ifdef STARPU_USE_SC_HYPERVISOR starpu_sched_ctx_call_pushed_task_cb(workerid, task->sched_ctx); #endif //STARPU_USE_SC_HYPERVISOR unsigned i; if (is_basic_worker) { unsigned node = starpu_worker_get_memory_node(workerid); if (_starpu_task_uses_multiformat_handles(task)) { for (i = 0; i < task->cl->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 < task->cl->nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); handle->mf_node = node; } } // if(task->sched_ctx != _starpu_get_initial_sched_ctx()->id) if(task->priority > 0) return _starpu_push_local_task(worker, task, 1); else return _starpu_push_local_task(worker, task, 0); } else { /* This is a combined worker so we create task aliases */ int worker_size = combined_worker->worker_size; int *combined_workerid = combined_worker->combined_workerid; int ret = 0; struct _starpu_job *job = _starpu_get_job_associated_to_task(task); job->task_size = worker_size; job->combined_workerid = workerid; job->active_task_alias_count = 0; STARPU_PTHREAD_BARRIER_INIT(&job->before_work_barrier, NULL, worker_size); STARPU_PTHREAD_BARRIER_INIT(&job->after_work_barrier, NULL, worker_size); job->after_work_busy_barrier = worker_size; /* Note: we have to call that early, or else the task may have * disappeared already */ starpu_push_task_end(task); int j; for (j = 0; j < worker_size; j++) { struct starpu_task *alias = starpu_task_dup(task); alias->destroy = 1; worker = _starpu_get_worker_struct(combined_workerid[j]); ret |= _starpu_push_local_task(worker, alias, 0); } return ret; } } /* the generic interface that call the proper underlying implementation */ int _starpu_push_task(struct _starpu_job *j) { if(j->task->prologue_callback_func) j->task->prologue_callback_func(j->task->prologue_callback_arg); struct starpu_task *task = j->task; struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); unsigned nworkers = 0; int ret; _STARPU_LOG_IN(); _starpu_increment_nready_tasks_of_sched_ctx(task->sched_ctx, task->flops); task->status = STARPU_TASK_READY; #ifdef HAVE_AYUDAME_H if (AYU_event) { intptr_t id = -1; AYU_event(AYU_ADDTASKTOQUEUE, j->job_id, &id); } #endif /* if the context does not have any workers save the tasks in a temp list */ if(!sched_ctx->is_initial_sched) { /*if there are workers in the ctx that are not able to execute tasks we consider the ctx empty */ nworkers = _starpu_nworkers_able_to_execute_task(task, sched_ctx); if(nworkers == 0) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); starpu_task_list_push_front(&sched_ctx->empty_ctx_tasks, task); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); #ifdef STARPU_USE_SC_HYPERVISOR if(sched_ctx != NULL && 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; } } /* in case there is no codelet associated to the task (that's a control * task), we directly execute its callback and enforce the * corresponding dependencies */ if (task->cl == NULL || task->cl->where == STARPU_NOWHERE) { _starpu_handle_job_termination(j); _STARPU_LOG_OUT_TAG("handle_job_termination"); return 0; } ret = _starpu_push_task_to_workers(task); if (ret == -EAGAIN) /* pushed to empty context, that's fine */ ret = 0; return ret; } int _starpu_push_task_to_workers(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); unsigned nworkers = 0; _STARPU_TRACE_JOB_PUSH(task, task->priority > 0); /* if the contexts still does not have workers put the task back to its place in the empty ctx list */ if(!sched_ctx->is_initial_sched) { /*if there are workers in the ctx that are not able to execute tasks we consider the ctx empty */ nworkers = _starpu_nworkers_able_to_execute_task(task, sched_ctx); if (nworkers == 0) { STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); starpu_task_list_push_back(&sched_ctx->empty_ctx_tasks, task); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); #ifdef STARPU_USE_SC_HYPERVISOR if(sched_ctx != NULL && 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; if (STARPU_UNLIKELY(task->execute_on_a_specific_worker)) { unsigned node = starpu_worker_get_memory_node(task->workerid); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_on_node(task, node); ret = _starpu_push_task_on_specific_worker(task, task->workerid); } else { struct _starpu_machine_config *config = _starpu_get_machine_config(); /* When a task can only be executed on a given arch and we have * only one memory node for that arch, we can systematically * prefetch before the scheduling decision. */ if (starpu_get_prefetch_flag()) { if (task->cl->where == STARPU_CPU && config->cpus_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->cpus_nodeid); else if (task->cl->where == STARPU_CUDA && config->cuda_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->cuda_nodeid); else if (task->cl->where == STARPU_OPENCL && config->opencl_nodeid >= 0) starpu_prefetch_task_input_on_node(task, config->opencl_nodeid); } STARPU_ASSERT(sched_ctx->sched_policy->push_task); /* check out if there are any workers in the context */ starpu_pthread_rwlock_t *changing_ctx_mutex = _starpu_sched_ctx_get_changing_ctx_mutex(sched_ctx->id); STARPU_PTHREAD_RWLOCK_RDLOCK(changing_ctx_mutex); nworkers = starpu_sched_ctx_get_nworkers(sched_ctx->id); if (nworkers == 0) ret = -1; else { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; ret = sched_ctx->sched_policy->push_task(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } STARPU_PTHREAD_RWLOCK_UNLOCK(changing_ctx_mutex); if(ret == -1) { fprintf(stderr, "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_TRACE_JOB_POP(task, task->priority > 0); _starpu_profiling_set_task_push_end_time(task); task->scheduled = 1; 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_SIMGRID) struct starpu_multiformat_interface *format_interface; #endif conversion_task = starpu_task_create(); conversion_task->synchronous = 0; STARPU_TASK_SET_HANDLE(conversion_task, handle, 0); #if defined(STARPU_USE_OPENCL) || defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) /* The node does not really matter here */ format_interface = (struct starpu_multiformat_interface *) starpu_data_get_interface_on_node(handle, 0); #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 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 default: STARPU_ABORT(); } STARPU_CODELET_SET_MODE(conversion_task->cl, STARPU_RW, 0); return conversion_task; } static struct _starpu_sched_ctx* _get_next_sched_ctx_to_pop_into(struct _starpu_worker *worker) { struct _starpu_sched_ctx_list *l = NULL; if(!worker->reverse_phase) { /* find a context in which the worker hasn't poped yet */ for (l = worker->sched_ctx_list; l; l = l->next) { if(!worker->poped_in_ctx[l->sched_ctx]) { worker->poped_in_ctx[l->sched_ctx] = !worker->poped_in_ctx[l->sched_ctx]; return _starpu_get_sched_ctx_struct(l->sched_ctx); } } worker->reverse_phase = !worker->reverse_phase; } if(worker->reverse_phase) { /* if the context has already poped in every one start from the begining */ for (l = worker->sched_ctx_list; l; l = l->next) { if(worker->poped_in_ctx[l->sched_ctx]) { worker->poped_in_ctx[l->sched_ctx] = !worker->poped_in_ctx[l->sched_ctx]; return _starpu_get_sched_ctx_struct(l->sched_ctx); } } worker->reverse_phase = !worker->reverse_phase; } worker->poped_in_ctx[worker->sched_ctx_list->sched_ctx] = !worker->poped_in_ctx[worker->sched_ctx_list->sched_ctx]; return _starpu_get_sched_ctx_struct(worker->sched_ctx_list->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); /* get tasks from the stacks of the strategy */ if(!task) { struct _starpu_sched_ctx *sched_ctx ; #ifndef STARPU_NON_BLOCKING_DRIVERS int been_here[STARPU_NMAX_SCHED_CTXS]; int i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) been_here[i] = 0; while(!task) #endif { if(worker->nsched_ctxs == 1) sched_ctx = _starpu_get_initial_sched_ctx(); else { while(1) { sched_ctx = _get_next_sched_ctx_to_pop_into(worker); if(worker->removed_from_ctx[sched_ctx->id] == 1 && worker->shares_tasks_lists[sched_ctx->id] == 1) { _starpu_worker_gets_out_of_ctx(sched_ctx->id, worker); worker->removed_from_ctx[sched_ctx->id] = 0; sched_ctx = NULL; } else break; } } if(sched_ctx && sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { if (sched_ctx->sched_policy && sched_ctx->sched_policy->pop_task) { task = sched_ctx->sched_policy->pop_task(sched_ctx->id); } } if(!task) { /* 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 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) return NULL; #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; worker_id = starpu_worker_get_id(); if (!starpu_worker_can_execute_task(worker_id, task, 0)) return task; node = starpu_worker_get_memory_node(worker_id); /* * We do have a task that uses multiformat handles. Let's create the * required conversion tasks. */ STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); unsigned i; for (i = 0; i < task->cl->nbuffers; i++) { struct starpu_task *conversion_task; starpu_data_handle_t handle; handle = STARPU_TASK_GET_HANDLE(task, i); if (!_starpu_handle_needs_conversion_task(handle, node)) continue; conversion_task = _starpu_create_conversion_task(handle, node); conversion_task->mf_skip = 1; conversion_task->execute_on_a_specific_worker = 1; conversion_task->workerid = worker_id; /* * Next tasks will need to know where these handles have gone. */ handle->mf_node = node; _starpu_task_submit_conversion_task(conversion_task, worker_id); } task->mf_skip = 1; starpu_task_list_push_back(&worker->local_tasks, task); STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); goto pick; profiling: if (profiling) { struct starpu_profiling_task_info *profiling_info; profiling_info = task->profiling_info; /* The task may have been created before profiling was enabled, * so we check if the profiling_info structure is available * even though we already tested if profiling is enabled. */ if (profiling_info) { memcpy(&profiling_info->pop_start_time, &pop_start_time, sizeof(struct timespec)); _starpu_clock_gettime(&profiling_info->pop_end_time); } } return task; } struct starpu_task *_starpu_pop_every_task(struct _starpu_sched_ctx *sched_ctx) { struct starpu_task *task = NULL; STARPU_ASSERT(sched_ctx->sched_policy->pop_every_task); /* TODO set profiling info */ if(sched_ctx->sched_policy->pop_every_task) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; task = sched_ctx->sched_policy->pop_every_task(sched_ctx->id); _STARPU_TRACE_WORKER_SCHEDULING_POP; } return task; } void _starpu_sched_pre_exec_hook(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); if (sched_ctx->sched_policy->pre_exec_hook) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->pre_exec_hook(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } void _starpu_sched_post_exec_hook(struct starpu_task *task) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(task->sched_ctx); if (sched_ctx->sched_policy->post_exec_hook) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->post_exec_hook(task); _STARPU_TRACE_WORKER_SCHEDULING_POP; } } void _starpu_wait_on_sched_event(void) { struct _starpu_worker *worker = _starpu_get_local_worker_key(); STARPU_PTHREAD_MUTEX_LOCK(&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(&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); } starpu-1.1.5/src/core/jobs.h0000644000373600000000000002001112571536573012603 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique * 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 __JOBS_H__ #define __JOBS_H__ #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_USE_CUDA #include #endif struct _starpu_worker; /* codelet function */ typedef void (*_starpu_cl_func_t)(void **, void *); #define _STARPU_CPU_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_CPU) #define _STARPU_CUDA_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_CUDA) #define _STARPU_OPENCL_MAY_PERFORM(j) ((j)->task->cl->where & STARPU_OPENCL) struct _starpu_data_descr { starpu_data_handle_t handle; enum starpu_data_access_mode mode; int node; }; /* A job is the internal representation of a task. */ LIST_TYPE(_starpu_job, /* Each job is attributed a unique id. */ unsigned long job_id; /* The task associated to that job */ struct starpu_task *task; /* These synchronization structures are used to wait for the job to be * available or terminated for instance. */ starpu_pthread_mutex_t sync_mutex; starpu_pthread_cond_t sync_cond; /* To avoid deadlocks, we reorder the different buffers accessed to by * the task so that we always grab the rw-lock associated to the * handles in the same order. */ struct _starpu_data_descr ordered_buffers[STARPU_NMAXBUFS]; struct _starpu_task_wrapper_dlist dep_slots[STARPU_NMAXBUFS]; struct _starpu_data_descr *dyn_ordered_buffers; struct _starpu_task_wrapper_dlist *dyn_dep_slots; /* If a tag is associated to the job, this points to the internal data * structure that describes the tag status. */ struct _starpu_tag *tag; /* Maintain a list of all the completion groups that depend on the job. * */ struct _starpu_cg_list job_successors; /* For tasks with cl==NULL but submitted with explicit data dependency, * the handle for this dependency, so as to remove the task from the * last_writer/readers */ starpu_data_handle_t implicit_dep_handle; struct _starpu_task_wrapper_dlist implicit_dep_slot; /* Indicates whether the task associated to that job has already been * submitted to StarPU (1) or not (0) (using starpu_task_submit). * Becomes and stays 2 when the task is submitted several times. * * Protected by j->sync_mutex. */ unsigned submitted:2; /* Indicates whether the task associated to this job is terminated or * not. * * Protected by j->sync_mutex. */ unsigned terminated:2; /* The value of the footprint that identifies the job may be stored in * this structure. */ uint32_t footprint; unsigned footprint_is_computed:1; /* Should that task appear in the debug tools ? (eg. the DAG generated * with dot) */ unsigned exclude_from_dag:1; /* Is that task internal to StarPU ? */ unsigned internal:1; /* During the reduction of a handle, StarPU may have to submit tasks to * perform the reduction itself: those task should not be stalled while * other tasks are blocked until the handle has been properly reduced, * so we need a flag to differentiate them from "normal" tasks. */ unsigned reduction_task:1; /* The implementation associated to the job */ unsigned nimpl; /* Number of workers executing that task (>1 if the task is parallel) * */ int task_size; /* In case we have assigned this job to a combined workerid */ int combined_workerid; /* How many workers are currently running an alias of that job (for * parallel tasks only). */ int active_task_alias_count; /* A symbol name may be associated to the job directly for debug * purposes (for instance if the codelet is NULL). */ const char *model_name; 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; ) /* Create an internal struct _starpu_job *structure to encapsulate the task. */ struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_task *task); /* Destroy the data structure associated to the job structure */ void _starpu_job_destroy(struct _starpu_job *j); /* Wait for the termination of the job */ void _starpu_wait_job(struct _starpu_job *j); /* 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); /* 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, enum starpu_perfmodel_archtype arch, unsigned nimpl, struct _starpu_job *j); /* Get a task from the local pool of tasks that were explicitly attributed to * that worker. */ struct starpu_task *_starpu_pop_local_task(struct _starpu_worker *worker); /* Put a task into the pool of tasks that are explicitly attributed to the * specified worker. If "back" is set, the task is put at the back of the list. * Considering the tasks are popped from the back, this value should be 0 to * enforce a FIFO ordering. */ int _starpu_push_local_task(struct _starpu_worker *worker, struct starpu_task *task, int prio); #define _STARPU_JOB_GET_ORDERED_BUFFER_HANDLE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].handle : job->ordered_buffers[i].handle) #define _STARPU_JOB_GET_ORDERED_BUFFER_MODE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].mode : job->ordered_buffers[i].mode) #define _STARPU_JOB_GET_ORDERED_BUFFER_NODE(job, i) ((job->dyn_ordered_buffers) ? job->dyn_ordered_buffers[i].node : job->ordered_buffers[i].node) #define _STARPU_JOB_SET_ORDERED_BUFFER_HANDLE(job, handle, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].handle = (handle); else job->ordered_buffers[i].handle = (handle);} while(0) #define _STARPU_JOB_SET_ORDERED_BUFFER_MODE(job, __mode, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].mode = __mode; else job->ordered_buffers[i].mode = __mode;} while(0) #define _STARPU_JOB_SET_ORDERED_BUFFER_NODE(job, __node, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i].node = __node; else job->ordered_buffers[i].node = __node;} while(0) #define _STARPU_JOB_SET_ORDERED_BUFFER(job, buffer, i) do { if (job->dyn_ordered_buffers) job->dyn_ordered_buffers[i] = buffer; else job->ordered_buffers[i] = buffer;} while(0) #define _STARPU_JOB_GET_ORDERED_BUFFERS(job) (job->dyn_ordered_buffers) ? job->dyn_ordered_buffers : job->ordered_buffers #define _STARPU_JOB_GET_DEP_SLOTS(job) (((job)->dyn_dep_slots) ? (job)->dyn_dep_slots : (job)->dep_slots) #endif // __JOBS_H__ starpu-1.1.5/src/core/parallel_task.c0000644000373600000000000000423312571536573014467 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include struct starpu_task *starpu_task_dup(struct starpu_task *task) { struct starpu_task *task_dup = (struct starpu_task *) malloc(sizeof(struct starpu_task)); STARPU_ASSERT(task_dup); /* 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.1.5/src/core/debug.h0000644000373600000000000000266512571536573012753 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DEBUG_H__ #define __DEBUG_H__ #include #include #include #include #include #ifdef HAVE_AYUDAME_H #include #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, ...); /* Tell gdb whether FXT is compiled in or not */ extern int _starpu_use_fxt; /* Get an Ayudame id for CL */ int64_t _starpu_ayudame_get_func_id(struct starpu_codelet *cl); void _starpu_watchdog_init(void); void _starpu_watchdog_shutdown(void); #endif // __DEBUG_H__ starpu-1.1.5/src/core/combined_workers.h0000644000373600000000000000143512571536573015213 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __COMBINED_WORKERS_H__ #define __COMBINED_WORKERS_H__ #include #include #endif // __COMBINED_WORKERS_H__ starpu-1.1.5/src/core/progress_hook.c0000644000373600000000000000565712571536573014550 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2013 Université de Bordeaux * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty 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.1.5/src/core/task.c0000644000373600000000000007664512571536573012633 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_WINDOWS #include #endif #include /* 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; /* 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"); } void _starpu_task_deinit(void) { STARPU_PTHREAD_KEY_DELETE(current_task_key); } void starpu_task_init(struct starpu_task *task) { /* TODO: memcpy from a template instead? benchmark it */ STARPU_ASSERT(task); /* As most of the fields must be initialised at NULL, let's put 0 * everywhere */ memset(task, 0, sizeof(struct starpu_task)); task->sequential_consistency = 1; /* Now we can initialise fields which recquire custom value */ #if STARPU_DEFAULT_PRIO != 0 task->priority = STARPU_DEFAULT_PRIO; #endif task->detach = 1; #if STARPU_TASK_INVALID != 0 task->status = STARPU_TASK_INVALID; #endif task->predicted = NAN; task->predicted_transfer = NAN; task->magic = 42; task->sched_ctx = STARPU_NMAX_SCHED_CTXS; task->flops = 0.0; task->scheduled = 0; task->dyn_handles = NULL; task->dyn_interfaces = NULL; } /* Free all the ressources allocated for a task, without deallocating the task * structure itself (this is required for statically allocated tasks). * All values previously set by the user, like codelet and handles, remain * unchanged */ void starpu_task_clean(struct starpu_task *task) { STARPU_ASSERT(task); /* 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; } 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; task = (struct starpu_task *) malloc(sizeof(struct starpu_task)); STARPU_ASSERT(task); starpu_task_init(task); /* Dynamically allocated tasks are destroyed by default */ task->destroy = 1; return task; } /* Free the ressource allocated during starpu_task_create. This function can be * called automatically after the execution of a task by setting the "destroy" * flag of the starpu_task structure (default behaviour). Calling this function * on a statically allocated task results in an undefined behaviour. */ void _starpu_task_destroy(struct starpu_task *task) { /* If starpu_task_destroy is called in a callback, we just set the destroy flag. The task will be destroyed after the callback returns */ if (task == starpu_task_get_current() && _starpu_get_local_worker_status() == STATUS_CALLBACK) { task->destroy = 1; } else { starpu_task_clean(task); /* TODO handle the case of task with detach = 1 and destroy = 1 */ /* TODO handle the case of non terminated tasks -> return -EINVAL */ /* Does user want StarPU release cl_arg ? */ if (task->cl_arg_free) free(task->cl_arg); /* Does user want StarPU release callback_arg ? */ if (task->callback_arg_free) free(task->callback_arg); /* Does user want StarPU release prologue_callback_arg ? */ if (task->prologue_callback_arg_free) free(task->prologue_callback_arg); 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_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 asynchronous. Waiting returns immediately\n"); _STARPU_LOG_OUT_TAG("einval"); return -EINVAL; } STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait must not be called from a task or callback"); struct _starpu_job *j = (struct _starpu_job *)task->starpu_private; _starpu_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_LOG_OUT(); return 0; } struct _starpu_job *_starpu_get_job_associated_to_task(struct starpu_task *task) { STARPU_ASSERT(task); if (!task->starpu_private) { struct _starpu_job *j = _starpu_job_create(task); task->starpu_private = j; } return (struct _starpu_job *)task->starpu_private; } /* 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; _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); #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) { _starpu_compute_buffers_footprint(j->task->cl->model, STARPU_CPU_DEFAULT, 0, j); int i; size_t data_size = 0; if (j->task->cl) for(i = 0; i < j->task->cl->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) { unsigned i; for (i=0; icl->nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); } } STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); /* 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; int 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; int is_where_unset = cl->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) { cl->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) { cl->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) { cl->where |= STARPU_OPENCL; } } void _starpu_task_check_deprecated_fields(struct starpu_task *task) { if (task->cl) { unsigned i; for(i=0; icl->nbuffers, STARPU_NMAXBUFS) ; i++) { if (task->buffers[i].handle && task->handles[i]) { _STARPU_DISP("[warning][struct starpu_task] task->buffers[%u] and task->handles[%u] both set. Ignoring task->buffers[%u] ?\n", i, i, i); STARPU_ASSERT(task->buffers[i].mode == task->cl->modes[i]); STARPU_ABORT(); } if (task->buffers[i].handle) { task->handles[i] = task->buffers[i].handle; task->cl->modes[i] = task->buffers[i].mode; } } } } /* 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 == 42, "Tasks must be created with starpu_task_create, or initialized with starpu_task_init."); int ret; unsigned is_sync = task->synchronous; starpu_task_bundle_t bundle = task->bundle; /* internally, StarPU manipulates a struct _starpu_job * which is a wrapper around a * task structure, it is possible that this job structure was already * allocated. */ struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (!j->internal) { int nsubmitted_tasks = starpu_task_nsubmitted(); if (limit_max_submitted_tasks >= 0 && limit_max_submitted_tasks < nsubmitted_tasks && limit_min_submitted_tasks >= 0 && limit_min_submitted_tasks < nsubmitted_tasks) starpu_task_wait_for_n_submitted(limit_min_submitted_tasks); } if (j->internal) { // Internal tasks are submitted to initial context task->sched_ctx = _starpu_get_initial_sched_ctx()->id; } else if (task->sched_ctx == STARPU_NMAX_SCHED_CTXS) { // If the task has not specified a context, we set the current context task->sched_ctx = _starpu_sched_ctx_get_current_context(); } if (is_sync) { /* Perhaps it is not possible to submit a synchronous * (blocking) task */ STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "submitting a synchronous task must not be done from a task or a callback"); task->detach = 0; } _starpu_task_check_deprecated_fields(task); _starpu_codelet_check_deprecated_fields(task->cl); if (task->cl) { unsigned i; _STARPU_TRACE_UPDATE_TASK_CNT(0); /* Check buffers */ if (task->dyn_handles == NULL) STARPU_ASSERT_MSG(task->cl->nbuffers <= 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, task->cl->nbuffers, STARPU_NMAXBUFS); if (task->dyn_handles) { task->dyn_interfaces = malloc(task->cl->nbuffers * sizeof(void *)); } for (i = 0; i < task->cl->nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); /* Make sure handles are not partitioned */ STARPU_ASSERT_MSG(handle->nchildren == 0, "only unpartitioned data (or the pieces of a partitioned data) can be used in a task"); /* Provide the home interface for now if any, * for can_execute hooks */ if (handle->home_node != -1) _STARPU_TASK_SET_INTERFACE(task, starpu_data_get_interface_on_node(handle, handle->home_node), i); } /* Check the type of worker(s) required by the task exist */ if (!_starpu_worker_exists(task)) { _STARPU_LOG_OUT_TAG("ENODEV"); return -ENODEV; } /* In case we require that a task should be explicitely * executed on a specific worker, we make sure that the worker * is able to execute this task. */ if (task->execute_on_a_specific_worker && !starpu_combined_worker_can_execute_task(task->workerid, task, 0)) { _STARPU_LOG_OUT_TAG("ENODEV"); return -ENODEV; } _starpu_detect_implicit_data_deps(task); if (task->cl->model && task->cl->model->symbol) _starpu_load_perfmodel(task->cl->model); } 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 && entry->task->cl->model->symbol) _starpu_load_perfmodel(entry->task->cl->model); if (entry->task->cl->power_model && entry->task->cl->power_model->symbol) _starpu_load_perfmodel(entry->task->cl->power_model); entry = entry->next; } STARPU_PTHREAD_MUTEX_UNLOCK(&bundle->mutex); } /* If profiling is activated, we allocate a structure to store the * appropriate info. */ struct starpu_profiling_task_info *info; int profiling = starpu_profiling_status_get(); info = _starpu_allocate_profiling_info_if_needed(task); task->profiling_info = info; /* The task is considered as block until we are sure there remains not * dependency. */ task->status = STARPU_TASK_BLOCKED; if (profiling) _starpu_clock_gettime(&info->submit_time); ret = _starpu_submit_job(j); if (is_sync) { _starpu_wait_job(j); if (task->destroy) _starpu_task_destroy(task); } _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) { _starpu_task_check_deprecated_fields(task); _starpu_codelet_check_deprecated_fields(task->cl); if (task->cl) { if (task->cl->model) _starpu_load_perfmodel(task->cl->model); if (task->cl->power_model) _starpu_load_perfmodel(task->cl->power_model); } struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (j->internal) { // Internal tasks are submitted to initial context j->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 j->task->sched_ctx = _starpu_sched_ctx_get_current_context(); } _starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx); STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); j->submitted = 1; if (task->cl) { /* This would be done by data dependencies checking */ unsigned i; for (i=0 ; icl->nbuffers ; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(j->task, i); _STARPU_JOB_SET_ORDERED_BUFFER_HANDLE(j, handle, i); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(j->task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_MODE(j, mode, i); int node = -1; if (j->task->cl->specific_nodes) node = STARPU_CODELET_GET_NODE(j->task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_NODE(j, node, i); } } 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) { STARPU_ASSERT(task->cl); STARPU_ASSERT(task->execute_on_a_specific_worker); _starpu_task_check_deprecated_fields(task); _starpu_codelet_check_deprecated_fields(task->cl); /* We should factorize that */ if (task->cl->model) _starpu_load_perfmodel(task->cl->model); if (task->cl->power_model) _starpu_load_perfmodel(task->cl->power_model); /* We retain handle reference count */ unsigned i; for (i=0; icl->nbuffers; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(task, i); _starpu_spin_lock(&handle->header_lock); handle->busy_count++; _starpu_spin_unlock(&handle->header_lock); } struct _starpu_job *j = _starpu_get_job_associated_to_task(task); if (j->internal) { // Internal tasks are submitted to initial context j->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 j->task->sched_ctx = _starpu_sched_ctx_get_current_context(); } _starpu_increment_nsubmitted_tasks_of_sched_ctx(j->task->sched_ctx); STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); j->submitted = 1; _starpu_increment_nready_tasks_of_sched_ctx(j->task->sched_ctx, j->task->flops); for (i=0 ; icl->nbuffers ; i++) { starpu_data_handle_t handle = STARPU_TASK_GET_HANDLE(j->task, i); _STARPU_JOB_SET_ORDERED_BUFFER_HANDLE(j, handle, i); enum starpu_data_access_mode mode = STARPU_CODELET_GET_MODE(j->task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_MODE(j, mode, i); int node = -1; if (j->task->cl->specific_nodes) node = STARPU_CODELET_GET_NODE(j->task->cl, i); _STARPU_JOB_SET_ORDERED_BUFFER_NODE(j, node, i); } _STARPU_LOG_IN(); task->status = STARPU_TASK_READY; _starpu_profiling_set_task_push_start_time(task); unsigned node = starpu_worker_get_memory_node(workerid); if (starpu_get_prefetch_flag()) starpu_prefetch_task_input_on_node(task, node); struct _starpu_worker *worker; worker = _starpu_get_worker_struct(workerid); starpu_task_list_push_back(&worker->local_tasks, task); _starpu_profiling_set_task_push_end_time(task); _STARPU_LOG_OUT(); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return 0; } void starpu_codelet_init(struct starpu_codelet *cl) { memset(cl, 0, sizeof(struct starpu_codelet)); } 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[32]; starpu_worker_get_name(worker, name, 32); 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(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"); #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_BARRIER, 0, NULL); #endif struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) starpu_task_wait_for_all_in_ctx(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { starpu_task_wait_for_all_in_ctx(config->sched_ctxs[s].id); } } } return 0; } else { _STARPU_DEBUG("Waiting for tasks submitted to context %u\n", sched_ctx_id); _starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx_id); #ifdef HAVE_AYUDAME_H /* TODO: improve Temanejo into knowing about contexts ... */ if (AYU_event) AYU_event(AYU_BARRIER, 0, NULL); #endif } return 0; } int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx) { _starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx); #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_BARRIER, 0, NULL); #endif 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 = (struct _starpu_machine_config *)_starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) _starpu_wait_for_n_submitted_tasks_of_sched_ctx(0, n); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_wait_for_n_submitted_tasks_of_sched_ctx(config->sched_ctxs[s].id, n); } } } return 0; } else { _STARPU_DEBUG("Waiting for tasks submitted to context %u\n", sched_ctx_id); _starpu_wait_for_n_submitted_tasks_of_sched_ctx(sched_ctx_id, n); } return 0; } int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx, unsigned n) { _starpu_wait_for_n_submitted_tasks_of_sched_ctx(sched_ctx, n); return 0; } /* * We wait until there is no ready task any more (i.e. StarPU will not be able * to progress any more). */ int starpu_task_wait_for_no_ready(void) { STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_no_ready must not be called from a task or callback"); struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) _starpu_wait_for_no_ready_of_sched_ctx(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_wait_for_no_ready_of_sched_ctx(config->sched_ctxs[s].id); } } } return 0; } void starpu_drivers_request_termination(void) { struct _starpu_machine_config *config = _starpu_get_machine_config(); STARPU_PTHREAD_MUTEX_LOCK(&config->submitted_mutex); int nsubmitted = starpu_task_nsubmitted(); config->submitting = 0; if (nsubmitted == 0) { ANNOTATE_HAPPENS_AFTER(&config->running); config->running = 0; ANNOTATE_HAPPENS_BEFORE(&config->running); STARPU_WMB(); int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { _starpu_check_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id); } } } STARPU_PTHREAD_MUTEX_UNLOCK(&config->submitted_mutex); } int starpu_task_nsubmitted(void) { int nsubmitted = 0; struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) nsubmitted = _starpu_get_nsubmitted_tasks_of_sched_ctx(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { nsubmitted += _starpu_get_nsubmitted_tasks_of_sched_ctx(config->sched_ctxs[s].id); } } } return nsubmitted; } int starpu_task_nready(void) { int nready = 0; struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) nready = starpu_sched_ctx_get_nready_tasks(0); else { int s; for(s = 0; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { nready += starpu_sched_ctx_get_nready_tasks(config->sched_ctxs[s].id); } } } return nready; } /* Return the task currently executed by the worker, or NULL if this is called * either from a thread that is not a task or simply because there is no task * being executed at the moment. */ struct starpu_task *starpu_task_get_current(void) { return (struct starpu_task *) STARPU_PTHREAD_GETSPECIFIC(current_task_key); } void _starpu_set_current_task(struct starpu_task *task) { STARPU_PTHREAD_SETSPECIFIC(current_task_key, task); } /* * Returns 0 if tasks does not use any multiformat handle, 1 otherwise. */ int _starpu_task_uses_multiformat_handles(struct starpu_task *task) { unsigned i; for (i = 0; i < task->cl->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: return 1; default: STARPU_ABORT(); } break; case STARPU_CUDA_RAM: /* Fall through */ case STARPU_OPENCL_RAM: switch(starpu_node_get_kind(handle->mf_node)) { case STARPU_CPU_RAM: return 1; case STARPU_CUDA_RAM: case STARPU_OPENCL_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; } void _starpu_sleep(struct timespec ts) { #ifdef STARPU_SIMGRID MSG_process_sleep(ts.tv_sec + ts.tv_nsec / 1000000000.); #elif defined(STARPU_HAVE_WINDOWS) Sleep((ts.tv_sec * 1000) + (ts.tv_nsec / 1000000)); #else struct timespec req, rem; req = ts; while (nanosleep(&req, &rem)) req = rem; #endif } static starpu_pthread_t watchdog_thread; /* Check from times to times that StarPU does finish some tasks */ static void *watchdog_func(void *arg) { struct timespec ts; char *timeout_env = arg; unsigned long long timeout; #ifdef _MSC_VER timeout = (unsigned long long) _atoi64(timeout_env); #else timeout = atoll(timeout_env); #endif ts.tv_sec = timeout / 1000000; ts.tv_nsec = (timeout % 1000000) * 1000; struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); 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); _starpu_sleep(ts); STARPU_PTHREAD_MUTEX_LOCK(&config->submitted_mutex); if (!config->watchdog_ok && last_nsubmitted && last_nsubmitted == starpu_task_nsubmitted()) { fprintf(stderr,"The StarPU watchdog detected that no task finished for %u.%06us (can be configure through STARPU_WATCHDOG_TIMEOUT)\n", (unsigned)ts.tv_sec, (unsigned)ts.tv_nsec/1000); if (watchdog_crash) { fprintf(stderr,"Crashing the process\n"); raise(SIGABRT); } else fprintf(stderr,"Set the STARPU_WATCHDOG_CRASH environment variable if you want to abort the process in such a case\n"); } /* Only shout again after another period */ config->watchdog_ok = 1; } STARPU_PTHREAD_MUTEX_UNLOCK(&config->submitted_mutex); return NULL; } void _starpu_watchdog_init(void) { struct _starpu_machine_config *config = (struct _starpu_machine_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.1.5/src/core/workers.h0000644000373600000000000002775712571536573013372 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2013 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __WORKERS_H__ #define __WORKERS_H__ #include #include #include #include #include #include #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include #endif #include #include #include #include #include /* This is initialized from in _starpu_worker_init */ struct _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 ? */ enum starpu_perfmodel_archtype 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 ? */ int bindid; /* which cpu is the driver bound to ? (logical index) */ int workerid; /* uniquely identify the worker among all processing units types */ int combined_workerid; /* combined worker currently using this worker */ int current_rank; /* current rank in case the worker is used in a parallel fashion */ int worker_size; /* size of the worker in case we use a combined worker */ starpu_pthread_cond_t started_cond; /* indicate when the worker is ready */ starpu_pthread_cond_t ready_cond; /* indicate when the worker is ready */ unsigned memory_node; /* which memory node is the worker associated with ? */ starpu_pthread_cond_t sched_cond; /* condition variable used when the worker waits for tasks. */ starpu_pthread_mutex_t sched_mutex; /* mutex protecting sched_cond */ struct starpu_task_list local_tasks; /* this queue contains tasks that have been explicitely submitted to that queue */ struct starpu_task *current_task; /* task currently executed by this worker */ struct _starpu_worker_set *set; /* in case this worker belongs to a set */ unsigned worker_is_running; unsigned worker_is_initialized; enum _starpu_worker_status status; /* what is the worker doing now ? (eg. CALLBACK) */ char name[64]; char short_name[10]; unsigned run_by_starpu; /* Is this run by StarPU or directly by the application ? */ struct _starpu_sched_ctx_list *sched_ctx_list; 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]; unsigned spinning_backoff ; /* number of cycles to pause when spinning */ /* indicate whether the workers shares tasks lists with other workers*/ /* in this case when removing him from a context it disapears instantly */ unsigned shares_tasks_lists[STARPU_NMAX_SCHED_CTXS]; /* boolean to chose the next ctx a worker will pop into */ unsigned poped_in_ctx[STARPU_NMAX_SCHED_CTXS]; /* boolean indicating at which moment we checked all ctxs and change phase for the booleab poped_in_ctx*/ unsigned reverse_phase; #ifdef __GLIBC__ cpu_set_t initial_cpu_set; cpu_set_t current_cpu_set; #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t initial_hwloc_cpu_set; hwloc_bitmap_t current_hwloc_cpu_set; #endif }; struct _starpu_combined_worker { enum starpu_perfmodel_archtype 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 __GLIBC__ cpu_set_t cpu_set; #endif /* __GLIBC__ */ #ifdef STARPU_HAVE_HWLOC hwloc_bitmap_t hwloc_cpu_set; #endif }; /* in case a single CPU worker may control multiple * accelerators (eg. Gordon for n SPUs) */ struct _starpu_worker_set { starpu_pthread_mutex_t mutex; starpu_pthread_t worker_thread; /* the thread which runs the worker */ unsigned nworkers; unsigned joined; /* only one thread may call pthread_join*/ void *retval; struct _starpu_worker *workers; starpu_pthread_cond_t ready_cond; /* indicate when the set is ready */ unsigned set_is_initialized; }; struct _starpu_machine_topology { /* Total number of workers. */ unsigned nworkers; /* Total number of combined workers. */ unsigned ncombinedworkers; unsigned nsched_ctxs; #ifdef STARPU_HAVE_HWLOC /* Topology as detected by hwloc. */ hwloc_topology_t hwtopology; #else /* We maintain ABI compatibility with and without hwloc */ void *dummy; #endif /* Total number of CPUs, as detected by the topology code. May * be different from the actual number of CPU workers. */ unsigned nhwcpus; /* Total number of 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; /* Actual number of CPU workers used by StarPU. */ unsigned ncpus; /* Actual number of CUDA workers used by StarPU. */ unsigned ncudagpus; /* Actual number of OpenCL workers used by StarPU. */ unsigned nopenclgpus; /* Indicates the successive cpu 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 cpus. */ 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]; }; struct _starpu_machine_config { struct _starpu_machine_topology topology; #ifdef STARPU_HAVE_HWLOC int cpu_depth; #endif /* Where to bind workers ? */ int current_bindid; /* Which GPU(s) do we use for CUDA ? */ int current_cuda_gpuid; /* Which GPU(s) do we use for OpenCL ? */ int current_opencl_gpuid; /* 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; /* 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]; /* 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; /* 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]; /* this flag is set until the application is finished submitting tasks */ unsigned submitting; int watchdog_ok; starpu_pthread_mutex_t submitted_mutex; }; /* 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 ? */ unsigned _starpu_machine_is_running(void); /* 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); /* 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. * */ void _starpu_set_local_worker_key(struct _starpu_worker *worker); /* This function initializes the current thread for the given worker */ void _starpu_worker_start(struct _starpu_worker *worker, unsigned fut_key); /* Returns the _starpu_worker structure that describes the state of the * current worker. */ struct _starpu_worker *_starpu_get_local_worker_key(void); /* Returns the _starpu_worker structure that describes the state of the * specified worker. */ struct _starpu_worker *_starpu_get_worker_struct(unsigned id); /* Returns the starpu_sched_ctx structure that descriebes the state of the * specified ctx */ struct _starpu_sched_ctx *_starpu_get_sched_ctx_struct(unsigned id); struct _starpu_combined_worker *_starpu_get_combined_worker_struct(unsigned id); int _starpu_is_initialized(void); /* Returns the structure that describes the overall machine configuration (eg. * all workers and topology). */ struct _starpu_machine_config *_starpu_get_machine_config(void); /* Return whether kernels should be run (<=0) or not (>0) */ int _starpu_get_disable_kernels(void); /* Retrieve the status which indicates what the worker is currently doing. */ enum _starpu_worker_status _starpu_worker_get_status(int workerid); /* Change the status of the worker which indicates what the worker is currently * doing (eg. executing a callback). */ void _starpu_worker_set_status(int workerid, enum _starpu_worker_status status); /* We keep an initial sched ctx which might be used in case no other ctx is available */ struct _starpu_sched_ctx* _starpu_get_initial_sched_ctx(void); 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); #endif // __WORKERS_H__ starpu-1.1.5/src/core/sched_policy.h0000644000373600000000000000547212571536573014331 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_POLICY_H__ #define __SCHED_POLICY_H__ #include #include #include #include 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); int _starpu_push_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); void _starpu_wait_on_sched_event(void); struct starpu_task *_starpu_create_conversion_task(starpu_data_handle_t handle, unsigned int node); struct starpu_task *_starpu_create_conversion_task_for_arch(starpu_data_handle_t handle, enum starpu_node_kind node_kind); void _starpu_sched_pre_exec_hook(struct starpu_task *task); /* * Predefined policies */ 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; #endif // __SCHED_POLICY_H__ starpu-1.1.5/src/core/sched_ctx.h0000644000373600000000000001547212571536573013631 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SCHED_CONTEXT_H__ #define __SCHED_CONTEXT_H__ #include #include #include #include #include #include #include #include "sched_ctx_list.h" #define NO_RESIZE -1 #define REQ_RESIZE 0 #define DO_RESIZE 1 #define STARPU_GLOBAL_SCHED_CTX 0 struct _starpu_sched_ctx { /* id of the context used in user mode*/ unsigned id; /* name of context */ const char *name; /* policy of the context */ struct starpu_sched_policy *sched_policy; /* data necessary for the policy */ void *policy_data; struct starpu_worker_collection *workers; /* we keep an initial sched which we never delete */ unsigned is_initial_sched; /* wait for the tasks submitted to the context to be executed */ struct _starpu_barrier_counter tasks_barrier; /* wait for the tasks ready of the context to be executed */ struct _starpu_barrier_counter ready_tasks_barrier; /* amount of ready flops in a context */ double ready_flops; /* cond to block push when there are no workers in the ctx */ starpu_pthread_cond_t no_workers_cond; /* mutex to block push when there are no workers in the ctx */ starpu_pthread_mutex_t no_workers_mutex; /*ready tasks that couldn't be pushed because the ctx has no workers*/ struct starpu_task_list empty_ctx_tasks; /* mutext protecting empty_ctx_tasks list */ starpu_pthread_mutex_t empty_ctx_mutex; /* 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; #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 void (*close_callback)(unsigned sched_ctx_id, void* args); void *close_args; }; 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); /* 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); void _starpu_increment_nready_tasks_of_sched_ctx(unsigned sched_ctx_id, double ready_flops); 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 total number of sched_ctxs created till now */ unsigned _starpu_get_nsched_ctxs(); /* Get the mutex corresponding to the global workerid */ starpu_pthread_mutex_t *_starpu_get_sched_mutex(struct _starpu_sched_ctx *sched_ctx, int worker); /* Get workers belonging to a certain context, it returns the number of workers take care: no mutex taken, the list of workers might not be updated */ int starpu_get_workers_of_sched_ctx(unsigned sched_ctx_id, int *pus, enum starpu_worker_archtype arch); /* Let the worker know it does not belong to the context and that it should stop poping from it */ void _starpu_worker_gets_out_of_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker); /* Check if the worker belongs to another sched_ctx */ unsigned _starpu_worker_belongs_to_a_sched_ctx(int workerid, unsigned sched_ctx_id); /* mutex synchronising several simultaneous modifications of a context */ starpu_pthread_rwlock_t* _starpu_sched_ctx_get_changing_ctx_mutex(unsigned sched_ctx_id); /* indicates wheather this worker should go to sleep or not (if it is the last one awake in a context he should better keep awake) */ unsigned _starpu_sched_ctx_last_worker_awake(struct _starpu_worker *worker); /*rebind each thread on its cpu after finishing a parallel code */ void _starpu_sched_ctx_rebind_thread_to_its_cpu(unsigned cpuid); /* let the appl know that the worker blocked to execute parallel code */ void _starpu_sched_ctx_signal_worker_blocked(int workerid); /* If starpu_sched_ctx_set_context() has been called, returns the context * id set by its last call, or the id of the initial context */ unsigned _starpu_sched_ctx_get_current_context(); /* verify how many workers can execute a certain task */ int _starpu_nworkers_able_to_execute_task(struct starpu_task *task, struct _starpu_sched_ctx *sched_ctx); unsigned _starpu_sched_ctx_allow_hypervisor(unsigned sched_ctx_id); #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 #endif // __SCHED_CONTEXT_H__ starpu-1.1.5/src/core/simgrid.c0000644000373600000000000003067012571536573013313 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #ifdef STARPU_SIMGRID #include #pragma weak starpu_main extern int starpu_main(int argc, char *argv[]); struct main_args { int argc; char **argv; }; int do_starpu_main(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) { struct main_args *args = MSG_process_get_data(MSG_process_self()); return starpu_main(args->argc, args->argv); } int _starpu_simgrid_get_nbhosts(const char *prefix) { int ret; xbt_dynar_t hosts = MSG_hosts_as_dynar(); unsigned i, nb = xbt_dynar_length(hosts); unsigned len = strlen(prefix); ret = 0; for (i = 0; i < nb; i++) { const char *name; name = MSG_host_get_name(xbt_dynar_get_as(hosts, i, msg_host_t)); if (!strncmp(name, prefix, len)) ret++; } xbt_dynar_free(&hosts); return ret; } unsigned long long _starpu_simgrid_get_memsize(const char *prefix, unsigned devid) { char name[16]; msg_host_t host; const char *memsize; snprintf(name, sizeof(name), "%s%u", prefix, devid); host = MSG_get_host_by_name(name); if (!host) return 0; if (!MSG_host_get_properties(host)) return 0; memsize = MSG_host_get_property_value(host, "memsize"); if (!memsize) return 0; return atoll(memsize); } msg_host_t _starpu_simgrid_get_host_by_worker(struct _starpu_worker *worker) { char *prefix; char name[16]; msg_host_t host; switch (worker->arch) { case STARPU_CPU_WORKER: prefix = "CPU"; break; case STARPU_CUDA_WORKER: prefix = "CUDA"; break; case STARPU_OPENCL_WORKER: prefix = "OpenCL"; break; default: STARPU_ASSERT(0); } snprintf(name, sizeof(name), "%s%d", prefix, worker->devid); host = MSG_get_host_by_name(name); STARPU_ASSERT_MSG(host, "Could not find host %s!", name); return host; } #ifdef STARPU_DEVEL #warning TODO: use another way to start main, when simgrid provides it, and then include the application-provided configuration for platform numbers #endif #undef main int main(int argc, char **argv) { xbt_dynar_t hosts; int i; char path[256]; if (!starpu_main) { _STARPU_ERROR("In simgrid mode, the file containing the main() function of this application needs to be compiled with starpu.h included, to properly rename it into starpu_main\n"); exit(EXIT_FAILURE); } MSG_init(&argc, argv); #if SIMGRID_VERSION_MAJOR < 3 || (SIMGRID_VERSION_MAJOR == 3 && SIMGRID_VERSION_MINOR < 9) /* Versions earlier than 3.9 didn't support our communication tasks */ MSG_config("workstation/model", "ptask_L07"); #endif /* Simgrid uses tiny stacks by default. This comes unexpected to our users. */ extern xbt_cfg_t _sg_cfg_set; unsigned stack_size = 8192; struct rlimit rlim; if (getrlimit(RLIMIT_STACK, &rlim) == 0 && rlim.rlim_cur != 0 && rlim.rlim_cur != RLIM_INFINITY) stack_size = rlim.rlim_cur / 1024; xbt_cfg_set_int(_sg_cfg_set, "contexts/stack_size", stack_size); /* Load XML platform */ _starpu_simgrid_get_platform_path(path, sizeof(path)); MSG_create_environment(path); hosts = MSG_hosts_as_dynar(); int nb = xbt_dynar_length(hosts); for (i = 0; i < nb; i++) MSG_host_set_data(xbt_dynar_get_as(hosts, i, msg_host_t), calloc(MAX_TSD, sizeof(void*))); struct main_args args = { .argc = argc, .argv = argv }; MSG_process_create("main", &do_starpu_main, &args, xbt_dynar_get_as(hosts, 0, msg_host_t)); xbt_dynar_free(&hosts); MSG_main(); return 0; } void _starpu_simgrid_init() { if (!starpu_main) { _STARPU_ERROR("In simgrid mode, the file containing the main() function of this application needs to be compiled with starpu.h included, to properly rename it into starpu_main\n"); exit(EXIT_FAILURE); } } /* Task execution submitted by StarPU */ void _starpu_simgrid_execute_job(struct _starpu_job *j, enum starpu_perfmodel_archtype perf_arch, double length) { struct starpu_task *task = j->task; msg_task_t simgrid_task; if (j->internal) /* This is not useful to include in simulation (and probably * doesn't have a perfmodel anyway) */ return; if (isnan(length)) { length = starpu_task_expected_length(task, perf_arch, j->nimpl); STARPU_ASSERT_MSG(!_STARPU_IS_ZERO(length) && !isnan(length), "Codelet %s does not have a perfmodel, or is not calibrated enough, please re-run in non-simgrid mode until it is calibrated", _starpu_job_get_model_name(j)); } simgrid_task = MSG_task_create(_starpu_job_get_model_name(j), length/1000000.0*MSG_get_host_speed(MSG_host_self()), 0, NULL); MSG_task_execute(simgrid_task); MSG_task_destroy(simgrid_task); } /* Note: simgrid is not parallel, so there is no need to hold locks for management of transfers. */ LIST_TYPE(transfer, msg_task_t task; int src_node; int dst_node; int run_node; /* communication termination signalization */ unsigned *finished; starpu_pthread_mutex_t *mutex; starpu_pthread_cond_t *cond; /* transfers which wait for this transfer */ struct transfer **wake; unsigned nwake; /* Number of transfers that this transfer waits for */ unsigned nwait; ) struct transfer_list pending; /* Tell for two transfers whether they should be handled in sequence */ static int transfers_are_sequential(struct transfer *new_transfer, struct transfer *old_transfer) { int new_is_cuda STARPU_ATTRIBUTE_UNUSED, old_is_cuda STARPU_ATTRIBUTE_UNUSED; int new_is_opencl STARPU_ATTRIBUTE_UNUSED, old_is_opencl STARPU_ATTRIBUTE_UNUSED; int new_is_gpu_gpu, old_is_gpu_gpu; new_is_cuda = starpu_node_get_kind(new_transfer->src_node) == STARPU_CUDA_RAM; new_is_cuda |= starpu_node_get_kind(new_transfer->dst_node) == STARPU_CUDA_RAM; old_is_cuda = starpu_node_get_kind(old_transfer->src_node) == STARPU_CUDA_RAM; old_is_cuda |= starpu_node_get_kind(old_transfer->dst_node) == STARPU_CUDA_RAM; new_is_opencl = starpu_node_get_kind(new_transfer->src_node) == STARPU_OPENCL_RAM; new_is_opencl |= starpu_node_get_kind(new_transfer->dst_node) == STARPU_OPENCL_RAM; old_is_opencl = starpu_node_get_kind(old_transfer->src_node) == STARPU_OPENCL_RAM; old_is_opencl |= starpu_node_get_kind(old_transfer->dst_node) == STARPU_OPENCL_RAM; new_is_gpu_gpu = new_transfer->src_node && new_transfer->dst_node; old_is_gpu_gpu = old_transfer->src_node && old_transfer->dst_node; /* We ignore cuda-opencl transfers, they can not happen */ STARPU_ASSERT(!((new_is_cuda && old_is_opencl) || (old_is_cuda && new_is_opencl))); /* The following constraints have been observed with CUDA alone */ /* Same source/destination, sequential */ if (new_transfer->src_node == old_transfer->src_node && new_transfer->dst_node == old_transfer->dst_node) return 1; /* Crossed GPU-GPU, sequential */ if (new_is_gpu_gpu && new_transfer->src_node == old_transfer->dst_node && old_transfer->src_node == new_transfer->dst_node) return 1; /* GPU-GPU transfers are sequential with any RAM->GPU transfer */ if (new_is_gpu_gpu && old_transfer->dst_node == new_transfer->src_node && old_transfer->dst_node == new_transfer->dst_node) return 1; if (old_is_gpu_gpu && new_transfer->dst_node == old_transfer->src_node && new_transfer->dst_node == old_transfer->dst_node) return 1; /* StarPU's constraint on CUDA transfers is using one stream per * source/destination pair, which is already handled above */ return 0; } /* Actually execute the transfer, and then start transfers waiting for this one. */ static int transfer_execute(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) { struct transfer *transfer = MSG_process_get_data(MSG_process_self()); unsigned i; _STARPU_DEBUG("transfer %p started\n", transfer); MSG_task_execute(transfer->task); MSG_task_destroy(transfer->task); _STARPU_DEBUG("transfer %p finished\n", transfer); STARPU_PTHREAD_MUTEX_LOCK(transfer->mutex); *transfer->finished = 1; STARPU_PTHREAD_COND_BROADCAST(transfer->cond); STARPU_PTHREAD_MUTEX_UNLOCK(transfer->mutex); /* The workers which started this request may be sleeping out of tasks, wake it */ _starpu_wake_all_blocked_workers_on_node(transfer->run_node); /* Wake transfers waiting for my termination */ /* Note: due to possible preemption inside process_create, the array * may grow while doing this */ for (i = 0; i < transfer->nwake; i++) { struct transfer *wake = transfer->wake[i]; STARPU_ASSERT(wake->nwait > 0); wake->nwait--; if (!wake->nwait) { _STARPU_DEBUG("triggering transfer %p\n", wake); MSG_process_create("transfer task", transfer_execute, wake, MSG_get_host_by_name("MAIN")); } } free(transfer->wake); transfer_list_erase(&pending, transfer); transfer_delete(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 */ old->wake = 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); MSG_process_create("transfer task", transfer_execute, transfer, MSG_get_host_by_name("MAIN")); } } /* Data transfer issued by StarPU */ int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req) { msg_task_t task; msg_host_t *hosts = calloc(2, sizeof(*hosts)); double *computation = calloc(2, sizeof(*computation)); double *communication = calloc(4, sizeof(*communication)); starpu_pthread_mutex_t mutex; starpu_pthread_cond_t cond; unsigned finished; hosts[0] = _starpu_simgrid_memory_node_get_host(src_node); hosts[1] = _starpu_simgrid_memory_node_get_host(dst_node); STARPU_ASSERT(hosts[0] != hosts[1]); communication[1] = size; task = MSG_parallel_task_create("copy", 2, hosts, computation, communication, NULL); struct transfer *transfer = transfer_new(); _STARPU_DEBUG("creating transfer %p for %lu bytes\n", transfer, (unsigned long) size); transfer->task = task; transfer->src_node = src_node; transfer->dst_node = dst_node; transfer->run_node = _starpu_memory_node_get_local_key(); if (req) { transfer->finished = &req->async_channel.event.finished; transfer->mutex = &req->async_channel.event.mutex; transfer->cond = &req->async_channel.event.cond; } else { transfer->finished = &finished; transfer->mutex = &mutex; transfer->cond = &cond; } *transfer->finished = 0; STARPU_PTHREAD_MUTEX_INIT(transfer->mutex, NULL); STARPU_PTHREAD_COND_INIT(transfer->cond, NULL); transfer->wake = NULL; transfer->nwake = 0; transfer->nwait = 0; if (req) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); /* Sleep 10µs for the GPU transfer queueing */ MSG_process_sleep(0.000010); transfer_submit(transfer); /* Note: from here, transfer might be already freed */ if (req) { _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); _STARPU_TRACE_DATA_COPY(src_node, dst_node, size); return -EAGAIN; } else { /* this is not associated to a request so it's synchronous */ STARPU_PTHREAD_MUTEX_LOCK(&mutex); while (!finished) STARPU_PTHREAD_COND_WAIT(&cond, &mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&mutex); return 0; } } int _starpu_simgrid_thread_start(int argc STARPU_ATTRIBUTE_UNUSED, char *argv[] STARPU_ATTRIBUTE_UNUSED) { struct _starpu_pthread_args *args = MSG_process_get_data(MSG_process_self()); args->f(args->arg); free(args); return 0; } #endif starpu-1.1.5/src/core/detect_combined_workers.c0000644000373600000000000002105412571536573016535 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013 Université de Bordeaux * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #ifdef STARPU_HAVE_HWLOC #include static void find_workers(hwloc_obj_t obj, int cpu_workers[STARPU_NMAXWORKERS], unsigned *n) { if (!obj->userdata) /* Not something we run something on, don't care */ return; if (obj->userdata == (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 *worker = obj->userdata; /* is it a CPU worker? */ if (worker->perf_arch == STARPU_CPU_DEFAULT) { _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 (children[i]->userdata) { 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]; struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; hwloc_obj_snprintf(name, sizeof(name), topology->hwtopology, obj, "#", 0); _STARPU_DEBUG("Looking at %s\n", name); for (n = 0, i = 0; i < obj->arity; i++) if (obj->children[i]->userdata) /* 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 (obj->children[i]->userdata == (void*) -1) find_and_assign_combinations(obj->children[i], min, max, synthesize_arity); } static void find_and_assign_combinations_with_hwloc(int *workerids, int nworkers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); struct _starpu_machine_topology *topology = &config->topology; int synthesize_arity = starpu_get_env_number("STARPU_SYNTHESIZE_ARITY_COMBINED_WORKER"); int min = starpu_get_env_number("STARPU_MIN_WORKERSIZE"); if (min < 2) min = 2; int max = starpu_get_env_number("STARPU_MAX_WORKERSIZE"); if (max == -1) max = INT_MAX; if (synthesize_arity == -1) synthesize_arity = 2; /* First, mark nodes which contain CPU workers, simply by setting their userdata field */ int i; for (i = 0; i < nworkers; i++) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerids[i]); if (worker->perf_arch == STARPU_CPU_DEFAULT) { hwloc_obj_t obj = hwloc_get_obj_by_depth(topology->hwtopology, config->cpu_depth, worker->bindid); STARPU_ASSERT(obj->userdata == worker); obj = obj->parent; while (obj) { obj->userdata = (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 find_and_assign_combinations_without_hwloc(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; int min; int max; 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; struct _starpu_worker *worker; int i; for (i = 0; i < nworkers; i++) { worker = _starpu_get_worker_struct(workerids[i]); if (worker->perf_arch == STARPU_CPU_DEFAULT) cpu_workers[ncpus++] = i; } 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; int size; for (size = min; size <= max; size *= 2) { unsigned first_cpu; for (first_cpu = 0; first_cpu < ncpus; first_cpu += size) { if (first_cpu + size <= ncpus) { int found_workerids[size]; for (i = 0; i < size; i++) found_workerids[i] = cpu_workers[first_cpu + i]; /* We register this combination */ int newworkerid; newworkerid = starpu_combined_worker_assign_workerid(size, found_workerids); STARPU_ASSERT(newworkerid >= 0); workers->add(workers, newworkerid); } } } } #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; struct _starpu_worker *worker; int i; int min; int max; for (i = 0; i < nworkers; i++) { worker = _starpu_get_worker_struct(workerids[i]); if (worker->perf_arch == STARPU_CPU_DEFAULT) 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; newworkerid = starpu_combined_worker_assign_workerid(i, cpu_workers); STARPU_ASSERT(newworkerid >= 0); workers->add(workers, newworkerid); } } void _starpu_sched_find_worker_combinations(int *workerids, int nworkers) { struct _starpu_machine_config *config = _starpu_get_machine_config(); if (config->conf.single_combined_worker > 0) combine_all_cpu_workers(workerids, nworkers); else { #ifdef STARPU_HAVE_HWLOC find_and_assign_combinations_with_hwloc(workerids, nworkers); #else find_and_assign_combinations_without_hwloc(workerids, nworkers); #endif } } starpu-1.1.5/src/core/sched_ctx.c0000644000373600000000000012657412571536573013632 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include starpu_pthread_rwlock_t changing_ctx_mutex[STARPU_NMAX_SCHED_CTXS]; extern struct starpu_worker_collection worker_list; static starpu_pthread_mutex_t sched_ctx_manag = STARPU_PTHREAD_MUTEX_INITIALIZER; static starpu_pthread_mutex_t finished_submit_mutex = STARPU_PTHREAD_MUTEX_INITIALIZER; static struct starpu_task stop_submission_task = STARPU_TASK_INITIALIZER; starpu_pthread_key_t sched_ctx_key; static unsigned with_hypervisor = 0; static double hyp_start_sample[STARPU_NMAX_SCHED_CTXS]; static double hyp_start_allow_sample[STARPU_NMAX_SCHED_CTXS]; static double flops[STARPU_NMAX_SCHED_CTXS][STARPU_NMAXWORKERS]; static size_t data_size[STARPU_NMAX_SCHED_CTXS][STARPU_NMAXWORKERS]; static unsigned _starpu_get_first_free_sched_ctx(struct _starpu_machine_config *config); static void _starpu_worker_gets_into_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker) { unsigned ret_sched_ctx = _starpu_sched_ctx_list_get_sched_ctx(worker->sched_ctx_list, sched_ctx_id); /* the worker was planning to go away in another ctx but finally he changed his mind & he's staying */ if (ret_sched_ctx == STARPU_NMAX_SCHED_CTXS) { /* add context to worker */ _starpu_sched_ctx_list_add(&worker->sched_ctx_list, sched_ctx_id); worker->nsched_ctxs++; } worker->removed_from_ctx[sched_ctx_id] = 0; return; } void _starpu_worker_gets_out_of_ctx(unsigned sched_ctx_id, struct _starpu_worker *worker) { unsigned ret_sched_ctx = _starpu_sched_ctx_list_get_sched_ctx(worker->sched_ctx_list, sched_ctx_id); /* remove context from worker */ if(ret_sched_ctx != STARPU_NMAX_SCHED_CTXS) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx && sched_ctx->sched_policy && sched_ctx->sched_policy->remove_workers) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->remove_workers(sched_ctx_id, &worker->workerid, 1); _STARPU_TRACE_WORKER_SCHEDULING_POP; } _starpu_sched_ctx_list_remove(&worker->sched_ctx_list, sched_ctx_id); worker->nsched_ctxs--; } return; } static void _starpu_update_workers_with_ctx(int *workerids, int nworkers, int sched_ctx_id) { int i; struct _starpu_worker *worker = NULL; struct _starpu_worker *curr_worker = _starpu_get_local_worker_key(); for(i = 0; i < nworkers; i++) { worker = _starpu_get_worker_struct(workerids[i]); /* if the current thread requires resize it's no need to lock it in order to change its sched_ctx info */ if(curr_worker && curr_worker == worker) _starpu_worker_gets_into_ctx(sched_ctx_id, worker); else { STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); _starpu_worker_gets_into_ctx(sched_ctx_id, worker); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); } } return; } static void _starpu_update_workers_without_ctx(int *workerids, int nworkers, int sched_ctx_id, unsigned now) { int i; struct _starpu_worker *worker = NULL; struct _starpu_worker *curr_worker = _starpu_get_local_worker_key(); for(i = 0; i < nworkers; i++) { worker = _starpu_get_worker_struct(workerids[i]); if(now) { if(curr_worker && curr_worker == worker) _starpu_worker_gets_out_of_ctx(sched_ctx_id, worker); else { STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); _starpu_worker_gets_out_of_ctx(sched_ctx_id, worker); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); } } else { if(curr_worker && curr_worker == worker) worker->removed_from_ctx[sched_ctx_id] = 1; else { STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); worker->removed_from_ctx[sched_ctx_id] = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); } } } return; } void starpu_sched_ctx_stop_task_submission() { _starpu_exclude_task_from_dag(&stop_submission_task); _starpu_task_submit_internally(&stop_submission_task); } void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int curr_workerid = starpu_worker_get_id(); /* if is the initial sched_ctx no point in taking the mutex, the workers are not launched yet, or if the current worker is calling this */ if(!sched_ctx->is_initial_sched && workerid != curr_workerid) STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); worker->shares_tasks_lists[sched_ctx_id] = 1; if(!sched_ctx->is_initial_sched && workerid != curr_workerid) STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); } static void _starpu_add_workers_to_sched_ctx(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers, int *added_workers, int *n_added_workers) { struct starpu_worker_collection *workers = sched_ctx->workers; struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); int nworkers_to_add = nworkers == -1 ? (int)config->topology.nworkers : nworkers; if (!nworkers_to_add) return; int workers_to_add[nworkers_to_add]; int i = 0; for(i = 0; i < nworkers_to_add; i++) { /* added_workers is NULL for the call of this func at the creation of the context*/ /* if the function is called at the creation of the context it's no need to do this verif */ if(added_workers) { int worker = workers->add(workers, (workerids == NULL ? i : workerids[i])); if(worker >= 0) added_workers[(*n_added_workers)++] = worker; else { int curr_workerid = starpu_worker_get_id(); struct _starpu_worker *worker_str = _starpu_get_worker_struct(workerids[i]); if(curr_workerid != workerids[i]) STARPU_PTHREAD_MUTEX_LOCK(&worker_str->sched_mutex); worker_str->removed_from_ctx[sched_ctx->id] = 0; if(curr_workerid != workerids[i]) STARPU_PTHREAD_MUTEX_UNLOCK(&worker_str->sched_mutex); } } else { int worker = (workerids == NULL ? i : workerids[i]); workers->add(workers, worker); workers_to_add[i] = worker; } } if(sched_ctx->sched_policy->add_workers) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; if(added_workers) { if(*n_added_workers > 0) sched_ctx->sched_policy->add_workers(sched_ctx->id, added_workers, *n_added_workers); } else sched_ctx->sched_policy->add_workers(sched_ctx->id, workers_to_add, nworkers_to_add); _STARPU_TRACE_WORKER_SCHEDULING_POP; } return; } static void _starpu_remove_workers_from_sched_ctx(struct _starpu_sched_ctx *sched_ctx, int *workerids, int nworkers, int *removed_workers, int *n_removed_workers) { struct starpu_worker_collection *workers = sched_ctx->workers; 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; } } } return; } static void _starpu_sched_ctx_free_scheduling_data(struct _starpu_sched_ctx *sched_ctx) { int *workerids = NULL; unsigned nworkers_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids); if(nworkers_ctx > 0 && sched_ctx->sched_policy->remove_workers) { _STARPU_TRACE_WORKER_SCHEDULING_PUSH; sched_ctx->sched_policy->remove_workers(sched_ctx->id, workerids, nworkers_ctx); _STARPU_TRACE_WORKER_SCHEDULING_POP; } free(workerids); return; } 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) { struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); STARPU_ASSERT(config->topology.nsched_ctxs < STARPU_NMAX_SCHED_CTXS); unsigned id = _starpu_get_first_free_sched_ctx(config); struct _starpu_sched_ctx *sched_ctx = &config->sched_ctxs[id]; sched_ctx->id = id; config->topology.nsched_ctxs++; STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); int nworkers = config->topology.nworkers; STARPU_ASSERT(nworkers_ctx <= nworkers); STARPU_PTHREAD_MUTEX_INIT(&sched_ctx->empty_ctx_mutex, NULL); starpu_task_list_init(&sched_ctx->empty_ctx_tasks); sched_ctx->sched_policy = (struct starpu_sched_policy*)malloc(sizeof(struct starpu_sched_policy)); sched_ctx->is_initial_sched = is_initial_sched; sched_ctx->name = sched_ctx_name; sched_ctx->inheritor = STARPU_NMAX_SCHED_CTXS; sched_ctx->finished_submit = 0; sched_ctx->min_priority_is_set = min_prio_set; if (sched_ctx->min_priority_is_set) sched_ctx->min_priority = min_prio; sched_ctx->max_priority_is_set = max_prio_set; if (sched_ctx->max_priority_is_set) sched_ctx->max_priority = max_prio; _starpu_barrier_counter_init(&sched_ctx->tasks_barrier, 0); _starpu_barrier_counter_init(&sched_ctx->ready_tasks_barrier, 0); sched_ctx->ready_flops = 0.0; /*init the strategy structs and the worker_collection of the ressources of the context */ _starpu_init_sched_policy(config, sched_ctx, policy); /* construct the collection of workers(list/tree/etc.) */ sched_ctx->workers->init(sched_ctx->workers); /* after having an worker_collection on the ressources add them */ _starpu_add_workers_to_sched_ctx(sched_ctx, workerids, nworkers_ctx, NULL, NULL); /* 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) { int i; /*initialize the mutexes for all contexts */ for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) STARPU_PTHREAD_RWLOCK_INIT(&changing_ctx_mutex[i], NULL); for(i = 0; i < nworkers; i++) { struct _starpu_worker *worker = _starpu_get_worker_struct(i); worker->sched_ctx_list = (struct _starpu_sched_ctx_list*)malloc(sizeof(struct _starpu_sched_ctx_list)); _starpu_sched_ctx_list_init(worker->sched_ctx_list); _starpu_sched_ctx_list_add(&worker->sched_ctx_list, sched_ctx->id); worker->nsched_ctxs++; } } return sched_ctx; } static void _get_workers(int min, int max, int *workers, int *nw, enum starpu_worker_archtype arch, unsigned allow_overlap) { int pus[max]; int npus = 0; int i; int n = 0; struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); if(config->topology.nsched_ctxs == 1) { /*we have all available resources */ npus = starpu_worker_get_nids_by_type(arch, pus, max); /*TODO: hierarchical ctxs: get max good workers: close one to another */ for(i = 0; i < npus; i++) workers[(*nw)++] = pus[i]; } else { unsigned enough_ressources = 0; npus = starpu_worker_get_nids_ctx_free_by_type(arch, pus, max); for(i = 0; i < npus; i++) workers[(*nw)++] = pus[i]; if(npus == max) /*we have enough available resources */ enough_ressources = 1; if(!enough_ressources && npus >= min) /*we have enough available resources */ enough_ressources = 1; if(!enough_ressources) { /* try to get ressources from ctx who have more than the min of workers they need */ int s; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { int _npus = 0; int _pus[STARPU_NMAXWORKERS]; _npus = starpu_get_workers_of_sched_ctx(config->sched_ctxs[s].id, _pus, arch); int ctx_min = arch == STARPU_CPU_WORKER ? config->sched_ctxs[s].min_ncpus : config->sched_ctxs[s].min_ngpus; if(_npus > ctx_min) { if(npus < min) { n = (_npus - ctx_min) > (min - npus) ? min - npus : (_npus - ctx_min); npus += n; } /*TODO: hierarchical ctxs: get n good workers: close to the other ones I already assigned to the ctx */ for(i = 0; i < n; i++) workers[(*nw)++] = _pus[i]; starpu_sched_ctx_remove_workers(_pus, n, config->sched_ctxs[s].id); } } } if(npus >= min) enough_ressources = 1; } if(!enough_ressources) { /* if there is no available workers to satisfy the minimum required give them workers proportional to their requirements*/ int global_npus = starpu_worker_get_count_by_type(arch); int req_npus = 0; int s; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) req_npus += arch == STARPU_CPU_WORKER ? config->sched_ctxs[s].min_ncpus : config->sched_ctxs[s].min_ngpus; req_npus += min; for(s = 1; s < STARPU_NMAX_SCHED_CTXS; s++) { if(config->sched_ctxs[s].id != STARPU_NMAX_SCHED_CTXS) { int ctx_min = arch == STARPU_CPU_WORKER ? config->sched_ctxs[s].min_ncpus : config->sched_ctxs[s].min_ngpus; double needed_npus = ((double)ctx_min * (double)global_npus) / (double)req_npus; int _npus = 0; int _pus[STARPU_NMAXWORKERS]; _npus = starpu_get_workers_of_sched_ctx(config->sched_ctxs[s].id, _pus, arch); if(needed_npus < (double)_npus) { double npus_to_rem = (double)_npus - needed_npus; int x = floor(npus_to_rem); double x_double = (double)x; double diff = npus_to_rem - x_double; int npus_to_remove = diff >= 0.5 ? x+1 : x; int pus_to_remove[npus_to_remove]; int c = 0; /*TODO: hierarchical ctxs: get npus_to_remove good workers: close to the other ones I already assigned to the ctx */ for(i = _npus-1; i >= (_npus - npus_to_remove); i--) { workers[(*nw)++] = _pus[i]; pus_to_remove[c++] = _pus[i]; } if(!allow_overlap) starpu_sched_ctx_remove_workers(pus_to_remove, npus_to_remove, config->sched_ctxs[s].id); } } } } } } unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_ctx_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap) { struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); struct starpu_sched_policy *selected_policy = _starpu_select_sched_policy(config, policy_name); struct _starpu_sched_ctx *sched_ctx = NULL; int workers[max_ncpus + max_ngpus]; int nw = 0; STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); _get_workers(min_ncpus, max_ncpus, workers, &nw, STARPU_CPU_WORKER, allow_overlap); _get_workers(min_ngpus, max_ngpus, workers, &nw, STARPU_CUDA_WORKER, allow_overlap); STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); int i; printf("%d: ", nw); for(i = 0; i < nw; i++) printf("%d ", workers[i]); printf("\n"); sched_ctx = _starpu_create_sched_ctx(selected_policy, workers, nw, 0, sched_ctx_name, 0, 0, 0, 0); sched_ctx->min_ncpus = min_ncpus; sched_ctx->max_ncpus = max_ncpus; sched_ctx->min_ngpus = min_ngpus; sched_ctx->max_ngpus = max_ngpus; _starpu_update_workers_without_ctx(sched_ctx->workers->workerids, sched_ctx->workers->nworkers, sched_ctx->id, 0); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif return sched_ctx->id; } unsigned starpu_sched_ctx_create(int *workerids, int nworkers, const char *sched_ctx_name, ...) { va_list varg_list; int arg_type; int min_prio_set = 0; int max_prio_set = 0; int min_prio = 0; int max_prio = 0; struct starpu_sched_policy *sched_policy = NULL; 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 = (struct _starpu_machine_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 { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } va_end(varg_list); struct _starpu_sched_ctx *sched_ctx = NULL; sched_ctx = _starpu_create_sched_ctx(sched_policy, workerids, nworkers, 0, sched_ctx_name, min_prio_set, min_prio, max_prio_set, max_prio); _starpu_update_workers_with_ctx(sched_ctx->workers->workerids, sched_ctx->workers->nworkers, sched_ctx->id); #ifdef STARPU_USE_SC_HYPERVISOR sched_ctx->perf_counters = NULL; #endif return sched_ctx->id; } void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->close_callback = close_callback; sched_ctx->close_args = args; return; } #ifdef STARPU_USE_SC_HYPERVISOR void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void* perf_counters) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->perf_counters = (struct starpu_sched_ctx_performance_counters *)perf_counters; return; } #endif /* free all structures for the context */ static void _starpu_delete_sched_ctx(struct _starpu_sched_ctx *sched_ctx) { STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS); _starpu_deinit_sched_policy(sched_ctx); free(sched_ctx->sched_policy); sched_ctx->sched_policy = NULL; STARPU_PTHREAD_MUTEX_DESTROY(&sched_ctx->empty_ctx_mutex); sched_ctx->id = STARPU_NMAX_SCHED_CTXS; struct _starpu_machine_config *config = _starpu_get_machine_config(); STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx_manag); config->topology.nsched_ctxs--; STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx_manag); } void starpu_sched_ctx_delete(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); #ifdef STARPU_USE_SC_HYPERVISOR if(sched_ctx != NULL && sched_ctx_id != 0 && sched_ctx_id != STARPU_NMAX_SCHED_CTXS && sched_ctx->perf_counters != NULL) { _STARPU_TRACE_HYPERVISOR_BEGIN(); sched_ctx->perf_counters->notify_delete_context(sched_ctx_id); _STARPU_TRACE_HYPERVISOR_END(); } #endif //STARPU_USE_SC_HYPERVISOR unsigned inheritor_sched_ctx_id = sched_ctx->inheritor; struct _starpu_sched_ctx *inheritor_sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx->inheritor); STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx_id]); STARPU_ASSERT(sched_ctx->id != STARPU_NMAX_SCHED_CTXS); int *workerids; unsigned nworkers_ctx = starpu_sched_ctx_get_workers_list(sched_ctx->id, &workerids); /*if both of them have all the ressources is pointless*/ /*trying to transfer ressources from one ctx to the other*/ struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); unsigned nworkers = config->topology.nworkers; if(nworkers_ctx > 0 && inheritor_sched_ctx && inheritor_sched_ctx->id != STARPU_NMAX_SCHED_CTXS && !(nworkers_ctx == nworkers && nworkers_ctx == inheritor_sched_ctx->workers->nworkers)) { starpu_sched_ctx_add_workers(workerids, nworkers_ctx, inheritor_sched_ctx_id); } if(!_starpu_wait_for_all_tasks_of_sched_ctx(sched_ctx_id)) { /*if btw the mutex release & the mutex lock the context has changed take care to free all scheduling data before deleting the context */ _starpu_update_workers_without_ctx(workerids, nworkers_ctx, sched_ctx_id, 1); // _starpu_sched_ctx_free_scheduling_data(sched_ctx); _starpu_delete_sched_ctx(sched_ctx); } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); /* workerids is malloc-ed in starpu_sched_ctx_get_workers_list, don't forget to free it when you don't use it anymore */ free(workerids); return; } /* called after the workers are terminated so we don't have anything else to do but free the memory*/ void _starpu_delete_all_sched_ctxs() { unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(i); STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[i]); if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_sched_ctx_free_scheduling_data(sched_ctx); _starpu_barrier_counter_destroy(&sched_ctx->tasks_barrier); _starpu_barrier_counter_destroy(&sched_ctx->ready_tasks_barrier); _starpu_delete_sched_ctx(sched_ctx); } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[i]); STARPU_PTHREAD_RWLOCK_DESTROY(&changing_ctx_mutex[i]); } STARPU_PTHREAD_KEY_DELETE(sched_ctx_key); return; } static void _starpu_check_workers(int *workerids, int nworkers) { struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); int nworkers_conf = config->topology.nworkers; int i; for(i = 0; i < nworkers; i++) { /* take care the user does not ask for a resource that does not exist */ STARPU_ASSERT_MSG(workerids[i] >= 0 && workerids[i] <= nworkers_conf, "requested to add workerid = %d, but that is beyond the range 0 to %d", workerids[i], nworkers_conf); } } void _starpu_fetch_tasks_from_empty_ctx_list(struct _starpu_sched_ctx *sched_ctx) { unsigned unlocked = 0; STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); if(starpu_task_list_empty(&sched_ctx->empty_ctx_tasks)) { STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); return; } else /* you're not suppose to get here if you deleted the context so no point in having the mutex locked */ STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx->id]); while(!starpu_task_list_empty(&sched_ctx->empty_ctx_tasks)) { if(unlocked) STARPU_PTHREAD_MUTEX_LOCK(&sched_ctx->empty_ctx_mutex); struct starpu_task *old_task = starpu_task_list_pop_back(&sched_ctx->empty_ctx_tasks); unlocked = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); if(old_task == &stop_submission_task) break; int ret = _starpu_push_task_to_workers(old_task); /* if we should stop poping from empty ctx tasks */ if(ret == -EAGAIN) break; } if(!unlocked) STARPU_PTHREAD_MUTEX_UNLOCK(&sched_ctx->empty_ctx_mutex); /* leave the mutex as it was to avoid pbs in the caller function */ STARPU_PTHREAD_RWLOCK_RDLOCK(&changing_ctx_mutex[sched_ctx->id]); return; } void starpu_sched_ctx_add_workers(int *workers_to_add, int nworkers_to_add, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int added_workers[nworkers_to_add]; int n_added_workers = 0; STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx_id]); STARPU_ASSERT(workers_to_add != NULL && nworkers_to_add > 0); _starpu_check_workers(workers_to_add, nworkers_to_add); /* if the context has not already been deleted */ if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_add_workers_to_sched_ctx(sched_ctx, workers_to_add, nworkers_to_add, added_workers, &n_added_workers); if(n_added_workers > 0) { _starpu_update_workers_with_ctx(added_workers, n_added_workers, sched_ctx->id); } } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { STARPU_PTHREAD_RWLOCK_RDLOCK(&changing_ctx_mutex[sched_ctx_id]); _starpu_fetch_tasks_from_empty_ctx_list(sched_ctx); STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); } return; } void starpu_sched_ctx_remove_workers(int *workers_to_remove, int nworkers_to_remove, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); int removed_workers[sched_ctx->workers->nworkers]; int n_removed_workers = 0; _starpu_check_workers(workers_to_remove, nworkers_to_remove); STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx_id]); /* if the context has not already been deleted */ if(sched_ctx->id != STARPU_NMAX_SCHED_CTXS) { _starpu_remove_workers_from_sched_ctx(sched_ctx, workers_to_remove, nworkers_to_remove, removed_workers, &n_removed_workers); if(n_removed_workers > 0) _starpu_update_workers_without_ctx(removed_workers, n_removed_workers, sched_ctx->id, 0); } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx_id]); return; } int _starpu_nworkers_able_to_execute_task(struct starpu_task *task, struct _starpu_sched_ctx *sched_ctx) { unsigned worker = 0, nworkers = 0; STARPU_PTHREAD_RWLOCK_WRLOCK(&changing_ctx_mutex[sched_ctx->id]); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); STARPU_ASSERT_MSG(worker < STARPU_NMAXWORKERS, "worker id %d", worker); if (starpu_worker_can_execute_task(worker, task, 0)) nworkers++; } STARPU_PTHREAD_RWLOCK_UNLOCK(&changing_ctx_mutex[sched_ctx->id]); return nworkers; } /* unused sched_ctx have the id STARPU_NMAX_SCHED_CTXS */ void _starpu_init_all_sched_ctxs(struct _starpu_machine_config *config) { STARPU_PTHREAD_KEY_CREATE(&sched_ctx_key, NULL); unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) config->sched_ctxs[i].id = STARPU_NMAX_SCHED_CTXS; return; } /* sched_ctx aren't necessarly one next to another */ /* for eg when we remove one its place is free */ /* when we add new one we reuse its place */ static unsigned _starpu_get_first_free_sched_ctx(struct _starpu_machine_config *config) { unsigned i; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) if(config->sched_ctxs[i].id == STARPU_NMAX_SCHED_CTXS) return i; STARPU_ASSERT(0); return STARPU_NMAX_SCHED_CTXS; } int _starpu_wait_for_all_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_all must not be called from a task or callback"); return _starpu_barrier_counter_wait_for_empty_counter(&sched_ctx->tasks_barrier); } int _starpu_wait_for_n_submitted_tasks_of_sched_ctx(unsigned sched_ctx_id, unsigned n) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); STARPU_ASSERT_MSG(_starpu_worker_may_perform_blocking_calls(), "starpu_task_wait_for_n_submitted_tasks must not be called from a task or callback"); return _starpu_barrier_counter_wait_until_counter_reaches_down_to_n(&sched_ctx->tasks_barrier, n); } void _starpu_decrement_nsubmitted_tasks_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_machine_config *config = (struct _starpu_machine_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); } void _starpu_increment_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); _starpu_barrier_counter_increment(&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); _starpu_barrier_counter_decrement_until_empty_counter(&sched_ctx->ready_tasks_barrier, ready_flops); } int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_get_reached_start(&sched_ctx->ready_tasks_barrier); } double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_get_reached_flops(&sched_ctx->ready_tasks_barrier); } int _starpu_wait_for_no_ready_of_sched_ctx(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return _starpu_barrier_counter_wait_for_empty_counter(&sched_ctx->ready_tasks_barrier); } void starpu_sched_ctx_set_context(unsigned *sched_ctx) { starpu_pthread_setspecific(sched_ctx_key, (void*)sched_ctx); } unsigned starpu_sched_ctx_get_context() { unsigned *sched_ctx = (unsigned*)starpu_pthread_getspecific(sched_ctx_key); if(sched_ctx == NULL) return STARPU_NMAX_SCHED_CTXS; STARPU_ASSERT(*sched_ctx < STARPU_NMAX_SCHED_CTXS); return *sched_ctx; } unsigned _starpu_sched_ctx_get_current_context() { unsigned sched_ctx = starpu_sched_ctx_get_context(); if (sched_ctx == STARPU_NMAX_SCHED_CTXS) return _starpu_get_initial_sched_ctx()->id; else return sched_ctx; } void starpu_sched_ctx_notify_hypervisor_exists() { with_hypervisor = 1; int i, j; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { hyp_start_sample[i] = starpu_timing_now(); hyp_start_allow_sample[i] = 0.0; for(j = 0; j < STARPU_NMAXWORKERS; j++) { flops[i][j] = 0.0; data_size[i][j] = 0; } } } unsigned starpu_sched_ctx_check_if_hypervisor_exists() { return with_hypervisor; } unsigned _starpu_sched_ctx_allow_hypervisor(unsigned sched_ctx_id) { return 1; 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; } unsigned _starpu_get_nsched_ctxs() { struct _starpu_machine_config *config = (struct _starpu_machine_config *)_starpu_get_machine_config(); return config->topology.nsched_ctxs; } void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void* policy_data) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->policy_data = policy_data; } void* starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->policy_data; } struct starpu_worker_collection* starpu_sched_ctx_create_worker_collection(unsigned sched_ctx_id, enum starpu_worker_collection_type worker_collection_type) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->workers = (struct starpu_worker_collection*)malloc(sizeof(struct starpu_worker_collection)); switch(worker_collection_type) { case STARPU_WORKER_LIST: sched_ctx->workers->has_next = worker_list.has_next; sched_ctx->workers->get_next = worker_list.get_next; sched_ctx->workers->add = worker_list.add; sched_ctx->workers->remove = worker_list.remove; sched_ctx->workers->init = worker_list.init; sched_ctx->workers->deinit = worker_list.deinit; sched_ctx->workers->init_iterator = worker_list.init_iterator; sched_ctx->workers->type = STARPU_WORKER_LIST; break; } return sched_ctx->workers; } 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; *workerids = (int*)malloc(workers->nworkers*sizeof(int)); int worker; unsigned nworkers = 0; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); (*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); } struct starpu_worker_collection* starpu_sched_ctx_get_worker_collection(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); return sched_ctx->workers; } int starpu_get_workers_of_sched_ctx(unsigned sched_ctx_id, int *pus, enum starpu_worker_archtype arch) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct starpu_worker_collection *workers = sched_ctx->workers; int worker; int npus = 0; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) 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) pus[npus++] = worker; } return npus; } starpu_pthread_rwlock_t* _starpu_sched_ctx_get_changing_ctx_mutex(unsigned sched_ctx_id) { return &changing_ctx_mutex[sched_ctx_id]; } unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); if(sched_ctx != NULL) return sched_ctx->workers->nworkers; else return 0; } unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct _starpu_sched_ctx *sched_ctx2 = _starpu_get_sched_ctx_struct(sched_ctx_id2); struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_worker_collection *workers2 = sched_ctx2->workers; int worker, worker2; int shared_workers = 0; struct starpu_sched_ctx_iterator it1, it2; if(workers->init_iterator) workers->init_iterator(workers, &it1); if(workers2->init_iterator) workers2->init_iterator(workers2, &it2); while(workers->has_next(workers, &it1)) { worker = workers->get_next(workers, &it1); while(workers2->has_next(workers2, &it2)) { worker2 = workers2->get_next(workers2, &it2); if(worker == worker2) shared_workers++; } } return shared_workers; } unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); struct starpu_worker_collection *workers = sched_ctx->workers; int worker; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); if(worker == workerid) return 1; } return 0; } unsigned starpu_sched_ctx_contains_type_of_worker(enum starpu_worker_archtype arch, unsigned sched_ctx_id) { struct starpu_worker_collection *workers = starpu_sched_ctx_get_worker_collection(sched_ctx_id); int worker; struct starpu_sched_ctx_iterator it; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { worker = workers->get_next(workers, &it); 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 = (struct _starpu_machine_config *)_starpu_get_machine_config(); int i; struct _starpu_sched_ctx *sched_ctx = NULL; for(i = 0; i < STARPU_NMAX_SCHED_CTXS; i++) { sched_ctx = &config->sched_ctxs[i]; if(sched_ctx && sched_ctx->id != STARPU_NMAX_SCHED_CTXS && sched_ctx->id != sched_ctx_id) if(starpu_sched_ctx_contains_worker(workerid, sched_ctx->id)) return 1; } return 0; } unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id) { int workerid = starpu_worker_get_id(); if(workerid != -1) if(starpu_sched_ctx_contains_worker(workerid, sched_ctx_id)) return workerid; return -1; } unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); return worker->nsched_ctxs > 1; } void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor) { STARPU_ASSERT(inheritor < STARPU_NMAX_SCHED_CTXS); struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(sched_ctx_id); sched_ctx->inheritor = inheritor; return; } 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) { 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; } unsigned _starpu_sched_ctx_last_worker_awake(struct _starpu_worker *worker) { struct _starpu_sched_ctx_list *l = NULL; for (l = worker->sched_ctx_list; l; l = l->next) { struct _starpu_sched_ctx *sched_ctx = _starpu_get_sched_ctx_struct(l->sched_ctx); unsigned last_worker_awake = 1; struct starpu_worker_collection *workers = sched_ctx->workers; struct starpu_sched_ctx_iterator it; int workerid; if(workers->init_iterator) workers->init_iterator(workers, &it); while(workers->has_next(workers, &it)) { workerid = workers->get_next(workers, &it); if(workerid != worker->workerid && _starpu_worker_get_status(workerid) != STATUS_SLEEPING) { last_worker_awake = 0; break; } } if(last_worker_awake) return 1; } return 0; } starpu-1.1.5/src/core/jobs.c0000644000373600000000000003372312571536573012614 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * Copyright (C) 2011 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include /* we need to identify each task to generate the DAG. */ static unsigned job_cnt = 0; void _starpu_exclude_task_from_dag(struct starpu_task *task) { struct _starpu_job *j = _starpu_get_job_associated_to_task(task); j->exclude_from_dag = 1; } /* create an internal struct _starpu_job structure to encapsulate the task */ struct _starpu_job* STARPU_ATTRIBUTE_MALLOC _starpu_job_create(struct starpu_task *task) { struct _starpu_job *job; _STARPU_LOG_IN(); job = _starpu_job_new(); /* As most of the fields must be initialized at NULL, let's put 0 * everywhere */ memset(job, 0, sizeof(*job)); if (task->dyn_handles) { job->dyn_ordered_buffers = malloc(task->cl->nbuffers * sizeof(job->dyn_ordered_buffers[0])); job->dyn_dep_slots = calloc(task->cl->nbuffers, sizeof(job->dyn_dep_slots[0])); } job->task = task; #ifndef STARPU_USE_FXT if (_starpu_bound_recording || _starpu_top_status_get() #ifdef HAVE_AYUDAME_H || AYU_event #endif ) #endif { job->job_id = STARPU_ATOMIC_ADD(&job_cnt, 1); #ifdef HAVE_AYUDAME_H if (AYU_event) { /* Declare task to Ayudame */ int64_t AYU_data[2] = {_starpu_ayudame_get_func_id(task->cl), task->priority > STARPU_MIN_PRIO}; AYU_event(AYU_ADDTASK, job->job_id, AYU_data); } #endif } _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); _STARPU_LOG_OUT(); return job; } void _starpu_job_destroy(struct _starpu_job *j) { /* Wait for any code that was still working on the job (and was * probably our waker) */ STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); STARPU_PTHREAD_COND_DESTROY(&j->sync_cond); STARPU_PTHREAD_MUTEX_DESTROY(&j->sync_mutex); if (j->task_size > 1) { STARPU_PTHREAD_BARRIER_DESTROY(&j->before_work_barrier); STARPU_PTHREAD_BARRIER_DESTROY(&j->after_work_barrier); STARPU_ASSERT(j->after_work_busy_barrier == 0); } _starpu_cg_list_deinit(&j->job_successors); if (j->dyn_ordered_buffers) { free(j->dyn_ordered_buffers); j->dyn_ordered_buffers = NULL; } if (j->dyn_dep_slots) { free(j->dyn_dep_slots); j->dyn_dep_slots = NULL; } _starpu_job_delete(j); } 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(); } void _starpu_handle_job_termination(struct _starpu_job *j) { struct starpu_task *task = j->task; unsigned sched_ctx = task->sched_ctx; double flops = task->flops; STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); task->status = STARPU_TASK_FINISHED; /* We must have set the j->terminated flag early, so that it is * possible to express task dependencies within the callback * function. A value of 1 means that the codelet was executed but that * the callback is not done yet. */ j->terminated = 1; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); #ifdef STARPU_USE_SC_HYPERVISOR size_t data_size = 0; int workerid = starpu_worker_get_id(); #endif //STARPU_USE_SC_HYPERVISOR if (task->cl && task->cl->where == STARPU_NOWHERE) /* push_task_output hasn't been done */ _starpu_release_nowhere_task_output(j); /* We release handle reference count */ if (task->cl) { unsigned i; #ifdef STARPU_USE_SC_HYPERVISOR for(i = 0; i < task->cl->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 < task->cl->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); } } /* 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 */ if (j->implicit_dep_handle) { 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); } /* in case there are dependencies, wake up the proper tasks */ _starpu_notify_dependencies(j); /* the callback is executed after the dependencies so that we may remove the tag * of the task itself */ if (task->callback_func) { int profiling = starpu_profiling_status_get(); if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->callback_start_time); /* so that we can check whether we are doing blocking calls * within the callback */ _starpu_set_local_worker_status(STATUS_CALLBACK); /* Perhaps we have nested callbacks (eg. with chains of empty * tasks). So we store the current task and we will restore it * later. */ struct starpu_task *current_task = starpu_task_get_current(); _starpu_set_current_task(task); _STARPU_TRACE_START_CALLBACK(j); task->callback_func(task->callback_arg); _STARPU_TRACE_END_CALLBACK(j); _starpu_set_current_task(current_task); _starpu_set_local_worker_status(STATUS_UNKNOWN); if (profiling && task->profiling_info) _starpu_clock_gettime(&task->profiling_info->callback_end_time); } /* If the job was executed on a combined worker there is no need for the * scheduler to process it : the task structure doesn't contain any valuable * data as it's not linked to an actual worker */ /* control task should not execute post_exec_hook */ if(j->task_size == 1 && task->cl != NULL && !j->internal) { _starpu_sched_post_exec_hook(task); #ifdef STARPU_USE_SC_HYPERVISOR _starpu_sched_ctx_post_exec_task_cb(workerid, task, data_size, j->footprint); #endif //STARPU_USE_SC_HYPERVISOR } _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). */ int destroy = task->destroy; int detach = task->detach; int regenerate = task->regenerate; /* we do not desallocate the job structure if some is going to * wait after the task */ STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); /* 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); #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_REMOVETASK, j->job_id, NULL); #endif STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); if (detach) { /* 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); } if (regenerate) { STARPU_ASSERT_MSG(detach && !destroy && !task->synchronous, "Regenerated task must be detached (was %d), and not have detroy=1 (was %d) or synchronous=1 (was %d)", detach, destroy, task->synchronous); #ifdef HAVE_AYUDAME_H if (AYU_event) { int64_t AYU_data[2] = {j->exclude_from_dag?0:_starpu_ayudame_get_func_id(task->cl), task->priority > STARPU_MIN_PRIO}; AYU_event(AYU_ADDTASK, j->job_id, AYU_data); } #endif /* We reuse the same job structure */ int ret = _starpu_submit_job(j); STARPU_ASSERT(!ret); } _starpu_decrement_nsubmitted_tasks_of_sched_ctx(sched_ctx); _starpu_decrement_nready_tasks_of_sched_ctx(sched_ctx, flops); struct _starpu_worker *worker; worker = _starpu_get_local_worker_key(); if (worker) { STARPU_PTHREAD_MUTEX_LOCK(&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(&worker->sched_mutex); } } /* This function is called when a new task is submitted to StarPU * it returns 1 if the tag deps are not fulfilled, 0 otherwise */ static unsigned _starpu_not_all_tag_deps_are_fulfilled(struct _starpu_job *j) { unsigned ret; if (!j->task->use_tag) { /* this task does not use tags, so we can go on */ return 0; } struct _starpu_tag *tag = j->tag; struct _starpu_cg_list *tag_successors = &tag->tag_successors; _starpu_spin_lock(&tag->lock); STARPU_ASSERT_MSG(tag->is_assigned == 1 || !tag_successors->ndeps, "a tag can be assigned only one task to wake (%llu had %u assigned tasks, and %u successors)", (unsigned long long) tag->id, tag->is_assigned, tag_successors->ndeps); if (tag_successors->ndeps != tag_successors->ndeps_completed) { tag->state = STARPU_BLOCKED; j->task->status = STARPU_TASK_BLOCKED_ON_TAG; ret = 1; } else { /* existing deps (if any) are fulfilled */ /* If the same tag is being signaled by several tasks, do not * clear a DONE state. If it's the same job submitted several * times with the same tag, we have to do it */ if (j->submitted == 2 || tag->state != STARPU_DONE) tag->state = STARPU_READY; /* already prepare for next run */ tag_successors->ndeps_completed = 0; ret = 0; } _starpu_spin_unlock(&tag->lock); return ret; } static unsigned _starpu_not_all_task_deps_are_fulfilled(struct _starpu_job *j) { unsigned ret; struct _starpu_cg_list *job_successors = &j->job_successors; if (!j->submitted || (job_successors->ndeps != job_successors->ndeps_completed)) { j->task->status = STARPU_TASK_BLOCKED_ON_TASK; ret = 1; } else { /* existing deps (if any) are fulfilled */ /* already prepare for next run */ job_successors->ndeps_completed = 0; ret = 0; } return ret; } /* * In order, we enforce tag, task and data dependencies. The task is * passed to the scheduler only once all these constraints are fulfilled. * * The job mutex has to be taken for atomicity with task submission, and * is released here. */ unsigned _starpu_enforce_deps_and_schedule(struct _starpu_job *j) { unsigned ret; _STARPU_LOG_IN(); /* enfore tag dependencies */ if (_starpu_not_all_tag_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); _STARPU_LOG_OUT_TAG("not_all_tag_deps_are_fulfilled"); return 0; } /* enfore task dependencies */ if (_starpu_not_all_task_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); _STARPU_LOG_OUT_TAG("not_all_task_deps_are_fulfilled"); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); /* enforce data dependencies */ if (_starpu_submit_job_enforce_data_deps(j)) { _STARPU_LOG_OUT_TAG("enforce_data_deps"); return 0; } ret = _starpu_push_task(j); _STARPU_LOG_OUT(); return ret; } /* Tag deps are already fulfilled */ unsigned _starpu_enforce_deps_starting_from_task(struct _starpu_job *j) { unsigned ret; /* enfore task dependencies */ if (_starpu_not_all_task_deps_are_fulfilled(j)) { STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); return 0; } STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); /* enforce data dependencies */ if (_starpu_submit_job_enforce_data_deps(j)) return 0; ret = _starpu_push_task(j); return ret; } /* 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 (!starpu_task_list_empty(&worker->local_tasks)) task = starpu_task_list_pop_front(&worker->local_tasks); return task; } int _starpu_push_local_task(struct _starpu_worker *worker, struct starpu_task *task, int prio) { /* Check that the worker is able to execute the task ! */ STARPU_ASSERT(task && task->cl); if (STARPU_UNLIKELY(!(worker->worker_mask & task->cl->where))) return -ENODEV; STARPU_PTHREAD_MUTEX_LOCK(&worker->sched_mutex); if (prio) starpu_task_list_push_front(&worker->local_tasks, task); else starpu_task_list_push_back(&worker->local_tasks, task); STARPU_PTHREAD_COND_BROADCAST(&worker->sched_cond); starpu_push_task_end(task); STARPU_PTHREAD_MUTEX_UNLOCK(&worker->sched_mutex); return 0; } starpu-1.1.5/src/core/simgrid.h0000644000373600000000000000307612571536573013320 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __SIMGRID_H__ #define __SIMGRID_H__ #ifdef STARPU_SIMGRID #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif #include #include struct _starpu_pthread_args { void *(*f)(void*); void *arg; }; #define MAX_TSD 16 void _starpu_simgrid_init(void); void _starpu_simgrid_execute_job(struct _starpu_job *job, enum starpu_perfmodel_archtype perf_arch, double length); int _starpu_simgrid_transfer(size_t size, unsigned src_node, unsigned dst_node, struct _starpu_data_request *req); /* Return the number of hosts prefixed by PREFIX */ int _starpu_simgrid_get_nbhosts(const char *prefix); unsigned long long _starpu_simgrid_get_memsize(const char *prefix, unsigned devid); msg_host_t _starpu_simgrid_get_host_by_worker(struct _starpu_worker *worker); void _starpu_simgrid_get_platform_path(char *path, size_t maxlen); #endif #endif // __SIMGRID_H__ starpu-1.1.5/src/drivers/0002755000373600000000000000000012571541160012277 500000000000000starpu-1.1.5/src/drivers/driver_common/0002755000373600000000000000000012571541161015143 500000000000000starpu-1.1.5/src/drivers/driver_common/driver_common.h0000644000373600000000000000306112571536576020113 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_COMMON_H__ #define __DRIVER_COMMON_H__ #include #include #include #include void _starpu_driver_start_job(struct _starpu_worker *args, struct _starpu_job *j, struct timespec *codelet_start, int rank, int profiling); void _starpu_driver_end_job(struct _starpu_worker *args, struct _starpu_job *j, enum starpu_perfmodel_archtype perf_arch, struct timespec *codelet_end, int rank, int profiling); void _starpu_driver_update_job_feedback(struct _starpu_job *j, struct _starpu_worker *worker_args, enum starpu_perfmodel_archtype perf_arch, struct timespec *codelet_start, struct timespec *codelet_end, int profiling); struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *args, int workerid, unsigned memnode); #endif // __DRIVER_COMMON_H__ starpu-1.1.5/src/drivers/driver_common/driver_common.c0000644000373600000000000001722412571536576020114 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #define BACKOFF_MAX 32 /* TODO : use parameter to define them */ #define BACKOFF_MIN 1 void _starpu_driver_start_job(struct _starpu_worker *args, struct _starpu_job *j, struct timespec *codelet_start, int rank, int profiling) { struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; struct starpu_profiling_task_info *profiling_info; int starpu_top=_starpu_top_status_get(); int workerid = args->workerid; unsigned calibrate_model = 0; if (cl->model && cl->model->benchmarking) calibrate_model = 1; /* If the job is executed on a combined worker there is no need for the * scheduler to process it : it doesn't contain any valuable data * as it's not linked to an actual worker */ if (j->task_size == 1) _starpu_sched_pre_exec_hook(task); args->status = STATUS_EXECUTING; task->status = STARPU_TASK_RUNNING; if (rank == 0) { #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_RUNTASK, j->job_id, NULL); #endif cl->per_worker_stats[workerid]++; profiling_info = task->profiling_info; if ((profiling && profiling_info) || calibrate_model || starpu_top) { _starpu_clock_gettime(codelet_start); _starpu_worker_register_executing_start_date(workerid, codelet_start); } } if (starpu_top) _starpu_top_task_started(task,workerid,codelet_start); _STARPU_TRACE_START_CODELET_BODY(j); } void _starpu_driver_end_job(struct _starpu_worker *args, struct _starpu_job *j, enum starpu_perfmodel_archtype perf_arch STARPU_ATTRIBUTE_UNUSED, struct timespec *codelet_end, int rank, int profiling) { struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; struct starpu_profiling_task_info *profiling_info = task->profiling_info; int starpu_top=_starpu_top_status_get(); int workerid = args->workerid; unsigned calibrate_model = 0; _STARPU_TRACE_END_CODELET_BODY(j, j->nimpl, perf_arch); if (cl && cl->model && cl->model->benchmarking) calibrate_model = 1; if (rank == 0) { if ((profiling && profiling_info) || calibrate_model || starpu_top) _starpu_clock_gettime(codelet_end); #ifdef HAVE_AYUDAME_H if (AYU_event) AYU_event(AYU_POSTRUNTASK, j->job_id, NULL); #endif } if (starpu_top) _starpu_top_task_ended(task,workerid,codelet_end); args->status = STATUS_UNKNOWN; } void _starpu_driver_update_job_feedback(struct _starpu_job *j, struct _starpu_worker *worker_args, enum starpu_perfmodel_archtype perf_arch, struct timespec *codelet_start, struct timespec *codelet_end, int profiling) { struct starpu_profiling_task_info *profiling_info = j->task->profiling_info; struct timespec measured_ts; double measured; int workerid = worker_args->workerid; struct starpu_codelet *cl = j->task->cl; int calibrate_model = 0; int updated = 0; #ifndef STARPU_SIMGRID if (cl->model && cl->model->benchmarking) calibrate_model = 1; #endif if ((profiling && profiling_info) || calibrate_model) { starpu_timespec_sub(codelet_end, codelet_start, &measured_ts); measured = starpu_timing_timespec_to_us(&measured_ts); if (profiling && profiling_info) { memcpy(&profiling_info->start_time, codelet_start, sizeof(struct timespec)); memcpy(&profiling_info->end_time, codelet_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->power_consumed); updated = 1; } if (calibrate_model) _starpu_update_perfmodel_history(j, j->task->cl->model, perf_arch, worker_args->devid, measured,j->nimpl); } if (!updated) _starpu_worker_update_profiling_info_executing(workerid, NULL, 1, 0, 0, 0); if (profiling_info && profiling_info->power_consumed && cl->power_model && cl->power_model->benchmarking) { _starpu_update_perfmodel_history(j, j->task->cl->power_model, perf_arch, worker_args->devid, profiling_info->power_consumed,j->nimpl); } } static void _starpu_exponential_backoff(struct _starpu_worker *args) { int delay = args->spinning_backoff; if (args->spinning_backoff < BACKOFF_MAX) args->spinning_backoff<<=1; while(delay--) STARPU_UYIELD(); } /* Workers may block when there is no work to do at all. */ struct starpu_task *_starpu_get_worker_task(struct _starpu_worker *args, int workerid, unsigned memnode) { struct starpu_task *task; STARPU_PTHREAD_MUTEX_LOCK(&args->sched_mutex); if (_starpu_worker_get_status(workerid) != STATUS_SLEEPING && _starpu_worker_get_status(workerid) != STATUS_SCHEDULING) { _STARPU_TRACE_WORKER_SCHEDULING_START; _starpu_worker_set_status(workerid, STATUS_SCHEDULING); } task = _starpu_pop_task(args); if (task == NULL) { /* 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. */ if ( _starpu_worker_get_status(workerid) == STATUS_WAKING_UP) _starpu_worker_set_status(workerid, STATUS_SLEEPING); else if (_starpu_worker_get_status(workerid) != STATUS_SLEEPING) { _STARPU_TRACE_WORKER_SLEEP_START; _starpu_worker_restart_sleeping(workerid); _starpu_worker_set_status(workerid, STATUS_SLEEPING); } if (_starpu_worker_can_block(memnode, args) #ifndef STARPU_SIMGRID && !_starpu_sched_ctx_last_worker_awake(args) #endif ) { STARPU_PTHREAD_COND_WAIT(&args->sched_cond, &args->sched_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&args->sched_mutex); } else { STARPU_PTHREAD_MUTEX_UNLOCK(&args->sched_mutex); if (_starpu_machine_is_running()) { _starpu_exponential_backoff(args); #ifdef STARPU_SIMGRID static int warned; if (!warned) { warned = 1; _STARPU_DISP("Has to make simgrid spin for CPU idle time. You can try to pass --enable-blocking-drivers to ./configure to avoid this\n"); } MSG_process_sleep(0.000010); #endif } } return NULL; } if (_starpu_worker_get_status(workerid) == STATUS_SCHEDULING) { _STARPU_TRACE_WORKER_SCHEDULING_END; _starpu_worker_set_status(workerid, STATUS_UNKNOWN); } if (_starpu_worker_get_status(workerid) == STATUS_SLEEPING || _starpu_worker_get_status(workerid) == STATUS_WAKING_UP) { _STARPU_TRACE_WORKER_SLEEP_END; _starpu_worker_stop_sleeping(workerid); _starpu_worker_set_status(workerid, STATUS_UNKNOWN); } args->spinning_backoff = BACKOFF_MIN; STARPU_PTHREAD_MUTEX_UNLOCK(&args->sched_mutex); #ifdef HAVE_AYUDAME_H if (AYU_event) { intptr_t id = workerid; AYU_event(AYU_PRERUNTASK, _starpu_get_job_associated_to_task(task)->job_id, &id); } #endif return task; } starpu-1.1.5/src/drivers/cpu/0002755000373600000000000000000012571541161013067 500000000000000starpu-1.1.5/src/drivers/cpu/driver_cpu.h0000644000373600000000000000300312571536575015331 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2014 Université de Bordeaux * Copyright (C) 2010, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_CPU_H__ #define __DRIVER_CPU_H__ #include #include #include #include #include #include #include #include #ifdef STARPU_USE_CPU void *_starpu_cpu_worker(void *); struct _starpu_worker; int _starpu_run_cpu(struct _starpu_worker *); int _starpu_cpu_driver_init(struct _starpu_worker *); int _starpu_cpu_driver_run_once(struct _starpu_worker *); int _starpu_cpu_driver_deinit(struct _starpu_worker *); void _starpu_cpu_discover_devices(struct _starpu_machine_config *config); #else #define _starpu_cpu_discover_devices(config) do { \ (config)->topology.nhwcpus = 1; \ } while (0) #endif /* !STARPU_USE_CPU */ #endif // __DRIVER_CPU_H__ starpu-1.1.5/src/drivers/cpu/driver_cpu.c0000644000373600000000000002616412571536575015341 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2014 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "driver_cpu.h" #include #include #include #ifdef STARPU_HAVE_HWLOC #include #ifndef HWLOC_API_VERSION #define HWLOC_OBJ_PU HWLOC_OBJ_PROC #endif #endif #ifdef STARPU_HAVE_WINDOWS #include #endif #ifdef STARPU_SIMGRID #include #endif #ifdef STARPU_SIMGRID void _starpu_cpu_discover_devices(struct _starpu_machine_config *config) { config->topology.nhwcpus = _starpu_simgrid_get_nbhosts("CPU"); } #elif defined(STARPU_HAVE_HWLOC) void _starpu_cpu_discover_devices(struct _starpu_machine_config *config) { /* Discover the CPUs relying on the hwloc interface and fills CONFIG * accordingly. */ struct _starpu_machine_topology *topology = &config->topology; config->cpu_depth = hwloc_get_type_depth (topology->hwtopology, HWLOC_OBJ_CORE); /* 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); } #elif defined(HAVE_SYSCONF) void _starpu_cpu_discover_devices(struct _starpu_machine_config *config) { /* Discover the CPUs relying on the sysconf(3) function and fills * CONFIG accordingly. */ config->topology.nhwcpus = sysconf(_SC_NPROCESSORS_ONLN); } #elif defined(__MINGW32__) || defined(__CYGWIN__) void _starpu_cpu_discover_devices(struct _starpu_machine_config *config) { /* Discover the CPUs on Cygwin and MinGW systems. */ SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); config->topology.nhwcpus = sysinfo.dwNumberOfProcessors; } #else #warning no way to know number of cores, assuming 1 void _starpu_cpu_discover_devices(struct _starpu_machine_config *config) { config->topology.nhwcpus = 1; } #endif /* Actually launch the job on a cpu worker. * Handle binding CPUs on cores. * In the case of a combined worker WORKER_TASK != J->TASK */ static int execute_job_on_cpu(struct _starpu_job *j, struct starpu_task *worker_task, struct _starpu_worker *cpu_args, int rank, enum starpu_perfmodel_archtype perf_arch) { int ret; int is_parallel_task = (j->task_size > 1); int profiling = starpu_profiling_status_get(); struct timespec codelet_start, codelet_end; struct starpu_task *task = j->task; struct starpu_codelet *cl = task->cl; STARPU_ASSERT(cl); if (rank == 0) { ret = _starpu_fetch_task_input(j, 0); if (ret != 0) { /* there was not enough memory so the codelet cannot be executed right now ... */ /* push the codelet back and try another one ... */ return -EAGAIN; } } if (is_parallel_task) { STARPU_PTHREAD_BARRIER_WAIT(&j->before_work_barrier); /* In the case of a combined worker, the scheduler needs to know * when each actual worker begins the execution */ _starpu_sched_pre_exec_hook(worker_task); } /* Give profiling variable */ _starpu_driver_start_job(cpu_args, j, &codelet_start, rank, profiling); /* In case this is a Fork-join parallel task, the worker does not * execute the kernel at all. */ if ((rank == 0) || (cl->type != STARPU_FORKJOIN)) { _starpu_cl_func_t func = _starpu_task_get_cpu_nth_implementation(cl, j->nimpl); if (is_parallel_task && cl->type == STARPU_FORKJOIN) /* bind to parallel worker */ _starpu_bind_thread_on_cpus(cpu_args->config, _starpu_get_combined_worker_struct(j->combined_workerid)); STARPU_ASSERT_MSG(func, "when STARPU_CPU is defined in 'where', cpu_func or cpu_funcs has to be defined"); if (_starpu_get_disable_kernels() <= 0) { #ifdef STARPU_SIMGRID _starpu_simgrid_execute_job(j, perf_arch, NAN); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #endif } if (is_parallel_task && cl->type == STARPU_FORKJOIN) /* rebind to single CPU */ _starpu_bind_thread_on_cpu(cpu_args->config, cpu_args->bindid); } _starpu_driver_end_job(cpu_args, j, perf_arch, &codelet_end, rank, profiling); if (is_parallel_task) { STARPU_PTHREAD_BARRIER_WAIT(&j->after_work_barrier); 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); } } if (rank == 0) { _starpu_driver_update_job_feedback(j, cpu_args, perf_arch, &codelet_start, &codelet_end, profiling); _starpu_push_task_output(j, 0); } return 0; } static size_t _starpu_cpu_get_global_mem_size(int nodeid STARPU_ATTRIBUTE_UNUSED, struct _starpu_machine_config *config) { size_t global_mem; starpu_ssize_t limit; limit = starpu_get_env_number("STARPU_LIMIT_CPU_MEM"); #ifdef STARPU_DEVEL # warning TODO: take into account NUMA node and check STARPU_LIMIT_CPU_numanode_MEM #endif #if defined(STARPU_HAVE_HWLOC) struct _starpu_machine_topology *topology = &config->topology; #if 0 /* Do not limit ourself to a single NUMA node yet, as we don't have real NUMA support for now */ int depth_node = hwloc_get_type_depth(topology->hwtopology, HWLOC_OBJ_NODE); if (depth_node == HWLOC_TYPE_DEPTH_UNKNOWN) global_mem = hwloc_get_root_obj(topology->hwtopology)->memory.total_memory; else global_mem = hwloc_get_obj_by_depth(topology->hwtopology, depth_node, nodeid)->memory.local_memory; #else global_mem = hwloc_get_root_obj(topology->hwtopology)->memory.total_memory; #endif #else /* STARPU_HAVE_HWLOC */ #ifdef STARPU_DEVEL # warning use sysinfo when available to get global size #endif global_mem = 0; #endif if (limit < 0) // No limit is defined, we return the global memory size return global_mem; else if (global_mem && (size_t)limit * 1024*1024 > global_mem) // The requested limit is higher than what is available, we return the global memory size return global_mem; else // We limit the memory return limit*1024*1024; } int _starpu_cpu_driver_init(struct _starpu_worker *cpu_worker) { int devid = cpu_worker->devid; _starpu_worker_start(cpu_worker, _STARPU_FUT_CPU_KEY); /* FIXME: when we have NUMA support, properly turn node number into NUMA node number */ _starpu_memory_manager_set_global_memory_size(cpu_worker->memory_node, _starpu_cpu_get_global_mem_size(cpu_worker->memory_node, cpu_worker->config)); snprintf(cpu_worker->name, sizeof(cpu_worker->name), "CPU %d", devid); snprintf(cpu_worker->short_name, sizeof(cpu_worker->short_name), "CPU %d", devid); cpu_worker->status = STATUS_UNKNOWN; _STARPU_TRACE_WORKER_INIT_END; /* 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; } int _starpu_cpu_driver_run_once(struct _starpu_worker *cpu_worker) { unsigned memnode = cpu_worker->memory_node; int workerid = cpu_worker->workerid; _STARPU_TRACE_START_PROGRESS(memnode); _starpu_datawizard_progress(memnode, 1); _STARPU_TRACE_END_PROGRESS(memnode); struct _starpu_job *j; struct starpu_task *task; int res; task = _starpu_get_worker_task(cpu_worker, workerid, memnode); if (!task) return 0; j = _starpu_get_job_associated_to_task(task); /* can a cpu perform that task ? */ if (!_STARPU_CPU_MAY_PERFORM(j)) { /* put it and the end of the queue ... XXX */ _starpu_push_task_to_workers(task); return 0; } int rank = 0; int is_parallel_task = (j->task_size > 1); enum starpu_perfmodel_archtype perf_arch; /* Get the rank in case it is a parallel task */ if (is_parallel_task) { STARPU_PTHREAD_MUTEX_LOCK(&j->sync_mutex); rank = j->active_task_alias_count++; STARPU_PTHREAD_MUTEX_UNLOCK(&j->sync_mutex); struct _starpu_combined_worker *combined_worker; combined_worker = _starpu_get_combined_worker_struct(j->combined_workerid); cpu_worker->combined_workerid = j->combined_workerid; cpu_worker->worker_size = combined_worker->worker_size; cpu_worker->current_rank = rank; perf_arch = combined_worker->perf_arch; } else { cpu_worker->combined_workerid = cpu_worker->workerid; cpu_worker->worker_size = 1; cpu_worker->current_rank = 0; perf_arch = cpu_worker->perf_arch; } _starpu_set_current_task(j->task); cpu_worker->current_task = j->task; res = execute_job_on_cpu(j, task, cpu_worker, rank, perf_arch); _starpu_set_current_task(NULL); cpu_worker->current_task = NULL; if (res) { switch (res) { case -EAGAIN: _starpu_push_task_to_workers(task); 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_deinit(struct _starpu_worker *cpu_worker) { _STARPU_TRACE_WORKER_DEINIT_START; unsigned memnode = cpu_worker->memory_node; _starpu_handle_all_pending_node_data_requests(memnode); /* In case there remains some memory that was automatically * allocated by StarPU, we release it now. Note that data * coherency is not maintained anymore at that point ! */ _starpu_free_all_automatically_allocated_buffers(memnode); cpu_worker->worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_CPU_KEY); return 0; } void * _starpu_cpu_worker(void *arg) { struct _starpu_worker *args = arg; _starpu_cpu_driver_init(args); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_cpu_driver_run_once(args); } _starpu_cpu_driver_deinit(args); return NULL; } int _starpu_run_cpu(struct _starpu_worker *worker) { worker->set = NULL; worker->worker_is_initialized = 0; _starpu_cpu_worker(worker); return 0; } starpu-1.1.5/src/drivers/opencl/0002755000373600000000000000000012571541161013560 500000000000000starpu-1.1.5/src/drivers/opencl/driver_opencl.c0000644000373600000000000006247312571536576016527 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include "driver_opencl.h" #include "driver_opencl_utils.h" #include #include #include #include #ifdef STARPU_SIMGRID #include #endif static int nb_devices = -1; static int init_done = 0; static starpu_pthread_mutex_t big_lock = STARPU_PTHREAD_MUTEX_INITIALIZER; static size_t global_mem[STARPU_MAXOPENCLDEVS]; #ifdef STARPU_USE_OPENCL static cl_context contexts[STARPU_MAXOPENCLDEVS]; static cl_device_id devices[STARPU_MAXOPENCLDEVS]; static cl_command_queue queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue in_transfer_queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue out_transfer_queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue peer_transfer_queues[STARPU_MAXOPENCLDEVS]; static cl_command_queue alloc_queues[STARPU_MAXOPENCLDEVS]; #endif 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; char name[30]; #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); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); totalGlobalMem = size; #endif limit = starpu_get_env_number("STARPU_LIMIT_OPENCL_MEM"); if (limit == -1) { sprintf(name, "STARPU_LIMIT_OPENCL_%u_MEM", devid); limit = starpu_get_env_number(name); } #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) if (limit == -1) { /* Use 90% of the available memory by default. */ limit = totalGlobalMem / (1024*1024) * 0.9; } #endif global_mem[devid] = limit * 1024*1024; #ifdef STARPU_USE_OPENCL /* How much memory to waste ? */ to_waste = totalGlobalMem - global_mem[devid]; #endif _STARPU_DEBUG("OpenCL device %d: 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]; } #ifndef STARPU_SIMGRID cl_int _starpu_opencl_init_context(int devid) { 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); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clGetDeviceInfo(devices[devid], CL_DEVICE_MEM_BASE_ADDR_ALIGN, sizeof(uint), &uint, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_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); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_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); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); props &= ~CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE; in_transfer_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], props, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); out_transfer_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], props, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); peer_transfer_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], props, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); alloc_queues[devid] = clCreateCommandQueue(contexts[devid], devices[devid], 0, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); STARPU_PTHREAD_MUTEX_UNLOCK(&big_lock); return CL_SUCCESS; } cl_int _starpu_opencl_deinit_context(int devid) { cl_int err; STARPU_PTHREAD_MUTEX_LOCK(&big_lock); _STARPU_DEBUG("De-initialising context for dev %d\n", devid); err = clReleaseContext(contexts[devid]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseCommandQueue(queues[devid]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseCommandQueue(in_transfer_queues[devid]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseCommandQueue(out_transfer_queues[devid]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseCommandQueue(peer_transfer_queues[devid]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseCommandQueue(alloc_queues[devid]); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); contexts[devid] = NULL; STARPU_PTHREAD_MUTEX_UNLOCK(&big_lock); return CL_SUCCESS; } #endif cl_int starpu_opencl_allocate_memory(int devid, 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_SUCCESS) STARPU_OPENCL_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; if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); clWaitForEvents(1, &ev); clReleaseEvent(ev); *mem = memory; return CL_SUCCESS; #endif } cl_int starpu_opencl_copy_ram_to_opencl(void *ptr, unsigned src_node STARPU_ATTRIBUTE_UNUSED, cl_mem buffer, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size, size_t offset, cl_event *event, int *ret) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cl_event ev; err = clEnqueueWriteBuffer(in_transfer_queues[worker->devid], buffer, CL_FALSE, offset, size, ptr, 0, NULL, &ev); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_LIKELY(err == CL_SUCCESS)) { if (event == NULL) { /* We want a synchronous copy, let's synchronise the queue */ err = clWaitForEvents(1, &ev); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseEvent(ev); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); } else { *event = ev; } if (ret) { *ret = (event == NULL) ? 0 : -EAGAIN; } } return err; } cl_int starpu_opencl_copy_opencl_to_ram(cl_mem buffer, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *ptr, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t size, size_t offset, cl_event *event, int *ret) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cl_event ev; err = clEnqueueReadBuffer(out_transfer_queues[worker->devid], buffer, CL_FALSE, offset, size, ptr, 0, NULL, &ev); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_LIKELY(err == CL_SUCCESS)) { if (event == NULL) { /* We want a synchronous copy, let's synchronise the queue */ err = clWaitForEvents(1, &ev); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseEvent(ev); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); } else { *event = ev; } if (ret) { *ret = (event == NULL) ? 0 : -EAGAIN; } } return err; } cl_int starpu_opencl_copy_opencl_to_opencl(cl_mem src, unsigned src_node STARPU_ATTRIBUTE_UNUSED, size_t src_offset, cl_mem dst, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, size_t dst_offset, size_t size, cl_event *event, int *ret) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); cl_event ev; err = clEnqueueCopyBuffer(peer_transfer_queues[worker->devid], src, dst, src_offset, dst_offset, size, 0, NULL, &ev); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (STARPU_LIKELY(err == CL_SUCCESS)) { if (event == NULL) { /* We want a synchronous copy, let's synchronise the queue */ err = clWaitForEvents(1, &ev); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); err = clReleaseEvent(ev); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); } else { *event = ev; } if (ret) { *ret = (event == NULL) ? 0 : -EAGAIN; } } return err; } #ifdef STARPU_USE_OPENCL cl_int starpu_opencl_copy_async_sync(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event) { enum starpu_node_kind src_kind = starpu_node_get_kind(src_node); enum starpu_node_kind dst_kind = starpu_node_get_kind(dst_node); cl_int err; int ret; switch (_STARPU_MEMORY_NODE_TUPLE(src_kind,dst_kind)) { case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_CPU_RAM): err = starpu_opencl_copy_opencl_to_ram( (cl_mem) src, src_node, (void*) (dst + dst_offset), dst_node, size, src_offset, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); return ret; case _STARPU_MEMORY_NODE_TUPLE(STARPU_CPU_RAM,STARPU_OPENCL_RAM): err = starpu_opencl_copy_ram_to_opencl( (void*) (src + src_offset), src_node, (cl_mem) dst, dst_node, size, dst_offset, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); return ret; case _STARPU_MEMORY_NODE_TUPLE(STARPU_OPENCL_RAM,STARPU_OPENCL_RAM): err = starpu_opencl_copy_opencl_to_opencl( (cl_mem) src, src_node, src_offset, (cl_mem) dst, dst_node, dst_offset, size, event, &ret); if (STARPU_UNLIKELY(err)) STARPU_OPENCL_REPORT_ERROR(err); return ret; default: STARPU_ABORT(); break; } } #endif #if 0 cl_int _starpu_opencl_copy_rect_opencl_to_ram(cl_mem buffer, unsigned src_node STARPU_ATTRIBUTE_UNUSED, void *ptr, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); cl_bool blocking; blocking = (event == NULL) ? CL_TRUE : CL_FALSE; if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); err = clEnqueueReadBufferRect(out_transfer_queues[worker->devid], buffer, blocking, buffer_origin, host_origin, region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, 0, NULL, event); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); return CL_SUCCESS; } cl_int _starpu_opencl_copy_rect_ram_to_opencl(void *ptr, unsigned src_node STARPU_ATTRIBUTE_UNUSED, cl_mem buffer, unsigned dst_node STARPU_ATTRIBUTE_UNUSED, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event) { cl_int err; struct _starpu_worker *worker = _starpu_get_local_worker_key(); cl_bool blocking; blocking = (event == NULL) ? CL_TRUE : CL_FALSE; if (event) _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); err = clEnqueueWriteBufferRect(in_transfer_queues[worker->devid], buffer, blocking, buffer_origin, host_origin, region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, 0, NULL, event); if (event) _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); if (err != CL_SUCCESS) STARPU_OPENCL_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); // 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_worker_start(args, _STARPU_FUT_OPENCL_KEY); #ifndef STARPU_SIMGRID _starpu_opencl_init_context(devid); #endif /* one more time to avoid hacks from third party lib :) */ _starpu_bind_thread_on_cpu(args->config, args->bindid); _starpu_opencl_limit_gpu_mem_if_needed(devid); _starpu_memory_manager_set_global_memory_size(args->memory_node, _starpu_opencl_get_global_mem_size(devid)); _starpu_malloc_init(args->memory_node); args->status = STATUS_UNKNOWN; #ifdef STARPU_SIMGRID const char *devname = "Simgrid"; #else /* get the device's name */ char devname[128]; _starpu_opencl_get_device_name(devid, devname, 128); #endif snprintf(args->name, sizeof(args->name), "OpenCL %u (%s)", devid, devname); snprintf(args->short_name, sizeof(args->short_name), "OpenCL %u", devid); _STARPU_DEBUG("OpenCL (%s) dev id %d thread is ready to run on CPU %d !\n", devname, devid, args->bindid); _STARPU_TRACE_WORKER_INIT_END; /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&args->mutex); args->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&args->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&args->mutex); return 0; } int _starpu_opencl_driver_run_once(struct _starpu_worker *args) { int workerid = args->workerid; unsigned memnode = args->memory_node; struct _starpu_job *j; struct starpu_task *task; int res; _STARPU_TRACE_START_PROGRESS(memnode); _starpu_datawizard_progress(memnode, 1); _STARPU_TRACE_END_PROGRESS(memnode); task = _starpu_get_worker_task(args, workerid, memnode); if (task == NULL) return 0; j = _starpu_get_job_associated_to_task(task); /* can OpenCL do that task ? */ if (!_STARPU_OPENCL_MAY_PERFORM(j)) { /* this is not a OpenCL task */ _starpu_push_task_to_workers(task); return 0; } _starpu_set_current_task(j->task); args->current_task = j->task; res = _starpu_opencl_execute_job(j, args); _starpu_set_current_task(NULL); args->current_task = NULL; 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(); return 0; default: STARPU_ABORT(); } } _starpu_handle_job_termination(j); return 0; } int _starpu_opencl_driver_deinit(struct _starpu_worker *args) { _STARPU_TRACE_WORKER_DEINIT_START; unsigned memnode = args->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); #ifndef STARPU_SIMGRID unsigned devid = args->devid; _starpu_opencl_deinit_context(devid); #endif args->worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_OPENCL_KEY); return 0; } void *_starpu_opencl_worker(void *arg) { struct _starpu_worker* args = arg; _starpu_opencl_driver_init(args); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_opencl_driver_run_once(args); } _starpu_opencl_driver_deinit(args); 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); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_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); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); return type; } #endif /* STARPU_USE_OPENCL */ static int _starpu_opencl_execute_job(struct _starpu_job *j, struct _starpu_worker *args) { int ret; uint32_t mask = 0; STARPU_ASSERT(j); struct starpu_task *task = j->task; int profiling = starpu_profiling_status_get(); struct timespec codelet_start, codelet_end; STARPU_ASSERT(task); struct starpu_codelet *cl = task->cl; STARPU_ASSERT(cl); ret = _starpu_fetch_task_input(j, mask); if (ret != 0) { /* there was not enough memory, so the input of * the codelet cannot be fetched ... put the * codelet back, and try it later */ return -EAGAIN; } _starpu_driver_start_job(args, j, &codelet_start, 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) { #ifdef STARPU_SIMGRID double length = NAN; #ifdef STARPU_OPENCL_SIMULATOR func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #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"); length = ((double) profiling_info->used_cycles)/MSG_get_host_speed(MSG_host_self()); #endif _starpu_simgrid_execute_job(j, args->perf_arch, length); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #endif } _starpu_driver_end_job(args, j, args->perf_arch, &codelet_end, 0, profiling); _starpu_driver_update_job_feedback(j, args, args->perf_arch, &codelet_start, &codelet_end, profiling); _starpu_push_task_output(j, mask); return EXIT_SUCCESS; } #ifdef STARPU_USE_OPENCL int _starpu_run_opencl(struct _starpu_worker *workerarg) { _STARPU_DEBUG("Running OpenCL %u from the application\n", workerarg->devid); workerarg->set = NULL; workerarg->worker_is_initialized = 0; /* Let's go ! */ _starpu_opencl_worker(workerarg); return 0; } #endif /* STARPU_USE_OPENCL */ starpu-1.1.5/src/drivers/opencl/driver_opencl_utils.h0000644000373600000000000000161712571536576017745 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_OPENCL_UTILS_H__ #define __STARPU_OPENCL_UTILS_H__ #include char *_starpu_opencl_get_device_type_as_string(int id); #define _STARPU_OPENCL_PLATFORM_MAX 4 #endif /* __STARPU_OPENCL_UTILS_H__ */ starpu-1.1.5/src/drivers/opencl/driver_opencl_utils.c0000644000373600000000000004762312571536576017747 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * Copyright (C) 2010-2014 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include "driver_opencl_utils.h" #include "driver_opencl.h" #ifdef HAVE_CL_CL_EXT_H #include #endif char *_starpu_opencl_program_dir; #define _STARPU_STRINGIFY_(x) #x #define _STARPU_STRINGIFY(x) _STARPU_STRINGIFY_(x) static int _starpu_opencl_locate_file(const char *source_file_name, char *located_file_name, char *located_dir_name) { int ret = EXIT_FAILURE; _STARPU_DEBUG("Trying to locate <%s>\n", source_file_name); if (access(source_file_name, R_OK) == 0) { strcpy(located_file_name, source_file_name); ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE && _starpu_opencl_program_dir) { sprintf(located_file_name, "%s/%s", _starpu_opencl_program_dir, source_file_name); _STARPU_DEBUG("Trying to locate <%s>\n", located_file_name); if (access(located_file_name, R_OK) == 0) ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE) { sprintf(located_file_name, "%s/%s", _STARPU_STRINGIFY(STARPU_OPENCL_DATADIR), source_file_name); _STARPU_DEBUG("Trying to locate <%s>\n", located_file_name); if (access(located_file_name, R_OK) == 0) ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE) { sprintf(located_file_name, "%s/%s", STARPU_SRC_DIR, source_file_name); _STARPU_DEBUG("Trying to locate <%s>\n", located_file_name); if (access(located_file_name, R_OK) == 0) ret = EXIT_SUCCESS; } if (ret == EXIT_FAILURE) { strcpy(located_file_name, ""); strcpy(located_dir_name, ""); _STARPU_ERROR("Cannot locate file <%s>\n", source_file_name); } else { char *last = strrchr(located_file_name, '/'); if (!last) { strcpy(located_dir_name, ""); } else { sprintf(located_dir_name, "%s", located_file_name); located_dir_name[strlen(located_file_name)-strlen(last)+1] = '\0'; } } return ret; } cl_int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid) { cl_int err; cl_device_id device; cl_program program; starpu_opencl_get_device(devid, &device); starpu_opencl_get_queue(devid, queue); program = opencl_programs->programs[devid]; if (!program) { _STARPU_DISP("Program not available for device <%d>\n", devid); return CL_INVALID_PROGRAM; } // Create the compute kernel in the program we wish to run *kernel = clCreateKernel(program, kernel_name, &err); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); return CL_SUCCESS; } cl_int starpu_opencl_release_kernel(cl_kernel kernel) { cl_int err; err = clReleaseKernel(kernel); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); return CL_SUCCESS; } static char *_starpu_opencl_load_program_source(const char *filename) { struct stat statbuf; FILE *fh; char *source; int x; char c; fh = fopen(filename, "r"); if (!fh) return NULL; stat(filename, &statbuf); source = (char *) malloc(statbuf.st_size + 1); for(c=(char)fgetc(fh), x=0 ; c != EOF ; c =(char)fgetc(fh), x++) { source[x] = c; } source[x] = '\0'; _STARPU_DEBUG("OpenCL kernel <%s>\n", source); fclose(fh); return source; } static char *_starpu_opencl_load_program_binary(const char *filename, size_t *len) { struct stat statbuf; FILE *fh; char *binary; fh = fopen(filename, "r"); if (fh == 0) return NULL; stat(filename, &statbuf); binary = (char *) malloc(statbuf.st_size); if (!binary) return binary; fread(binary, statbuf.st_size, 1, fh); *len = statbuf.st_size; return binary; } static void _starpu_opencl_create_binary_directory(char *path, size_t maxlen) { static int _directory_created = 0; snprintf(path, maxlen, "%s/.starpu/opencl/", _starpu_get_home_path()); if (_directory_created == 0) { _STARPU_DEBUG("Creating directory %s\n", path); _starpu_mkpath_and_check(path, S_IRWXU); _directory_created = 1; } } char *_starpu_opencl_get_device_type_as_string(int id) { cl_device_type type; type = _starpu_opencl_get_device_type(id); switch (type) { case CL_DEVICE_TYPE_GPU: return "gpu"; case CL_DEVICE_TYPE_ACCELERATOR: return "acc"; case CL_DEVICE_TYPE_CPU: return "cpu"; default: return "unk"; } } static int _starpu_opencl_get_binary_name(char *binary_file_name, size_t maxlen, const char *source_file_name, int dev, cl_device_id device) { char binary_directory[1024]; char *p; cl_int err; cl_uint vendor_id; _starpu_opencl_create_binary_directory(binary_directory, 1024); p = strrchr(source_file_name, '/'); snprintf(binary_file_name, maxlen, "%s/%s", binary_directory, p?p:source_file_name); p = strstr(binary_file_name, ".cl"); if (p == NULL) p=binary_file_name + strlen(binary_file_name); err = clGetDeviceInfo(device, CL_DEVICE_VENDOR_ID, sizeof(vendor_id), &vendor_id, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); sprintf(p, ".%s.vendor_id_%d_device_id_%d", _starpu_opencl_get_device_type_as_string(dev), (int)vendor_id, dev); return CL_SUCCESS; } static int _starpu_opencl_compile_or_load_opencl_from_string(const char *opencl_program_source, const char* build_options, struct starpu_opencl_program *opencl_programs, const char* source_file_name) { unsigned int dev; unsigned int nb_devices; nb_devices = _starpu_opencl_get_device_count(); // Iterate over each device for(dev = 0; dev < nb_devices; dev ++) { cl_device_id device; cl_context context; cl_program program; cl_int err; if (opencl_programs) opencl_programs->programs[dev] = NULL; starpu_opencl_get_device(dev, &device); starpu_opencl_get_context(dev, &context); if (context == NULL) { _STARPU_DEBUG("[%u] is not a valid OpenCL context\n", dev); continue; } // Create the compute program from the source buffer program = clCreateProgramWithSource(context, 1, (const char **) &opencl_program_source, NULL, &err); if (!program || err != CL_SUCCESS) { _STARPU_DISP("Error: Failed to load program source with options %s!\n", build_options); return EXIT_FAILURE; } // Build the program executable err = clBuildProgram(program, 1, &device, build_options, NULL, NULL); // Get the status { cl_build_status status; size_t len; static char buffer[4096] = ""; clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); if (len > 2) _STARPU_DISP("Compilation output\n%s\n", buffer); clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_STATUS, sizeof(status), &status, NULL); if (err != CL_SUCCESS || status != CL_BUILD_SUCCESS) { _STARPU_DISP("Error: Failed to build program executable!\n"); _STARPU_DISP("clBuildProgram: %d - clGetProgramBuildInfo: %d\n", err, status); return EXIT_FAILURE; } } // Store program if (opencl_programs) opencl_programs->programs[dev] = program; else { char binary_file_name[1024]; char *binary; size_t binary_len; FILE *fh; err = _starpu_opencl_get_binary_name(binary_file_name, 1024, source_file_name, dev, device); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); err = clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, sizeof(size_t), &binary_len, NULL); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); binary = malloc(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); } } return EXIT_SUCCESS; } void starpu_opencl_load_program_source(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); sprintf(opencl_program_source, "%s", 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; char located_file_name[1024]; char located_dir_name[1024]; char new_build_options[1024]; char opencl_program_source[16384]; // 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(source_file_name, located_file_name, located_dir_name, opencl_program_source); if (!build_options) build_options = ""; if (!strcmp(located_dir_name, "")) strcpy(new_build_options, build_options); else if (build_options) sprintf(new_build_options, "-I %s %s", located_dir_name, build_options); else sprintf(new_build_options, "-I %s", located_dir_name); _STARPU_DEBUG("Build options: <%s>\n", new_build_options); return _starpu_opencl_compile_or_load_opencl_from_string(opencl_program_source, new_build_options, opencl_programs, source_file_name); } int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_file(source_file_name, NULL, build_options); } int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_string(opencl_program_source, build_options, NULL, file_name); } int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_string(opencl_program_source, build_options, opencl_programs, NULL); } int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char* build_options) { return _starpu_opencl_compile_or_load_opencl_from_file(source_file_name, opencl_programs, build_options); } int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs) { unsigned int dev; unsigned int nb_devices; nb_devices = _starpu_opencl_get_device_count(); // Iterate over each device for(dev = 0; dev < nb_devices; dev ++) { cl_device_id device; cl_context context; cl_program program; cl_int err; char *binary; char binary_file_name[1024]; size_t length; cl_int binary_status; opencl_programs->programs[dev] = NULL; starpu_opencl_get_device(dev, &device); starpu_opencl_get_context(dev, &context); if (context == NULL) { _STARPU_DEBUG("[%u] is not a valid OpenCL context\n", dev); continue; } // Load the binary buffer err = _starpu_opencl_get_binary_name(binary_file_name, 1024, kernel_id, dev, device); if (STARPU_UNLIKELY(err != CL_SUCCESS)) STARPU_OPENCL_REPORT_ERROR(err); binary = _starpu_opencl_load_program_binary(binary_file_name, &length); // Create the compute program from the binary buffer program = clCreateProgramWithBinary(context, 1, &device, &length, (const unsigned char **) &binary, &binary_status, &err); if (!program || err != CL_SUCCESS) { _STARPU_DISP("Error: Failed to load program binary!\n"); return EXIT_FAILURE; } // Build the program executable err = clBuildProgram(program, 1, &device, NULL, NULL, NULL); // Get the status { cl_build_status status; size_t len; static char buffer[4096] = ""; clGetProgramBuildInfo(program, device, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); if (len > 2) _STARPU_DISP("Compilation output\n%s\n", 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; } 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->power_model && task->cl->power_model->benchmarking))) { cl_int err; double power_consumed; size_t size; err = clGetEventProfilingInfo(event, CL_PROFILING_POWER_CONSUMED, sizeof(power_consumed), &power_consumed, &size); if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err); STARPU_ASSERT(size == sizeof(power_consumed)); info->power_consumed += power_consumed; } #endif return 0; } const char *starpu_opencl_error_string(cl_int status) { const char *errormsg; switch (status) { case CL_SUCCESS: errormsg = "Success"; break; case CL_DEVICE_NOT_FOUND: errormsg = "Device not found"; break; case CL_DEVICE_NOT_AVAILABLE: errormsg = "Device not available"; break; case CL_COMPILER_NOT_AVAILABLE: errormsg = "Compiler not available"; break; case CL_MEM_OBJECT_ALLOCATION_FAILURE: errormsg = "Memory object allocation failure"; break; case CL_OUT_OF_RESOURCES: errormsg = "Out of resources"; break; case CL_OUT_OF_HOST_MEMORY: errormsg = "Out of host memory"; break; case CL_PROFILING_INFO_NOT_AVAILABLE: errormsg = "Profiling info not available"; break; case CL_MEM_COPY_OVERLAP: errormsg = "Memory copy overlap"; break; case CL_IMAGE_FORMAT_MISMATCH: errormsg = "Image format mismatch"; break; case CL_IMAGE_FORMAT_NOT_SUPPORTED: errormsg = "Image format not supported"; break; case CL_BUILD_PROGRAM_FAILURE: errormsg = "Build program failure"; break; case CL_MAP_FAILURE: errormsg = "Map failure"; break; case CL_INVALID_VALUE: errormsg = "Invalid value"; break; case CL_INVALID_DEVICE_TYPE: errormsg = "Invalid device type"; break; case CL_INVALID_PLATFORM: errormsg = "Invalid platform"; break; case CL_INVALID_DEVICE: errormsg = "Invalid device"; break; case CL_INVALID_CONTEXT: errormsg = "Invalid context"; break; case CL_INVALID_QUEUE_PROPERTIES: errormsg = "Invalid queue properties"; break; case CL_INVALID_COMMAND_QUEUE: errormsg = "Invalid command queue"; break; case CL_INVALID_HOST_PTR: errormsg = "Invalid host pointer"; break; case CL_INVALID_MEM_OBJECT: errormsg = "Invalid memory object"; break; case CL_INVALID_IMAGE_FORMAT_DESCRIPTOR: errormsg = "Invalid image format descriptor"; break; case CL_INVALID_IMAGE_SIZE: errormsg = "Invalid image size"; break; case CL_INVALID_SAMPLER: errormsg = "Invalid sampler"; break; case CL_INVALID_BINARY: errormsg = "Invalid binary"; break; case CL_INVALID_BUILD_OPTIONS: errormsg = "Invalid build options"; break; case CL_INVALID_PROGRAM: errormsg = "Invalid program"; break; case CL_INVALID_PROGRAM_EXECUTABLE: errormsg = "Invalid program executable"; break; case CL_INVALID_KERNEL_NAME: errormsg = "Invalid kernel name"; break; case CL_INVALID_KERNEL_DEFINITION: errormsg = "Invalid kernel definition"; break; case CL_INVALID_KERNEL: errormsg = "Invalid kernel"; break; case CL_INVALID_ARG_INDEX: errormsg = "Invalid argument index"; break; case CL_INVALID_ARG_VALUE: errormsg = "Invalid argument value"; break; case CL_INVALID_ARG_SIZE: errormsg = "Invalid argument size"; break; case CL_INVALID_KERNEL_ARGS: errormsg = "Invalid kernel arguments"; break; case CL_INVALID_WORK_DIMENSION: errormsg = "Invalid work dimension"; break; case CL_INVALID_WORK_GROUP_SIZE: errormsg = "Invalid work group size"; break; case CL_INVALID_WORK_ITEM_SIZE: errormsg = "Invalid work item size"; break; case CL_INVALID_GLOBAL_OFFSET: errormsg = "Invalid global offset"; break; case CL_INVALID_EVENT_WAIT_LIST: errormsg = "Invalid event wait list"; break; case CL_INVALID_EVENT: errormsg = "Invalid event"; break; case CL_INVALID_OPERATION: errormsg = "Invalid operation"; break; case CL_INVALID_GL_OBJECT: errormsg = "Invalid GL object"; break; case CL_INVALID_BUFFER_SIZE: errormsg = "Invalid buffer size"; break; case CL_INVALID_MIP_LEVEL: errormsg = "Invalid MIP level"; break; #ifdef CL_PLATFORM_NOT_FOUND_KHR case CL_PLATFORM_NOT_FOUND_KHR: errormsg = "Platform not found"; break; #endif default: errormsg = "unknown OpenCL error"; break; } return errormsg; } void starpu_opencl_display_error(const char *func, const char *file, int line, const char* msg, cl_int status) { printf("oops in %s (%s:%d) (%s) ... <%s> (%d) \n", func, file, line, msg, starpu_opencl_error_string (status), status); } int starpu_opencl_set_kernel_args(cl_int *error, cl_kernel *kernel, ...) { int i; va_list ap; va_start(ap, kernel); for (i = 0; ; i++) { int size = va_arg(ap, int); if (size == 0) break; cl_mem *ptr = va_arg(ap, cl_mem *); int err = clSetKernelArg(*kernel, i, size, ptr); if (STARPU_UNLIKELY(err != CL_SUCCESS)) { *error = err; break; } } va_end(ap); return i; } starpu-1.1.5/src/drivers/opencl/driver_opencl.h0000644000373600000000000000560612571536576016527 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2011, 2013-2014 Université de Bordeaux * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __DRIVER_OPENCL_H__ #define __DRIVER_OPENCL_H__ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifdef STARPU_USE_OPENCL #ifdef __APPLE__ #include #else #include #endif #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) struct _starpu_machine_config; void _starpu_opencl_discover_devices(struct _starpu_machine_config *config); #else #define _starpu_opencl_discover_devices(config) ((void) (config)) #endif #ifdef STARPU_USE_OPENCL extern char *_starpu_opencl_program_dir; extern int _starpu_opencl_init_context(int devid); extern int _starpu_opencl_deinit_context(int devid); #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) extern unsigned _starpu_opencl_get_device_count(void); #endif #ifdef STARPU_USE_OPENCL extern cl_device_type _starpu_opencl_get_device_type(int devid); #if 0 extern cl_int _starpu_opencl_copy_rect_opencl_to_ram(cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event); extern cl_int _starpu_opencl_copy_rect_ram_to_opencl(void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, const size_t buffer_origin[3], const size_t host_origin[3], const size_t region[3], size_t buffer_row_pitch, size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, cl_event *event); #endif #endif #if defined(STARPU_USE_OPENCL) || defined(STARPU_SIMGRID) extern void _starpu_opencl_init(void); extern void *_starpu_opencl_worker(void *); #endif #ifdef STARPU_USE_OPENCL struct _starpu_worker; extern int _starpu_run_opencl(struct _starpu_worker *); extern int _starpu_opencl_driver_init(struct _starpu_worker *); extern int _starpu_opencl_driver_run_once(struct _starpu_worker *); extern int _starpu_opencl_driver_deinit(struct _starpu_worker *); #endif // STARPU_USE_OPENCL #endif // __DRIVER_OPENCL_H__ starpu-1.1.5/src/drivers/cuda/0002755000373600000000000000000012571541161013214 500000000000000starpu-1.1.5/src/drivers/cuda/starpu_cublas.c0000644000373600000000000000270212571536576016164 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012, 2014 Université de Bordeaux * Copyright (C) 2010, 2011, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_USE_CUDA #include static void init_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED) { cublasStatus cublasst = cublasInit(); if (STARPU_UNLIKELY(cublasst)) STARPU_CUBLAS_REPORT_ERROR(cublasst); cublasSetKernelStream(starpu_cuda_get_local_stream()); } static void shutdown_cublas_func(void *args STARPU_ATTRIBUTE_UNUSED) { cublasShutdown(); } #endif void starpu_cublas_init(void) { #ifdef STARPU_USE_CUDA starpu_execute_on_each_worker(init_cublas_func, NULL, STARPU_CUDA); #endif } void starpu_cublas_shutdown(void) { #ifdef STARPU_USE_CUDA starpu_execute_on_each_worker(shutdown_cublas_func, NULL, STARPU_CUDA); #endif } starpu-1.1.5/src/drivers/cuda/driver_cuda.c0000644000373600000000000004515212571536576015612 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * Copyright (C) 2010 Mehdi Juhoor * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * Copyright (C) 2011 Télécom-SudParis * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include "driver_cuda.h" #include #ifdef HAVE_CUDA_GL_INTEROP_H #include #endif #include #include #include #ifdef STARPU_SIMGRID #include #endif #ifdef STARPU_USE_CUDA #if CUDART_VERSION >= 5000 /* Avoid letting our streams spuriously synchonize with the NULL stream */ #define starpu_cudaStreamCreate(stream) cudaStreamCreateWithFlags(stream, cudaStreamNonBlocking) #else #define starpu_cudaStreamCreate(stream) cudaStreamCreate(stream) #endif #endif /* the number of CUDA devices */ static int ncudagpus; static size_t global_mem[STARPU_NMAXWORKERS]; #ifdef STARPU_USE_CUDA static cudaStream_t streams[STARPU_NMAXWORKERS]; static cudaStream_t out_transfer_streams[STARPU_MAXCUDADEVS]; static cudaStream_t in_transfer_streams[STARPU_MAXCUDADEVS]; /* Note: streams are not thread-safe, so we define them for each CUDA worker * emitting a GPU-GPU transfer */ static cudaStream_t in_peer_transfer_streams[STARPU_MAXCUDADEVS][STARPU_MAXCUDADEVS]; static cudaStream_t out_peer_transfer_streams[STARPU_MAXCUDADEVS][STARPU_MAXCUDADEVS]; static struct cudaDeviceProp props[STARPU_MAXCUDADEVS]; #endif /* STARPU_USE_CUDA */ void _starpu_cuda_discover_devices (struct _starpu_machine_config *config) { /* Discover the number of CUDA devices. Fill the result in CONFIG. */ #ifdef STARPU_SIMGRID config->topology.nhwcudagpus = _starpu_simgrid_get_nbhosts("CUDA"); #else int cnt; cudaError_t cures; cures = cudaGetDeviceCount (&cnt); if (STARPU_UNLIKELY(cures != cudaSuccess)) cnt = 0; config->topology.nhwcudagpus = cnt; #endif } /* In case we want to cap the amount of memory available on the GPUs by the * mean of the STARPU_LIMIT_CUDA_MEM, we decrease the value of * global_mem[devid] which is the value returned by * _starpu_cuda_get_global_mem_size() to indicate how much memory can * be allocated on the device */ static void _starpu_cuda_limit_gpu_mem_if_needed(unsigned devid) { starpu_ssize_t limit; size_t STARPU_ATTRIBUTE_UNUSED totalGlobalMem = 0; size_t STARPU_ATTRIBUTE_UNUSED to_waste = 0; char name[30]; #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) { sprintf(name, "STARPU_LIMIT_CUDA_%u_MEM", devid); limit = starpu_get_env_number(name); } #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) if (limit == -1) { /* Use 90% of the available memory by default. */ limit = totalGlobalMem / (1024*1024) * 0.9; } #endif global_mem[devid] = limit * 1024*1024; #ifdef STARPU_USE_CUDA /* How much memory to waste ? */ to_waste = totalGlobalMem - global_mem[devid]; props[devid].totalGlobalMem -= to_waste; #endif /* STARPU_USE_CUDA */ _STARPU_DEBUG("CUDA device %u: Wasting %ld MB / Limit %ld MB / Total %ld MB / Remains %ld MB\n", devid, (long) to_waste/(1024*1024), (long) limit, (long) totalGlobalMem/(1024*1024), (long) (totalGlobalMem - to_waste)/(1024*1024)); } #ifdef STARPU_USE_CUDA cudaStream_t starpu_cuda_get_local_in_transfer_stream() { int worker = starpu_worker_get_id(); int devid = starpu_worker_get_devid(worker); cudaStream_t stream; stream = in_transfer_streams[devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_local_out_transfer_stream() { int worker = starpu_worker_get_id(); int devid = starpu_worker_get_devid(worker); cudaStream_t stream; stream = out_transfer_streams[devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_peer_transfer_stream(unsigned src_node, unsigned dst_node) { int worker = starpu_worker_get_id(); int devid = starpu_worker_get_devid(worker); int src_devid = _starpu_memory_node_get_devid(src_node); int dst_devid = _starpu_memory_node_get_devid(dst_node); cudaStream_t stream; STARPU_ASSERT(devid == src_devid || devid == dst_devid); if (devid == dst_devid) stream = in_peer_transfer_streams[src_devid][dst_devid]; else stream = out_peer_transfer_streams[src_devid][dst_devid]; STARPU_ASSERT(stream); return stream; } cudaStream_t starpu_cuda_get_local_stream(void) { int worker = starpu_worker_get_id(); return streams[worker]; } const struct cudaDeviceProp *starpu_cuda_get_device_properties(unsigned workerid) { struct _starpu_machine_config *config = _starpu_get_machine_config(); unsigned devid = config->workers[workerid].devid; return &props[devid]; } #endif /* STARPU_USE_CUDA */ void starpu_cuda_set_device(unsigned devid STARPU_ATTRIBUTE_UNUSED) { #ifdef STARPU_SIMGRID STARPU_ABORT(); #else cudaError_t cures; struct starpu_conf *conf = &_starpu_get_machine_config()->conf; #if !defined(HAVE_CUDA_MEMCPY_PEER) && defined(HAVE_CUDA_GL_INTEROP_H) unsigned i; #endif #ifdef HAVE_CUDA_MEMCPY_PEER if (conf->n_cuda_opengl_interoperability) { fprintf(stderr, "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) { fprintf(stderr,"OpenGL interoperability was requested, but cuda_gl_interop.h could not be compiled, please make sure that OpenGL headers were available before ./configure run."); STARPU_ABORT(); } #else for (i = 0; i < conf->n_cuda_opengl_interoperability; i++) if (conf->cuda_opengl_interoperability[i] == devid) { cures = cudaGLSetGLDevice(devid); goto done; } #endif cures = cudaSetDevice(devid); #if !defined(HAVE_CUDA_MEMCPY_PEER) && defined(HAVE_CUDA_GL_INTEROP_H) done: #endif if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); #endif } #ifndef STARPU_SIMGRID static void init_context(unsigned devid) { cudaError_t cures; int workerid; int i; /* TODO: cudaSetDeviceFlag(cudaDeviceMapHost) */ starpu_cuda_set_device(devid); #ifdef HAVE_CUDA_MEMCPY_PEER if (starpu_get_env_number("STARPU_ENABLE_CUDA_GPU_GPU_DIRECT") != 0) { int nworkers = starpu_worker_get_count(); for (workerid = 0; workerid < nworkers; workerid++) { struct _starpu_worker *worker = _starpu_get_worker_struct(workerid); if (worker->arch == STARPU_CUDA_WORKER && worker->devid != devid) { int can; cures = cudaDeviceCanAccessPeer(&can, devid, worker->devid); if (!cures && can) { cures = cudaDeviceEnablePeerAccess(worker->devid, 0); if (!cures) _STARPU_DEBUG("Enabled GPU-Direct %d -> %d\n", worker->devid, devid); } } } } #endif /* force CUDA to initialize the context for real */ cures = cudaFree(0); if (STARPU_UNLIKELY(cures)) { if (cures == cudaErrorDevicesUnavailable) { fprintf(stderr,"All CUDA-capable devices are busy or unavailable\n"); exit(77); } STARPU_CUDA_REPORT_ERROR(cures); } cures = cudaGetDeviceProperties(&props[devid], devid); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); #ifdef HAVE_CUDA_MEMCPY_PEER if (props[devid].computeMode == cudaComputeModeExclusive) { fprintf(stderr, "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 workerid = starpu_worker_get_id(); cures = starpu_cudaStreamCreate(&streams[workerid]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); 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); for (i = 0; i < ncudagpus; i++) { cures = starpu_cudaStreamCreate(&in_peer_transfer_streams[i][devid]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); cures = starpu_cudaStreamCreate(&out_peer_transfer_streams[devid][i]); if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); } } static void deinit_context(int workerid) { int devid = starpu_worker_get_devid(workerid); int i; cudaStreamDestroy(streams[workerid]); cudaStreamDestroy(in_transfer_streams[devid]); cudaStreamDestroy(out_transfer_streams[devid]); for (i = 0; i < ncudagpus; i++) { cudaStreamDestroy(in_peer_transfer_streams[i][devid]); cudaStreamDestroy(out_peer_transfer_streams[devid][i]); } } #endif /* !SIMGRID */ static size_t _starpu_cuda_get_global_mem_size(unsigned devid) { return global_mem[devid]; } /* Return the number of devices usable in the system. * The value returned cannot be greater than MAXCUDADEVS */ unsigned _starpu_get_cuda_device_count(void) { int cnt; #ifdef STARPU_SIMGRID cnt = _starpu_simgrid_get_nbhosts("CUDA"); #else cudaError_t cures; cures = cudaGetDeviceCount(&cnt); if (STARPU_UNLIKELY(cures)) return 0; #endif if (cnt > STARPU_MAXCUDADEVS) { fprintf(stderr, "# Warning: %d CUDA devices available. Only %d enabled. Use configure option --enable-maxcudadev=xxx to update the maximum value of supported CUDA devices.\n", cnt, STARPU_MAXCUDADEVS); cnt = STARPU_MAXCUDADEVS; } return (unsigned)cnt; } void _starpu_init_cuda(void) { ncudagpus = _starpu_get_cuda_device_count(); STARPU_ASSERT(ncudagpus <= STARPU_MAXCUDADEVS); } static int execute_job_on_cuda(struct _starpu_job *j, struct _starpu_worker *args) { int ret; uint32_t mask = 0; STARPU_ASSERT(j); struct starpu_task *task = j->task; struct timespec codelet_start, codelet_end; int profiling = starpu_profiling_status_get(); STARPU_ASSERT(task); struct starpu_codelet *cl = task->cl; STARPU_ASSERT(cl); ret = _starpu_fetch_task_input(j, mask); if (ret != 0) { /* there was not enough memory, so the input of * the codelet cannot be fetched ... put the * codelet back, and try it later */ return -EAGAIN; } _starpu_driver_start_job(args, j, &codelet_start, 0, profiling); #if defined(HAVE_CUDA_MEMCPY_PEER) && !defined(STARPU_SIMGRID) /* We make sure we do manipulate the proper device */ starpu_cuda_set_device(args->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) { #ifdef STARPU_SIMGRID _starpu_simgrid_execute_job(j, args->perf_arch, NAN); #else func(_STARPU_TASK_GET_INTERFACES(task), task->cl_arg); #ifdef STARPU_DEBUG STARPU_ASSERT_MSG(cudaStreamQuery(starpu_cuda_get_local_stream()) == cudaSuccess, "CUDA codelets have to wait for termination of their kernels on the starpu_cuda_get_local_stream() stream"); #endif #endif } _starpu_driver_end_job(args, j, args->perf_arch, &codelet_end, 0, profiling); _starpu_driver_update_job_feedback(j, args, args->perf_arch, &codelet_start, &codelet_end, profiling); _starpu_push_task_output(j, mask); return 0; } /* XXX Should this be merged with _starpu_init_cuda ? */ int _starpu_cuda_driver_init(struct _starpu_worker *args) { unsigned devid = args->devid; _starpu_worker_start(args, _STARPU_FUT_CUDA_KEY); #ifndef STARPU_SIMGRID init_context(devid); #endif _starpu_cuda_limit_gpu_mem_if_needed(devid); _starpu_memory_manager_set_global_memory_size(args->memory_node, _starpu_cuda_get_global_mem_size(devid)); _starpu_malloc_init(args->memory_node); /* one more time to avoid hacks from third party lib :) */ _starpu_bind_thread_on_cpu(args->config, args->bindid); args->status = STATUS_UNKNOWN; float size = (float) global_mem[devid] / (1<<30); #ifdef STARPU_SIMGRID const char *devname = "Simgrid"; #else /* get the device's name */ char devname[128]; strncpy(devname, props[devid].name, 128); #endif #if defined(STARPU_HAVE_BUSID) && !defined(STARPU_SIMGRID) #if defined(STARPU_HAVE_DOMAINID) && !defined(STARPU_SIMGRID) if (props[devid].pciDomainID) snprintf(args->name, sizeof(args->name), "CUDA %u (%s %.1f GiB %04x:%02x:%02x.0)", devid, devname, size, props[devid].pciDomainID, props[devid].pciBusID, props[devid].pciDeviceID); else #endif snprintf(args->name, sizeof(args->name), "CUDA %u (%s %.1f GiB %02x:%02x.0)", devid, devname, size, props[devid].pciBusID, props[devid].pciDeviceID); #else snprintf(args->name, sizeof(args->name), "CUDA %u (%s %.1f GiB)", devid, devname, size); #endif snprintf(args->short_name, sizeof(args->short_name), "CUDA %u", devid); _STARPU_DEBUG("cuda (%s) dev id %u thread is ready to run on CPU %d !\n", devname, devid, args->bindid); _STARPU_TRACE_WORKER_INIT_END; /* tell the main thread that this one is ready */ STARPU_PTHREAD_MUTEX_LOCK(&args->mutex); args->worker_is_initialized = 1; STARPU_PTHREAD_COND_SIGNAL(&args->ready_cond); STARPU_PTHREAD_MUTEX_UNLOCK(&args->mutex); return 0; } int _starpu_cuda_driver_run_once(struct _starpu_worker *args) { unsigned memnode = args->memory_node; int workerid = args->workerid; _STARPU_TRACE_START_PROGRESS(memnode); _starpu_datawizard_progress(memnode, 1); _STARPU_TRACE_END_PROGRESS(memnode); struct starpu_task *task; struct _starpu_job *j = NULL; task = _starpu_get_worker_task(args, workerid, memnode); if (!task) return 0; 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_push_task_to_workers(task); return 0; } _starpu_set_current_task(task); args->current_task = j->task; int res = execute_job_on_cuda(j, args); _starpu_set_current_task(NULL); args->current_task = NULL; 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(); } } _starpu_handle_job_termination(j); return 0; } int _starpu_cuda_driver_deinit(struct _starpu_worker *args) { unsigned memnode = args->memory_node; _STARPU_TRACE_WORKER_DEINIT_START; _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_context(args->workerid); #endif args->worker_is_initialized = 0; _STARPU_TRACE_WORKER_DEINIT_END(_STARPU_FUT_CUDA_KEY); return 0; } void *_starpu_cuda_worker(void *arg) { struct _starpu_worker* args = arg; _starpu_cuda_driver_init(args); while (_starpu_machine_is_running()) { _starpu_may_pause(); _starpu_cuda_driver_run_once(args); } _starpu_cuda_driver_deinit(args); 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; } fprintf(stderr, "oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ABORT(); } void starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status) { const char *errormsg = cudaGetErrorString(status); printf("oops in %s (%s:%d)... %d: %s \n", func, file, line, status, errormsg); STARPU_ABORT(); } #endif /* STARPU_USE_CUDA */ #ifdef STARPU_USE_CUDA int starpu_cuda_copy_async_sync(void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t ssize, cudaStream_t stream, enum cudaMemcpyKind kind) { #ifdef HAVE_CUDA_MEMCPY_PEER int peer_copy = 0; int src_dev = -1, dst_dev = -1; #endif cudaError_t cures = 0; if (kind == cudaMemcpyDeviceToDevice && src_node != dst_node) { #ifdef HAVE_CUDA_MEMCPY_PEER peer_copy = 1; src_dev = _starpu_memory_node_get_devid(src_node); dst_dev = _starpu_memory_node_get_devid(dst_node); #else STARPU_ABORT(); #endif } if (stream) { _STARPU_TRACE_START_DRIVER_COPY_ASYNC(src_node, dst_node); #ifdef HAVE_CUDA_MEMCPY_PEER if (peer_copy) { cures = cudaMemcpyPeerAsync((char *) dst_ptr, dst_dev, (char *) src_ptr, src_dev, ssize, stream); } else #endif { cures = cudaMemcpyAsync((char *)dst_ptr, (char *)src_ptr, ssize, kind, stream); } _STARPU_TRACE_END_DRIVER_COPY_ASYNC(src_node, dst_node); } /* Test if the asynchronous copy has failed or if the caller only asked for a synchronous copy */ if (stream == NULL || cures) { /* do it in a synchronous fashion */ #ifdef HAVE_CUDA_MEMCPY_PEER if (peer_copy) { cures = cudaMemcpyPeer((char *) dst_ptr, dst_dev, (char *) src_ptr, src_dev, ssize); } else #endif { cures = cudaMemcpy((char *)dst_ptr, (char *)src_ptr, ssize, kind); } if (STARPU_UNLIKELY(cures)) STARPU_CUDA_REPORT_ERROR(cures); return 0; } return -EAGAIN; } #endif /* STARPU_USE_CUDA */ int _starpu_run_cuda(struct _starpu_worker *workerarg) { workerarg->set = NULL; workerarg->worker_is_initialized = 0; /* Let's go ! */ _starpu_cuda_worker(workerarg); return 0; } starpu-1.1.5/src/drivers/cuda/driver_cuda.h0000644000373600000000000000367112571536576015617 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010, 2012-2014 Université de Bordeaux * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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__ #include #include #include #ifdef STARPU_USE_CUDA #include #include #include #endif #include #include #include #include #include #include #include unsigned _starpu_get_cuda_device_count(void); #if defined(STARPU_USE_CUDA) || defined(STARPU_SIMGRID) void _starpu_cuda_discover_devices (struct _starpu_machine_config *); void _starpu_init_cuda(void); void *_starpu_cuda_worker(void *); #else # define _starpu_cuda_discover_devices(config) ((void) config) #endif #ifdef STARPU_USE_CUDA cudaStream_t starpu_cuda_get_local_in_transfer_stream(void); cudaStream_t starpu_cuda_get_local_out_transfer_stream(void); cudaStream_t starpu_cuda_get_peer_transfer_stream(unsigned src_node, unsigned dst_node); struct _starpu_worker; int _starpu_run_cuda(struct _starpu_worker *); int _starpu_cuda_driver_init(struct _starpu_worker *); int _starpu_cuda_driver_run_once(struct _starpu_worker *); int _starpu_cuda_driver_deinit(struct _starpu_worker *); #endif #endif // __DRIVER_CUDA_H__ starpu-1.1.5/src/util/0002755000373600000000000000000012571541161011577 500000000000000starpu-1.1.5/src/util/misc.c0000644000373600000000000000231612571536575012633 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include 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) { const char *ret = NULL; if (!j) return NULL; struct starpu_task *task = j->task; if (task) ret = _starpu_codelet_get_model_name(task->cl); #ifdef STARPU_USE_FXT if (!ret) ret = j->model_name; #endif return ret; } starpu-1.1.5/src/util/starpu_insert_task_utils.c0000644000373600000000000002720312571536575017046 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique * Copyright (C) 2011, 2014 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include typedef void (*_starpu_callback_func_t)(void *); /* Deal with callbacks. The unpack function may be called multiple times when * we have a parallel task, and we should not free the cl_arg parameter from * the callback function. */ struct insert_task_cb_wrapper { _starpu_callback_func_t callback_func; void *callback_arg; }; static void starpu_task_insert_callback_wrapper(void *_cl_arg_wrapper) { struct insert_task_cb_wrapper *cl_arg_wrapper = (struct insert_task_cb_wrapper *) _cl_arg_wrapper; /* Execute the callback specified by the application */ if (cl_arg_wrapper->callback_func) cl_arg_wrapper->callback_func(cl_arg_wrapper->callback_arg); } size_t _starpu_insert_task_get_arg_size(va_list varg_list) { int arg_type; size_t arg_buffer_size; arg_buffer_size = 0; arg_buffer_size += sizeof(char); while ((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_RW || 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_VALUE) { (void)va_arg(varg_list, void *); size_t cst_size = va_arg(varg_list, size_t); arg_buffer_size += sizeof(size_t); arg_buffer_size += cst_size; } 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_PROLOGUE_CALLBACK) { (void)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_CALLBACK_ARG) { (void)va_arg(varg_list, void *); } else if (arg_type==STARPU_PRIORITY) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_NODE) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_DATA) { (void)va_arg(varg_list, starpu_data_handle_t); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { va_arg(varg_list, int); } else if (arg_type==STARPU_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_FLOPS) { (void)va_arg(varg_list, double); } else if (arg_type==STARPU_TAG) { (void)va_arg(varg_list, starpu_tag_t); } else { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } va_end(varg_list); return arg_buffer_size; } int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list varg_list) { int arg_type; unsigned current_arg_offset = 0; unsigned char nargs = 0; char *_arg_buffer; /* The buffer will contain : nargs, {size, content} (x nargs)*/ _arg_buffer = malloc(arg_buffer_size); /* We will begin the buffer with the number of args (which is stored as a char) */ current_arg_offset += sizeof(char); while((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_RW || 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_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 cst_size = va_arg(varg_list, size_t); *(size_t *)(&(_arg_buffer)[current_arg_offset]) = cst_size; current_arg_offset += sizeof(size_t); memcpy(&_arg_buffer[current_arg_offset], ptr, cst_size); current_arg_offset += cst_size; nargs++; STARPU_ASSERT(current_arg_offset <= arg_buffer_size); } else if (arg_type==STARPU_CALLBACK) { (void)va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_CALLBACK_WITH_ARG) { va_arg(varg_list, _starpu_callback_func_t); va_arg(varg_list, void *); } else if (arg_type==STARPU_CALLBACK_ARG) { (void)va_arg(varg_list, void *); } else if (arg_type==STARPU_PROLOGUE_CALLBACK) { va_arg(varg_list, _starpu_callback_func_t); } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG) { (void)va_arg(varg_list, void *); } else if (arg_type==STARPU_PRIORITY) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_NODE) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_DATA) { (void)va_arg(varg_list, starpu_data_handle_t); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { va_arg(varg_list, int); } else if (arg_type==STARPU_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_FLOPS) { (void)va_arg(varg_list, double); } else if (arg_type==STARPU_TAG) { (void)va_arg(varg_list, starpu_tag_t); } else { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } if (nargs) { _arg_buffer[0] = nargs; } else { free(_arg_buffer); _arg_buffer = NULL; } *arg_buffer = _arg_buffer; va_end(varg_list); return 0; } void _starpu_insert_task_create(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list) { int arg_type; unsigned current_buffer = 0; struct insert_task_cb_wrapper *cl_arg_wrapper = (struct insert_task_cb_wrapper *) malloc(sizeof(struct insert_task_cb_wrapper)); STARPU_ASSERT(cl_arg_wrapper); cl_arg_wrapper->callback_func = NULL; struct insert_task_cb_wrapper *prologue_cl_arg_wrapper = (struct insert_task_cb_wrapper *) malloc(sizeof(struct insert_task_cb_wrapper)); STARPU_ASSERT(prologue_cl_arg_wrapper); prologue_cl_arg_wrapper->callback_func = NULL; while((arg_type = va_arg(varg_list, int)) != 0) { if (arg_type & STARPU_R || arg_type & STARPU_W || arg_type & STARPU_RW || 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); enum starpu_data_access_mode mode = (enum starpu_data_access_mode) arg_type & ~STARPU_SSEND; STARPU_ASSERT(cl != NULL); STARPU_TASK_SET_HANDLE((*task), handle, current_buffer); 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_insert_task\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 #endif STARPU_CODELET_SET_MODE(cl, mode, current_buffer); } current_buffer++; } 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); int i; for(i=0 ; icallback_func = callback_func; } else if (arg_type==STARPU_CALLBACK_WITH_ARG) { void (*callback_func)(void *); void *callback_arg; callback_func = va_arg(varg_list, _starpu_callback_func_t); callback_arg = va_arg(varg_list, void *); cl_arg_wrapper->callback_func = callback_func; cl_arg_wrapper->callback_arg = callback_arg; } else if (arg_type==STARPU_CALLBACK_ARG) { void *callback_arg = va_arg(varg_list, void *); cl_arg_wrapper->callback_arg = callback_arg; } else if (arg_type==STARPU_PROLOGUE_CALLBACK) { void (*callback_func)(void *); callback_func = va_arg(varg_list, _starpu_callback_func_t); prologue_cl_arg_wrapper->callback_func = callback_func; } else if (arg_type==STARPU_PROLOGUE_CALLBACK_ARG) { void *callback_arg = va_arg(varg_list, void *); prologue_cl_arg_wrapper->callback_arg = callback_arg; } else if (arg_type==STARPU_PRIORITY) { /* Followed by a priority level */ int prio = va_arg(varg_list, int); (*task)->priority = prio; } else if (arg_type==STARPU_EXECUTE_ON_NODE) { (void)va_arg(varg_list, int); } else if (arg_type==STARPU_EXECUTE_ON_DATA) { (void)va_arg(varg_list, starpu_data_handle_t); } else if (arg_type==STARPU_EXECUTE_ON_WORKER) { int worker = va_arg(varg_list, int); if (worker != -1) { (*task)->workerid = worker; (*task)->execute_on_a_specific_worker = 1; } } else if (arg_type==STARPU_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_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 { STARPU_ABORT_MSG("Unrecognized argument %d\n", arg_type); } } va_end(varg_list); STARPU_ASSERT(cl == NULL || current_buffer == cl->nbuffers); (*task)->cl = cl; (*task)->cl_arg = arg_buffer; (*task)->cl_arg_size = arg_buffer_size; /* The callback will free the argument stack and execute the * application's callback, if any. */ (*task)->callback_func = starpu_task_insert_callback_wrapper; (*task)->callback_arg = cl_arg_wrapper; (*task)->callback_arg_free = 1; (*task)->prologue_callback_func = starpu_task_insert_callback_wrapper; (*task)->prologue_callback_arg = prologue_cl_arg_wrapper; (*task)->prologue_callback_arg_free = 1; } int _starpu_insert_task_create_and_submit(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list) { _starpu_insert_task_create(arg_buffer, arg_buffer_size, cl, task, varg_list); int ret = starpu_task_submit(*task); if (STARPU_UNLIKELY(ret == -ENODEV)) { fprintf(stderr, "submission of task %p wih codelet %p failed (symbol `%s') (err: ENODEV)\n", *task, (*task)->cl, (cl == NULL) ? "none" : (*task)->cl->name ? (*task)->cl->name : ((*task)->cl->model && (*task)->cl->model->symbol)?(*task)->cl->model->symbol:"none"); } return ret; } starpu-1.1.5/src/util/file.c0000644000373600000000000000210212571536575012610 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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'))); } case '\n': continue; default: ungetc(c, f); return; } } } starpu-1.1.5/src/util/starpu_insert_task_utils.h0000644000373600000000000000301012571536575017041 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the 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_INSERT_TASK_UTILS_H__ #define __STARPU_INSERT_TASK_UTILS_H__ #include #include #include size_t _starpu_insert_task_get_arg_size(va_list varg_list); int _starpu_codelet_pack_args(void **arg_buffer, size_t arg_buffer_size, va_list varg_list); void _starpu_insert_task_create(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list); int _starpu_insert_task_create_and_submit(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, va_list varg_list); int _starpu_insert_task_create_and_submit_array(void *arg_buffer, size_t arg_buffer_size, struct starpu_codelet *cl, struct starpu_task **task, starpu_data_handle_t *handles, unsigned nb_handles, va_list varg_list); #endif // __STARPU_INSERT_TASK_UTILS_H__ starpu-1.1.5/src/util/starpu_create_sync_task.c0000644000373600000000000000305612571536575016621 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * Copyright (C) 2010 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include /* This creates (and submits) an empty task that unlocks a tag once all its * dependencies are fulfilled. */ /* TODO it would be nice to have such a function without sync_tag in case we * just want to execute the callback. */ void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg) { starpu_tag_declare_deps_array(sync_tag, ndeps, deps); /* We create an empty task */ struct starpu_task *sync_task = starpu_task_create(); sync_task->use_tag = 1; sync_task->tag_id = sync_tag; sync_task->callback_func = callback; sync_task->callback_arg = callback_arg; /* This task does nothing */ sync_task->cl = NULL; int sync_ret = _starpu_task_submit_internally(sync_task); STARPU_ASSERT(!sync_ret); } starpu-1.1.5/src/util/starpu_insert_task.c0000644000373600000000000000665712571536575015640 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012 Université de Bordeaux * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even 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; /* Compute the size */ va_start(varg_list, arg_buffer_size); *arg_buffer_size = _starpu_insert_task_get_arg_size(varg_list); va_start(varg_list, arg_buffer_size); _starpu_codelet_pack_args(arg_buffer, *arg_buffer_size, varg_list); } void starpu_codelet_unpack_args(void *_cl_arg, ...) { unsigned char *cl_arg = (unsigned char *) _cl_arg; unsigned current_arg_offset = 0; va_list varg_list; STARPU_ASSERT(cl_arg); va_start(varg_list, _cl_arg); /* We fill the different pointers with the appropriate arguments */ unsigned char nargs = cl_arg[0]; current_arg_offset += sizeof(char); unsigned arg; for (arg = 0; arg < nargs; arg++) { void *argptr = va_arg(varg_list, void *); size_t arg_size = *(size_t *)&cl_arg[current_arg_offset]; current_arg_offset += sizeof(size_t); memcpy(argptr, &cl_arg[current_arg_offset], arg_size); current_arg_offset += arg_size; } va_end(varg_list); } int starpu_insert_task(struct starpu_codelet *cl, ...) { va_list varg_list; void *arg_buffer = NULL; /* Compute the size */ size_t arg_buffer_size = 0; va_start(varg_list, cl); arg_buffer_size = _starpu_insert_task_get_arg_size(varg_list); if (arg_buffer_size) { va_start(varg_list, cl); _starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list); } struct starpu_task *task = starpu_task_create(); task->cl_arg_free = 1; if (cl && cl->nbuffers > STARPU_NMAXBUFS) { task->dyn_handles = malloc(cl->nbuffers * sizeof(starpu_data_handle_t)); } va_start(varg_list, cl); int ret = _starpu_insert_task_create_and_submit(arg_buffer, arg_buffer_size, cl, &task, varg_list); if (ret == -ENODEV) { task->destroy = 0; starpu_task_destroy(task); } return ret; } struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...) { va_list varg_list; void *arg_buffer = NULL; /* Compute the size */ size_t arg_buffer_size = 0; va_start(varg_list, cl); arg_buffer_size = _starpu_insert_task_get_arg_size(varg_list); if (arg_buffer_size) { va_start(varg_list, cl); _starpu_codelet_pack_args(&arg_buffer, arg_buffer_size, varg_list); } struct starpu_task *task = starpu_task_create(); if (cl && cl->nbuffers > STARPU_NMAXBUFS) { task->dyn_handles = malloc(cl->nbuffers * sizeof(starpu_data_handle_t)); } va_start(varg_list, cl); _starpu_insert_task_create(arg_buffer, arg_buffer_size, cl, &task, varg_list); return task; } starpu-1.1.5/src/util/starpu_data_cpy.h0000644000373600000000000000173112571536575015067 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012 Université Bordeaux 1 * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DATA_CPY_H__ #define __STARPU_DATA_CPY_H__ #include int _starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg, int reduction, struct starpu_task *reduction_dep_task); #endif // __STARPU_DATA_CPY_H__ starpu-1.1.5/src/util/execute_on_all.c0000644000373600000000000001030712571536575014665 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009, 2010 Université de Bordeaux * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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]->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; #ifdef STARPU_USE_FXT _starpu_get_job_associated_to_task(tasks[w])->model_name = name; #endif _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]; /* 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]->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; #ifdef STARPU_USE_FXT _starpu_get_job_associated_to_task(tasks[worker])->model_name = wrapper_cl.name; #endif _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.1.5/src/util/starpu_data_cpy.c0000644000373600000000000000674312571536575015072 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2012-2013 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include static void data_cpy_func(void *descr[], void *cl_arg) { const struct starpu_data_copy_methods *copy_methods = (const struct starpu_data_copy_methods *) cl_arg; int workerid = starpu_worker_get_id(); enum starpu_worker_archtype type = starpu_worker_get_type(workerid); unsigned memory_node = starpu_worker_get_memory_node(workerid); void *dst_interface = descr[0]; void *src_interface = descr[1]; switch (type) { case STARPU_CPU_WORKER: if (copy_methods->ram_to_ram) { copy_methods->ram_to_ram(src_interface, memory_node, dst_interface, memory_node); return; } break; case STARPU_CUDA_WORKER: if (copy_methods->cuda_to_cuda) { copy_methods->cuda_to_cuda(src_interface, memory_node, dst_interface, memory_node); return; } break; case STARPU_OPENCL_WORKER: if (copy_methods->opencl_to_opencl) { copy_methods->opencl_to_opencl(src_interface, memory_node, dst_interface, memory_node); return; } break; default: /* unknown architecture */ STARPU_ABORT(); } STARPU_ASSERT(copy_methods->any_to_any); copy_methods->any_to_any(src_interface, memory_node, dst_interface, memory_node, NULL); } 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, .cpu_funcs = {data_cpy_func}, .cuda_funcs = {data_cpy_func}, .opencl_funcs = {data_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) { const struct starpu_data_copy_methods *copy_methods = dst_handle->ops->copy_methods; struct starpu_task *task = starpu_task_create(); STARPU_ASSERT(task); 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; task->cl_arg = (void *)copy_methods; task->callback_func = callback_func; task->callback_arg = callback_arg; STARPU_TASK_SET_HANDLE(task, dst_handle, 0); STARPU_TASK_SET_HANDLE(task, src_handle, 1); task->synchronous = !asynchronous; int ret = _starpu_task_submit_internally(task); STARPU_ASSERT(!ret); return 0; } int starpu_data_cpy(starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void (*callback_func)(void*), void *callback_arg) { return _starpu_data_cpy(dst_handle, src_handle, asynchronous, callback_func, callback_arg, 0, NULL); } starpu-1.1.5/src/worker_collection/0002755000373600000000000000000012571541161014346 500000000000000starpu-1.1.5/src/worker_collection/worker_list.c0000644000373600000000000000761612571536572017020 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2013 Université de Bordeaux * Copyright (C) 2012-2013 Centre National de la Recherche Scientifique * Copyright (C) 2011-2013 INRIA * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include static unsigned list_has_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int nworkers = (int)workers->nworkers; STARPU_ASSERT(it != NULL); unsigned ret = it->cursor < nworkers ; if(!ret) it->cursor = 0; return ret; } static int list_get_next(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it) { int *workerids = (int *)workers->workerids; int nworkers = (int)workers->nworkers; STARPU_ASSERT(it->cursor < nworkers); int ret = workerids[(it->cursor)++]; return ret; } static unsigned _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 - 1); 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 found_worker = -1; unsigned i; 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--; return found_worker; } static void _init_workers(int *workerids) { unsigned i; for(i = 0; i < STARPU_NMAXWORKERS; i++) workerids[i] = -1; return; } static void list_init(struct starpu_worker_collection *workers) { int *workerids = (int*)malloc(STARPU_NMAXWORKERS * sizeof(int)); _init_workers(workerids); workers->workerids = (void*)workerids; workers->nworkers = 0; return; } static void list_deinit(struct starpu_worker_collection *workers) { free(workers->workerids); } static void list_init_iterator(struct starpu_worker_collection *workers STARPU_ATTRIBUTE_UNUSED, struct starpu_sched_ctx_iterator *it) { *((int*)it) = 0; } struct starpu_worker_collection 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, .type = STARPU_WORKER_LIST }; starpu-1.1.5/src/Makefile.am0000644000373600000000000002051412571536574012612 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2015 Centre National de la Recherche Scientifique # Copyright (C) 2011 INRIA # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. SUBDIRS = CLEANFILES = *.gcno *.gcda *.linkinfo EXTRA_DIST = dolib.c ldflags = libstarpu_so_version = $(LIBSTARPU_INTERFACE_CURRENT):$(LIBSTARPU_INTERFACE_REVISION):$(LIBSTARPU_INTERFACE_AGE) if STARPU_HAVE_WINDOWS LC_MESSAGES=C export LC_MESSAGES ldflags += -Xlinker --output-def -Xlinker .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def if STARPU_HAVE_MS_LIB .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib: libstarpu-@STARPU_EFFECTIVE_VERSION@.la dolib ./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 all-local: .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib endif STARPU_HAVE_MS_LIB install-exec-hook: $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.def $(DESTDIR)$(libdir) if STARPU_HAVE_MS_LIB $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.lib $(DESTDIR)$(libdir) $(INSTALL) .libs/libstarpu-@STARPU_EFFECTIVE_VERSION@.exp $(DESTDIR)$(libdir) endif STARPU_HAVE_MS_LIB endif STARPU_HAVE_WINDOWS 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) libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LIBADD = -lm $(HWLOC_LIBS) $(STARPU_OPENCL_LDFLAGS) $(STARPU_CUDA_LDFLAGS) $(FXT_LIBS) $(STARPU_GLPK_LDFLAGS) libstarpu_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) $(FXT_LDFLAGS) -no-undefined \ -version-info $(libstarpu_so_version) noinst_HEADERS = \ core/dependencies/data_concurrency.h \ core/dependencies/cg.h \ core/dependencies/tags.h \ core/dependencies/implicit_data_deps.h \ core/progress_hook.h \ core/sched_policy.h \ core/sched_ctx.h \ core/sched_ctx_list.h \ core/perfmodel/perfmodel.h \ core/perfmodel/regression.h \ core/jobs.h \ core/task.h \ core/workers.h \ core/topology.h \ core/debug.h \ core/errorcheck.h \ core/combined_workers.h \ core/simgrid.h \ core/task_bundle.h \ core/detect_combined_workers.h \ sched_policies/fifo_queues.h \ sched_policies/deque_queues.h \ sched_policies/stack_queues.h \ datawizard/footprint.h \ datawizard/datawizard.h \ datawizard/data_request.h \ datawizard/filters.h \ datawizard/write_back.h \ datawizard/datastats.h \ datawizard/malloc.h \ datawizard/memstats.h \ datawizard/memory_manager.h \ datawizard/memalloc.h \ datawizard/copy_driver.h \ datawizard/coherency.h \ datawizard/sort_data_handles.h \ datawizard/memory_nodes.h \ datawizard/interfaces/data_interface.h \ common/barrier.h \ common/timing.h \ common/list.h \ common/rwlock.h \ common/starpu_spinlock.h \ common/fxt.h \ common/utils.h \ common/thread.h \ common/barrier.h \ common/uthash.h \ common/barrier_counter.h \ drivers/driver_common/driver_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 \ debug/traces/starpu_fxt.h \ profiling/bound.h \ profiling/profiling.h \ util/starpu_insert_task_utils.h \ util/starpu_data_cpy.h \ starpu_parameters.h \ top/starpu_top_message_queue.h \ top/starpu_top_connection.h \ top/starpu_top_core.h libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES = \ common/barrier.c \ common/bitmap.c \ common/barrier_counter.c \ common/hash.c \ common/rwlock.c \ common/starpu_spinlock.c \ common/timing.c \ common/fxt.c \ common/utils.c \ common/thread.c \ core/jobs.c \ core/task.c \ core/task_bundle.c \ core/workers.c \ core/combined_workers.c \ core/topology.c \ core/debug.c \ core/errorcheck.c \ core/progress_hook.c \ core/dependencies/cg.c \ core/dependencies/dependencies.c \ core/dependencies/implicit_data_deps.c \ core/dependencies/tags.c \ core/dependencies/task_deps.c \ core/dependencies/data_concurrency.c \ core/perfmodel/perfmodel_history.c \ core/perfmodel/perfmodel_bus.c \ core/perfmodel/perfmodel.c \ core/perfmodel/perfmodel_print.c \ core/perfmodel/perfmodel_nan.c \ core/perfmodel/regression.c \ core/sched_policy.c \ core/simgrid.c \ core/sched_ctx.c \ core/sched_ctx_list.c \ core/parallel_task.c \ core/detect_combined_workers.c \ sched_policies/eager_central_policy.c \ sched_policies/eager_central_priority_policy.c \ sched_policies/work_stealing_policy.c \ sched_policies/deque_modeling_policy_data_aware.c \ sched_policies/random_policy.c \ sched_policies/stack_queues.c \ sched_policies/deque_queues.c \ sched_policies/fifo_queues.c \ sched_policies/parallel_heft.c \ sched_policies/parallel_eager.c \ drivers/driver_common/driver_common.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/misc.c \ util/starpu_data_cpy.c \ util/starpu_insert_task.c \ util/starpu_insert_task_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/latency.c \ debug/structures_size.c \ profiling/profiling.c \ profiling/bound.c \ profiling/profiling_helpers.c \ top/starpu_top.c \ top/starpu_top_task.c \ top/starpu_top_message_queue.c \ top/starpu_top_connection.c \ worker_collection/worker_list.c if STARPU_USE_CPU libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/cpu/driver_cpu.c endif if STARPU_USE_CUDA libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/cuda/driver_cuda.c else if STARPU_SIMGRID libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/cuda/driver_cuda.c endif endif libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/cuda/starpu_cublas.c if STARPU_USE_OPENCL libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/opencl/driver_opencl.c libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/opencl/driver_opencl_utils.c else if STARPU_SIMGRID libstarpu_@STARPU_EFFECTIVE_VERSION@_la_SOURCES += drivers/opencl/driver_opencl.c endif endif showcheck: -cat /dev/null starpu-1.1.5/src/top/0002755000373600000000000000000012571541161011424 500000000000000starpu-1.1.5/src/top/starpu_top_connection.h0000644000373600000000000000254012571536576016151 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_TOP_CONNECTION_H__ #define __STARPU_TOP_CONNECTION_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif extern struct _starpu_top_message_queue* _starpu_top_mt; /* * This function initialize the two communications threads. * It initializes the connection and then launches the threads. * The function wait the UI connection before launching the threads. * About mt : mt MUST be allocated before call. * All messages in the queue are freed after used. */ void _starpu_top_communications_threads_launcher(void); #ifdef __cplusplus } #endif #endif // __STARPU_TOP_CONNECTION_H__ starpu-1.1.5/src/top/starpu_top_task.c0000644000373600000000000000555412571536576014757 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony Roy * Copyright (C) 2011, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include /******************************************** **************TASK RELATED FUNCTIONS******** *******************************************/ void _starpu_top_task_started(struct starpu_task *task, int devid, const struct timespec *ts) { unsigned long long taskid = _starpu_get_job_associated_to_task(task)->job_id; STARPU_ASSERT(_starpu_top_status_get()); char *str = (char *) malloc(sizeof(char)*64); snprintf(str, 64, "START;%llu;%d;%llu\n", taskid, devid, _starpu_top_timing_timespec_to_ms(ts)); _starpu_top_message_add(_starpu_top_mt, str); } void _starpu_top_task_ended(struct starpu_task *task, int devid, const struct timespec *ts) { unsigned long long taskid = _starpu_get_job_associated_to_task(task)->job_id; (void) devid; //unused STARPU_ASSERT(_starpu_top_status_get()); char *str = (char *) malloc(sizeof(char)*64); snprintf(str, 64, "END;%llu;%llu\n", taskid, _starpu_top_timing_timespec_to_ms(ts)); _starpu_top_message_add(_starpu_top_mt, str); } void __starpu_top_task_prevision_timespec(struct starpu_task *task, int devid, const struct timespec* start, const struct timespec* end) { starpu_top_task_prevision(task, devid, _starpu_top_timing_timespec_to_ms(start), _starpu_top_timing_timespec_to_ms(end)); } void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end) { if (!_starpu_top_status_get()) return; unsigned long long taskid = _starpu_get_job_associated_to_task(task)->job_id; STARPU_ASSERT(_starpu_top_status_get()); struct timespec now; _starpu_clock_gettime(&now); char * str= (char *)malloc(sizeof(char)*200); snprintf(str, 128, "PREV;%llu;%d;%llu;%llu;%llu\n", taskid, devid, _starpu_top_timing_timespec_to_ms(&now), start, end); _starpu_top_message_add(_starpu_top_mt, str); } starpu-1.1.5/src/top/starpu_top_core.h0000644000373600000000000000377212571536576014752 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony Roy * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include struct starpu_task; /* * Convert timespec to ms */ unsigned long long _starpu_top_timing_timespec_to_ms(const struct timespec *ts); /* * This function returns 1 if starpu_top is initialized. 0 otherwise. */ extern int _starpu_top; int _starpu_top_status_get(void); #define _starpu_top_status_get() _starpu_top /* * This functions notify UI than the task has started or ended */ void _starpu_top_task_started(struct starpu_task *task, int devid, const struct timespec* ts); void _starpu_top_task_ended(struct starpu_task *task, int devid, const struct timespec* ts ); /* * This functions notify UI than the task have been planed to * run from timestamp_begin to timestamp_end, on computation-core */ void __starpu_top_task_prevision_timespec(struct starpu_task *task, int devid, const struct timespec* start, const struct timespec* end); void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end); /**************************************************** ***************** Callback function ***************** *****************************************************/ void _starpu_top_process_input_message(char *message); starpu-1.1.5/src/top/starpu_top.c0000644000373600000000000005004212571536576013725 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony Roy * Copyright (C) 2011, 2012, 2013 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include #include #include #include #include #include extern struct _starpu_top_message_queue* _starpu_top_mt; int _starpu_top = 0; int starpu_top_debug_on = 0; unsigned int starpu_top_data_cpt = 0; unsigned int starpu_top_param_cpt = 0; struct starpu_top_data* starpu_top_first_data = NULL; struct starpu_top_param* starpu_top_first_param = NULL; struct starpu_top_data** starpu_top_datas; struct starpu_top_param** starpu_top_params; sem_t starpu_top_wait_for_go; starpu_pthread_mutex_t starpu_top_wait_for_continue_mutex; starpu_pthread_cond_t starpu_top_wait_for_continue_cond = STARPU_PTHREAD_COND_INITIALIZER; #undef _starpu_top_status_get int _starpu_top_status_get(void) { return _starpu_top; } static unsigned long long current_timestamp(void); /********************************************* *****************INIT FUNC******************** **********************************************/ static char *message_for_topdata_init(struct starpu_top_data* data); static char *message_for_topparam_init(struct starpu_top_param* param); /* * we store data and param in a tab to offer a O(1) access when the program is * running */ static void copy_data_and_param(void) { printf("%s:%d trace\n", __FILE__, __LINE__); //copying datas starpu_top_datas = (struct starpu_top_data **) malloc(starpu_top_data_cpt*sizeof(struct starpu_top_data*)); struct starpu_top_data* cur = starpu_top_first_data; unsigned int i = 0; for(i = 0; i < starpu_top_data_cpt; i++) { starpu_top_datas[i] = cur; cur = cur->next; } //copying params starpu_top_params = (struct starpu_top_param **) malloc(starpu_top_param_cpt*sizeof(struct starpu_top_param*)); struct starpu_top_param* cur2 = starpu_top_first_param; for(i = 0; i < starpu_top_param_cpt; i++) { starpu_top_params[i] = cur2; cur2 = cur2->next; } } static void starpu_top_get_device_type(int id, char* type) { enum starpu_worker_archtype device_type=starpu_worker_get_type(id); switch (device_type) { case STARPU_CPU_WORKER: strncpy(type, "CPU",9); break; case STARPU_CUDA_WORKER: strncpy(type, "CUDA",9); break; case STARPU_OPENCL_WORKER: strncpy(type, "OPENCL",9); break; case STARPU_ANY_WORKER: strncpy(type, "ANY",9); break; } } static void starpu_top_send_devices_info(void) { char* message=(char *)malloc(5*sizeof(char)); snprintf(message,5,"DEV\n"); _starpu_top_message_add(_starpu_top_mt,message); unsigned int i; for(i=0;inext; } message = (char *) malloc(strlen("/DATA\n")+1); sprintf(message, "%s", "/DATA\n"); _starpu_top_message_add(_starpu_top_mt,message); //sending parameter list message = (char *) malloc(strlen("PARAMS\n")+1); sprintf(message, "%s", "PARAMS\n"); _starpu_top_message_add(_starpu_top_mt,message); struct starpu_top_param * cur_param = starpu_top_first_param; printf("%s:%d sending parameters\n", __FILE__, __LINE__); while(cur_param != NULL) { _starpu_top_message_add(_starpu_top_mt,message_for_topparam_init(cur_param)); cur_param = cur_param->next; } printf("%s:%d parameters sended\n", __FILE__, __LINE__); message = (char *) malloc(strlen("/PARAMS\n")+1); sprintf(message, "%s", "/PARAMS\n"); _starpu_top_message_add(_starpu_top_mt,message); //sending DEVICE list printf("%s:%d sending devices info\n", __FILE__, __LINE__); starpu_top_send_devices_info(); printf("%s:%d devices_info sended\n", __FILE__, __LINE__); //copying data and params copy_data_and_param(); //sending READY message message = (char *) malloc(strlen("READY\n")+1); sprintf(message, "%s", "READY\n"); _starpu_top_message_add(_starpu_top_mt,message); //This threads keeps locked while we don't receive an GO message from UI printf("%s:%d waiting for GO message\n", __FILE__, __LINE__); sem_wait(&starpu_top_wait_for_go); } static void starpu_top_enqueue_data(struct starpu_top_data * data) { if(starpu_top_first_data == NULL) { starpu_top_first_data = data; } else { struct starpu_top_data * cur = starpu_top_first_data; while(cur->next != NULL) cur = cur->next; cur->next = data; } } struct starpu_top_data * starpu_top_add_data_boolean(const char* data_name, int active) { struct starpu_top_data * data = (struct starpu_top_data *) malloc(sizeof(struct starpu_top_data)); data->id = starpu_top_data_cpt++; data->name = data_name; data->type = STARPU_TOP_DATA_BOOLEAN; data->active = active; data->next = NULL; starpu_top_enqueue_data(data); return data; } struct starpu_top_data * starpu_top_add_data_integer(const char* data_name, int minimum_value, int maximum_value, int active) { struct starpu_top_data * data = (struct starpu_top_data *) malloc(sizeof(struct starpu_top_data)); data->id = starpu_top_data_cpt++; data->name = data_name; data->type = STARPU_TOP_DATA_INTEGER; data->int_min_value = minimum_value; data->int_max_value = maximum_value; data->active = active; data->next = NULL; starpu_top_enqueue_data(data); return data; } struct starpu_top_data* starpu_top_add_data_float(const char* data_name, double minimum_value, double maximum_value, int active) { struct starpu_top_data * data = (struct starpu_top_data *) malloc(sizeof(struct starpu_top_data)); data->id = starpu_top_data_cpt++; data->name = data_name; data->type = STARPU_TOP_DATA_FLOAT; data->double_min_value = minimum_value; data->double_max_value = maximum_value; data->active = active; data->next = NULL; starpu_top_enqueue_data(data); return data; } char *message_for_topdata_init(struct starpu_top_data* data) { char*message = (char *) malloc(256+strlen(data->name)); switch(data->type) { case STARPU_TOP_DATA_BOOLEAN: sprintf(message, "BOOL;%u;%s;%d\n", data->id, data->name, data->active ? 1 : 0); break; case STARPU_TOP_DATA_INTEGER: sprintf(message, "INT;%u;%s;%d;%d;%d\n", data->id, data->name, data->int_min_value, data->int_max_value, data->active ? 1 : 0); break; case STARPU_TOP_DATA_FLOAT: sprintf(message, "FLOAT;%u;%s;%f;%f;%d\n", data->id, data->name, data->double_min_value, data->double_max_value, data->active ? 1 : 0); break; } return message; } char *message_for_topparam_init(struct starpu_top_param* param) { char*message = NULL; int i; int length=0; switch(param->type) { case STARPU_TOP_PARAM_BOOLEAN: message = (char *) malloc(256); sprintf(message, "BOOL;%u;%s;%d\n", param->id, param->name, (*(int*)(param->value)) ? 1 : 0); break; case STARPU_TOP_PARAM_INTEGER: message = (char *) malloc(256); sprintf(message, "INT;%u;%s;%d;%d;%d\n",param->id, param->name, param->int_min_value, param->int_max_value, *(int*)(param->value)); break; case STARPU_TOP_PARAM_FLOAT: message = (char *) malloc(256); sprintf(message, "FLOAT;%u;%s;%f;%f;%f\n", param->id, param->name, param->double_min_value, param->double_max_value, *(double*)(param->value)); break; case STARPU_TOP_PARAM_ENUM: //compute message lenght for(i = 0; i < param->nb_values; i++) { length += strlen(param->enum_values[i])+1; } message = (char *) malloc(256+length); sprintf(message, "ENUM;%u;%s;", param->id, param->name); //compute the begin of enums elements in message char* cur = message+strlen(message); //add each enum element for(i = 0; i < param->nb_values; i++) { strcpy(cur, param->enum_values[i]); cur+=strlen(cur); *cur=';'; cur++; } sprintf(cur, "%d\n", *((int*)(param->value))); break; } return message; } static void starpu_top_enqueue_param(struct starpu_top_param* param) { if(starpu_top_first_param == NULL) { starpu_top_first_param = param; } else { struct starpu_top_param * cur = starpu_top_first_param; while(cur->next != NULL) cur = cur->next; cur->next = param; } } struct starpu_top_param* starpu_top_register_parameter_boolean(const char* param_name, int* parameter_field, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param * param = (struct starpu_top_param *) malloc(sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_BOOLEAN; param->value = (void*)parameter_field; param->next = NULL; starpu_top_enqueue_param(param); return param; } struct starpu_top_param* starpu_top_register_parameter_integer(const char* param_name, int* parameter_field, int minimum_value, int maximum_value, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param * param = (struct starpu_top_param *) malloc(sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_INTEGER; param->value = (void*)parameter_field; param->int_min_value = minimum_value; param->int_max_value = maximum_value; param->next = NULL; starpu_top_enqueue_param(param); return param; } struct starpu_top_param* starpu_top_register_parameter_float(const char* param_name, double* parameter_field, double minimum_value, double maximum_value, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param * param = (struct starpu_top_param *) malloc(sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_FLOAT; param->value = (void*)parameter_field; param->double_min_value = minimum_value; param->double_max_value = maximum_value; param->next = NULL; starpu_top_enqueue_param(param); return param; } struct starpu_top_param* starpu_top_register_parameter_enum(const char* param_name, int* parameter_field, char** values, int nb_values, void (*callback)(struct starpu_top_param*)) { STARPU_ASSERT(!_starpu_top_status_get()); struct starpu_top_param * param = (struct starpu_top_param *) malloc(sizeof(struct starpu_top_param)); param->callback = callback; param->name = param_name; param->id = starpu_top_param_cpt++; param->type = STARPU_TOP_PARAM_ENUM; param->value = (void*)parameter_field; param->enum_values = values; param->nb_values = nb_values; param->next = NULL; starpu_top_enqueue_param(param); return param; } /********************************************* *****************UPDATE FUNC****************** **********************************************/ void starpu_top_update_data_boolean(const struct starpu_top_data* data, int value) { if (!_starpu_top_status_get()) return; if(data->active) { char*message = (char *) malloc(256+strlen(data->name)); sprintf(message, "U;%u;%d;%llu\n", data->id, (value?1:0), current_timestamp()); _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_update_data_integer(const struct starpu_top_data* data, int value) { if (!_starpu_top_status_get()) return; if(data->active) { char*message = (char *) malloc(256+strlen(data->name)); sprintf(message, "U;%u;%d;%llu\n", data->id, value, current_timestamp()); _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_update_data_float(const struct starpu_top_data* data, double value) { if (!_starpu_top_status_get()) return; if(data->active) { char*message = (char *) malloc(256+strlen(data->name)); sprintf(message, "U;%u;%f;%llu\n", data->id, value, current_timestamp()); _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_update_parameter(const struct starpu_top_param* param) { if (!_starpu_top_status_get()) return; char*message = (char *) malloc(50); switch(param->type) { case STARPU_TOP_PARAM_BOOLEAN: case STARPU_TOP_PARAM_INTEGER: case STARPU_TOP_PARAM_ENUM: sprintf(message, "SET;%u;%d;%llu\n", param->id, *((int*)param->value), current_timestamp()); break; case STARPU_TOP_PARAM_FLOAT: sprintf(message, "SET;%u;%f;%llu\n", param->id, *((double*)param->value), current_timestamp()); break; } _starpu_top_message_add(_starpu_top_mt,message); } /********************************************* *****************DEBUG FUNC****************** **********************************************/ void starpu_top_debug_log(const char* debug_message) { if(starpu_top_debug_on) { //length can be up to strlen*2, if message contains only unwanted chars char * message = (char *) malloc(strlen(debug_message)*2+16); sprintf(message,"MESSAGE;"); //escape unwanted char : ; and \n char* cur = message+8; while(*debug_message!='\0') { if(*debug_message=='\n' || *debug_message==';') { *cur='\\'; cur++; } *cur = *debug_message; cur++; debug_message++; } *cur='\n'; cur++; *cur='\0'; _starpu_top_message_add(_starpu_top_mt,message); } } void starpu_top_debug_lock(const char* debug_message) { if(starpu_top_debug_on) { char * message = (char *) malloc(strlen(debug_message)*2+16); sprintf(message,"LOCK;"); char* cur = message+5; while(*debug_message!='\0') { if(*debug_message=='\n' || *debug_message==';') { *cur='\\'; cur++; } *cur = *debug_message; cur++; debug_message++; } *cur='\n'; *(cur+1)='\0'; _starpu_top_message_add(_starpu_top_mt,message); //This threads keeps locked while we don't receive an STEP message STARPU_PTHREAD_MUTEX_LOCK(&starpu_top_wait_for_continue_mutex); STARPU_PTHREAD_COND_WAIT(&starpu_top_wait_for_continue_cond, &starpu_top_wait_for_continue_mutex); STARPU_PTHREAD_MUTEX_UNLOCK(&starpu_top_wait_for_continue_mutex); } } /******************************************** **************TIME FUNCTION**************** *******************************************/ unsigned long long current_timestamp(void) { struct timespec now; _starpu_clock_gettime(&now); return _starpu_top_timing_timespec_to_ms(&now); } unsigned long long _starpu_top_timing_timespec_to_ms(const struct timespec *ts) { return (1000.0*ts->tv_sec) + (0.000001*ts->tv_nsec); } /******************************************** **************INPUT PROCESSING************** *******************************************/ static enum starpu_top_message_type starpu_top_get_message_type(const char* message) { if(!strncmp("GO\n", message,3)) return TOP_TYPE_GO; else if(!strncmp("SET;", message,4)) return TOP_TYPE_SET; else if(!strncmp("STEP\n", message,9)) return TOP_TYPE_CONTINUE; else if(!strncmp("ENABLE;", message,7)) return TOP_TYPE_ENABLE; else if(!strncmp("DISABLE;", message,8)) return TOP_TYPE_DISABLE; else if(!strncmp("DEBUG;", message,6)) return TOP_TYPE_DEBUG; else return TOP_TYPE_UNKNOW; } static void starpu_top_unlock_starpu(void) { sem_post(&starpu_top_wait_for_go); printf("%s:%d starpu started\n", __FILE__, __LINE__); } static void starpu_top_change_data_active(char* message, int active) { char* debut = strstr(message, ";")+1; char* fin = strstr(debut+1, "\n"); *fin = '\0'; int data_id = atoi(debut); printf("%s:%d data %d %s\n", __FILE__, __LINE__, data_id, active ? "ENABLED" : "DISABLE"); starpu_top_datas[data_id]->active = active; } static void starpu_top_change_parameter_value(const char* message) { const char*tmp = strstr(message, ";")+1; int param_id = atoi(tmp); struct starpu_top_param* param = starpu_top_params[param_id]; tmp = strstr(tmp+1,";")+1; int* val_ptr_int; double* val_ptr_double; switch(param->type) { case STARPU_TOP_PARAM_BOOLEAN: case STARPU_TOP_PARAM_INTEGER: val_ptr_int = (int*)param->value; *val_ptr_int = atoi(tmp); break; case STARPU_TOP_PARAM_FLOAT: val_ptr_double = (double*)param->value; *val_ptr_double = atof(tmp); break; case STARPU_TOP_PARAM_ENUM: val_ptr_int = (int*)param->value; *val_ptr_int = atoi(tmp); break; } if(param->callback != NULL) param->callback(param); } static void starpu_top_change_debug_mode(const char*message) { const char* debut = strstr(message, ";")+1; if(!strncmp("ON",debut, 2)) { starpu_top_debug_on = 1; printf("%s:%d debug is now ON\n", __FILE__, __LINE__); } else { starpu_top_debug_on = 0; printf("%s:%d debug is now OFF\n", __FILE__, __LINE__); } char * m = (char *) malloc(strlen(message)+1); sprintf(m,"%s",message); _starpu_top_message_add(_starpu_top_mt,m); } /* * Unlock starpu if it was locked in debug state */ static void starpu_top_debug_next_step(void) { STARPU_PTHREAD_COND_SIGNAL(&starpu_top_wait_for_continue_cond); } void _starpu_top_process_input_message(char *buffer) { enum starpu_top_message_type message_type = starpu_top_get_message_type(buffer); switch(message_type) { case TOP_TYPE_GO: starpu_top_unlock_starpu(); break; case TOP_TYPE_ENABLE: starpu_top_change_data_active(buffer, 1); break; case TOP_TYPE_DISABLE: starpu_top_change_data_active(buffer, 0); break; case TOP_TYPE_SET: starpu_top_change_parameter_value(buffer); break; case TOP_TYPE_DEBUG: starpu_top_change_debug_mode(buffer); break; case TOP_TYPE_CONTINUE: starpu_top_debug_next_step(); break; default: printf("%s:%d unknow message : '%s'\n", __FILE__, __LINE__, buffer); } } starpu-1.1.5/src/top/starpu_top_message_queue.c0000644000373600000000000000577412571536576016651 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpu_top_message_queue.h" #include #include #include #include //this global queue is used both by API and by network threads struct _starpu_top_message_queue* _starpu_top_mt = NULL; /* Will always return the pointer to starpu_top_message_queue */ struct _starpu_top_message_queue* _starpu_top_message_add(struct _starpu_top_message_queue* s, char* msg) { struct _starpu_top_message_queue_item* p = (struct _starpu_top_message_queue_item *) malloc( 1 * sizeof(*p) ); STARPU_PTHREAD_MUTEX_LOCK(&(s->mutex)); if( NULL == p ) { fprintf(stderr, "IN %s, %s: malloc() failed\n", __FILE__, "list_add"); free(msg); STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } p->message = msg; p->next = NULL; if( NULL == s ) { printf("Queue not initialized\n"); free(msg); free(p); STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } else if( NULL == s->head && NULL == s->tail ) { /* printf("Empty list, adding p->num: %d\n\n", p->num); */ sem_post(&(s->semaphore)); s->head = s->tail = p; STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } else { /* printf("List not empty, adding element to tail\n"); */ sem_post(&(s->semaphore)); s->tail->next = p; s->tail = p; } STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return s; } //this is a queue and it is FIFO, so we will always remove the first element char* _starpu_top_message_remove(struct _starpu_top_message_queue* s) { sem_wait(&(s->semaphore)); struct _starpu_top_message_queue_item* h = NULL; struct _starpu_top_message_queue_item* p = NULL; if( NULL == s ) { printf("List is null\n"); return NULL; } STARPU_PTHREAD_MUTEX_LOCK(&(s->mutex)); h = s->head; p = h->next; char* value = h->message; free(h); s->head = p; if( NULL == s->head ) //the element tail was pointing to is free(), so we need an update s->tail = s->head; STARPU_PTHREAD_MUTEX_UNLOCK(&(s->mutex)); return value; } struct _starpu_top_message_queue* _starpu_top_message_queue_new(void) { struct _starpu_top_message_queue* p = (struct _starpu_top_message_queue *) malloc( 1 * sizeof(*p)); if( NULL == p ) { fprintf(stderr, "LINE: %d, malloc() failed\n", __LINE__); return NULL; } p->head = p->tail = NULL; sem_init(&(p->semaphore),0,0); STARPU_PTHREAD_MUTEX_INIT(&(p->mutex), NULL); return p; } starpu-1.1.5/src/top/starpu_top_connection.c0000644000373600000000000001032612571536576016145 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifdef __MINGW32__ # define WINVER 0x0501 /* WindowsXP, for getaddrinfo */ #endif #include #ifdef STARPU_HAVE_WINDOWS # include # include # include #else # include # include # include #endif #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif const char *STARPU_TOP_PORT = "2011"; const int STARPU_TOP_BUFFER_SIZE=1024; //client socket after fopen FILE* starpu_top_socket_fd_read; FILE* starpu_top_socket_fd_write; //client socket (file descriptor) int starpu_top_socket_fd; static void * message_from_ui(void * p) { (void) p; char str[STARPU_TOP_BUFFER_SIZE]; while(1) { char * check=fgets (str, STARPU_TOP_BUFFER_SIZE, starpu_top_socket_fd_read); printf("Message from UI : %s",str); if (check) { _starpu_top_process_input_message(str); } else { fprintf(stderr,"Connection dropped\n"); //unlocking StarPU. _starpu_top_process_input_message("GO\n"); _starpu_top_process_input_message("DEBUG;OFF\n"); _starpu_top_process_input_message("STEP\n"); return NULL; } } } static void * message_to_ui(void * p) { (void) p; while(1) { char* message = _starpu_top_message_remove(_starpu_top_mt); int len=strlen(message); int check=fwrite(message, sizeof(char), len, starpu_top_socket_fd_write); int check2=fflush(starpu_top_socket_fd_write); free(message); if (check!=len || check2==EOF ) { fprintf(stderr,"Connection dropped : message no longer send\n"); while(1) { message=_starpu_top_message_remove(_starpu_top_mt); free(message); } } } return NULL; } void _starpu_top_communications_threads_launcher(void) { starpu_pthread_t from_ui; starpu_pthread_t to_ui; starpu_pthread_attr_t threads_attr; //Connection to UI & Socket Initilization printf("%s:%d Connection to UI initilization\n",__FILE__, __LINE__); struct sockaddr_storage from; struct addrinfo req, *ans; int code; req.ai_flags = AI_PASSIVE; req.ai_family = PF_UNSPEC; req.ai_socktype = SOCK_STREAM; req.ai_protocol = 0; if ((code = getaddrinfo(NULL, STARPU_TOP_PORT, &req, &ans)) != 0) { fprintf(stderr, " getaddrinfo failed %d\n", code); exit(EXIT_FAILURE); } int sock=socket(ans->ai_family, ans->ai_socktype, ans->ai_protocol); int optval = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)); if (bind(sock, ans->ai_addr, ans->ai_addrlen) < 0) { perror("bind"); exit(EXIT_FAILURE); } listen(sock, 2); socklen_t len = sizeof(from); if ((starpu_top_socket_fd=accept(sock, (struct sockaddr *) &from, &len)) ==-1) { fprintf(stderr, "accept error\n"); perror("accept"); exit(EXIT_FAILURE); } if ( (starpu_top_socket_fd_read=fdopen(starpu_top_socket_fd, "r")) == NULL) { perror("fdopen"); exit(EXIT_FAILURE); } starpu_top_socket_fd=dup(starpu_top_socket_fd); if ((starpu_top_socket_fd_write=fdopen(starpu_top_socket_fd, "w")) == NULL) { perror("fdopen"); exit(EXIT_FAILURE); } close(sock); //Threads creation fprintf(stderr,"Threads Creation\n"); starpu_pthread_attr_init(&threads_attr); starpu_pthread_attr_setdetachstate(&threads_attr, PTHREAD_CREATE_DETACHED); STARPU_PTHREAD_CREATE(&from_ui, &threads_attr, message_from_ui, NULL); STARPU_PTHREAD_CREATE(&to_ui, &threads_attr, message_to_ui, NULL); } starpu-1.1.5/src/top/starpu_top_message_queue.h0000644000373600000000000000272112571536576016643 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony * Roy * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifndef __STARPU_TOP_MESSAGE_QUEUE_H__ #define __STARPU_TOP_MESSAGE_QUEUE_H__ struct _starpu_top_message_queue_item { char *message; struct _starpu_top_message_queue_item* next; }; struct _starpu_top_message_queue { struct _starpu_top_message_queue_item* head; struct _starpu_top_message_queue_item* tail; sem_t semaphore; starpu_pthread_mutex_t mutex; }; struct _starpu_top_message_queue *_starpu_top_message_add(struct _starpu_top_message_queue*, char*); char* _starpu_top_message_remove(struct _starpu_top_message_queue*); struct _starpu_top_message_queue* _starpu_top_message_queue_new(); struct _starpu_top_message_queue* _starpu_top_message_queue_free(struct _starpu_top_message_queue*); #endif starpu-1.1.5/src/debug/0002755000373600000000000000000012571541161011710 500000000000000starpu-1.1.5/src/debug/starpu_debug_helpers.h0000644000373600000000000000222512571536572016220 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU_DEBUG_HELPERS_H__ #define __STARPU_DEBUG_HELPERS_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* Perform a ping pong between the two memory nodes */ void _starpu_benchmark_ping_pong(starpu_data_handle_t handle, unsigned node0, unsigned node1, unsigned niter); /* Display the size of different data structures */ void _starpu_debug_display_structures_size(void); #ifdef __cplusplus } #endif #endif // __STARPU_DEBUG_HELPERS_H__ starpu-1.1.5/src/debug/structures_size.c0000644000373600000000000000333412571536572015264 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010, 2011 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #include #include #include void _starpu_debug_display_structures_size(void) { fprintf(stderr, "struct starpu_task\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct starpu_task), (unsigned) sizeof(struct starpu_task)); fprintf(stderr, "struct _starpu_job\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_job), (unsigned) sizeof(struct _starpu_job)); fprintf(stderr, "struct _starpu_data_state\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_data_state), (unsigned) sizeof(struct _starpu_data_state)); fprintf(stderr, "struct _starpu_tag\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_tag), (unsigned) sizeof(struct _starpu_tag)); fprintf(stderr, "struct _starpu_cg\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_cg), (unsigned) sizeof(struct _starpu_cg)); fprintf(stderr, "struct _starpu_worker\t\t%u bytes\t(%x)\n", (unsigned) sizeof(struct _starpu_worker), (unsigned) sizeof(struct _starpu_worker)); } starpu-1.1.5/src/debug/latency.c0000644000373600000000000000345712571536572013454 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2012 Université de Bordeaux * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * 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, replicate_0, STARPU_RW, 0, 0, NULL, NULL); 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, replicate_1, STARPU_RW, 0, 0, NULL, NULL); STARPU_ASSERT(!ret); _starpu_release_data_on_node(handle, 0, replicate_1); } } starpu-1.1.5/src/debug/traces/0002755000373600000000000000000012571541161013171 500000000000000starpu-1.1.5/src/debug/traces/starpu_fxt_mpi.c0000644000373600000000000001540312571536572016334 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2012-2013 Université Bordeaux 1 * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied 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 struct mpi_transfer { unsigned matched; int other_rank; /* src for a recv, dest for a send */ int mpi_tag; size_t size; float date; }; /* 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) { fprintf(stderr, "no more block ...\n"); break; } if (ev.code == FUT_MPI_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[64] = {NULL}; static struct mpi_transfer *mpi_recvs[64] = {NULL}; /* number of available slots in the lists */ unsigned mpi_sends_list_size[64] = {0}; unsigned mpi_recvs_list_size[64] = {0}; /* number of slots actually used in the list */ unsigned mpi_sends_used[64] = {0}; unsigned mpi_recvs_used[64] = {0}; /* number of slots already matched at the beginning of the list. This permits * going through the lists from the beginning to match each and every * transfer, thus avoiding a quadratic complexity. */ unsigned mpi_recvs_matched[64] = {0}; void _starpu_fxt_mpi_add_send_transfer(int src, int dst STARPU_ATTRIBUTE_UNUSED, int mpi_tag, size_t size, float date) { 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; } mpi_sends[src] = realloc(mpi_sends[src], mpi_sends_list_size[src]*sizeof(struct mpi_transfer)); } mpi_sends[src][slot].matched = 0; mpi_sends[src][slot].other_rank = dst; mpi_sends[src][slot].mpi_tag = mpi_tag; mpi_sends[src][slot].size = size; mpi_sends[src][slot].date = date; } void _starpu_fxt_mpi_add_recv_transfer(int src STARPU_ATTRIBUTE_UNUSED, int dst, int mpi_tag, float date) { 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; } mpi_recvs[dst] = realloc(mpi_recvs[dst], mpi_recvs_list_size[dst]*sizeof(struct mpi_transfer)); } mpi_recvs[dst][slot].matched = 0; mpi_recvs[dst][slot].other_rank = dst; mpi_recvs[dst][slot].mpi_tag = mpi_tag; mpi_recvs[dst][slot].date = date; } static struct mpi_transfer *try_to_match_send_transfer(int src STARPU_ATTRIBUTE_UNUSED, int dst, int mpi_tag) { unsigned slot; unsigned firstslot = mpi_recvs_matched[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[dst] = slot; } } } /* If we reached that point, we could not find a match */ return NULL; } static unsigned long mpi_com_id = 0; static void display_all_transfers_from_trace(FILE *out_paje_file, int src) { unsigned slot; for (slot = 0; slot < mpi_sends_used[src]; slot++) { int dst = mpi_sends[src][slot].other_rank; int mpi_tag = mpi_sends[src][slot].mpi_tag; float start_date = mpi_sends[src][slot].date; size_t size = mpi_sends[src][slot].size; struct mpi_transfer *match; match = try_to_match_send_transfer(src, dst, mpi_tag); if (match) { float end_date = match->date; unsigned long id = mpi_com_id++; /* TODO replace 0 by a MPI program ? */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%lu", (long unsigned) size); snprintf(paje_key, STARPU_POTI_STR_LEN, "mpicom_%lu", id); char mpi_container[STARPU_POTI_STR_LEN]; snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", /* XXX */src); poti_StartLink(start_date, "MPICt", "MPIL", mpi_container, paje_value, paje_key); snprintf(mpi_container, sizeof(mpi_container), "%d_mpict", /* XXX */dst); poti_EndLink(end_date, "MPICt", "MPIL", mpi_container, paje_value, paje_key); #else fprintf(out_paje_file, "18 %.9f MPIL MPIroot %ld %d_mpict mpicom_%lu\n", start_date, size, /* XXX */src, id); fprintf(out_paje_file, "19 %.9f MPIL MPIroot %ld %d_mpict mpicom_%lu\n", end_date, size, /* XXX */dst, id); #endif } } else { fprintf(stderr, "Warning, could not match MPI transfer from %d to %d (tag %x) starting at %f\n", src, dst, mpi_tag, start_date); } } } void _starpu_fxt_display_mpi_transfers(struct starpu_fxt_options *options, int *ranks, FILE *out_paje_file) { unsigned inputfile; /* display the MPI transfers if possible */ for (inputfile = 0; inputfile < options->ninputfiles; inputfile++) { int filerank = ranks[inputfile]; display_all_transfers_from_trace(out_paje_file, filerank); } } #endif // STARPU_USE_FXT starpu-1.1.5/src/debug/traces/starpu_fxt_dag.c0000644000373600000000000000553612571536572016310 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2013, 2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #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) { fprintf(stderr,"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(uint64_t tag, unsigned long job_id) { if (out_file) fprintf(out_file, "\t \"tag_%llx\"->\"task_%lu\"->\"tag_%llx\" [style=dashed]\n", (unsigned long long)tag, (unsigned long)job_id, (unsigned long long) tag); } void _starpu_fxt_dag_add_tag_deps(uint64_t child, uint64_t father) { if (out_file) fprintf(out_file, "\t \"tag_%llx\"->\"tag_%llx\"\n", (unsigned long long)father, (unsigned long long)child); } void _starpu_fxt_dag_add_task_deps(unsigned long dep_prev, unsigned long dep_succ) { if (out_file) fprintf(out_file, "\t \"task_%lu\"->\"task_%lu\"\n", dep_prev, dep_succ); } void _starpu_fxt_dag_set_tag_done(uint64_t tag, const char *color) { if (out_file) fprintf(out_file, "\t \"tag_%llx\" [ style=filled, color=\"%s\"]\n", (unsigned long long)tag, color); } void _starpu_fxt_dag_set_task_done(unsigned long job_id, const char *label, const char *color) { if (out_file) fprintf(out_file, "\t \"task_%lu\" [ style=filled, label=\"%s\", color=\"%s\"]\n", job_id, label, color); } 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.1.5/src/debug/traces/starpu_fxt.h0000644000373600000000000000410512571536572015471 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2012 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #ifndef __STARPU__FXT_H__ #define __STARPU__FXT_H__ #include #include #include #ifdef STARPU_USE_FXT #include #include #include #include #include #include #include #include #include #include "../mpi/src/starpu_mpi_fxt.h" #include #include "../../../include/starpu_fxt.h" void _starpu_fxt_dag_init(char *dag_filename); void _starpu_fxt_dag_terminate(void); void _starpu_fxt_dag_add_tag(uint64_t tag, unsigned long job_id); void _starpu_fxt_dag_add_tag_deps(uint64_t child, uint64_t father); void _starpu_fxt_dag_set_tag_done(uint64_t tag, const char *color); void _starpu_fxt_dag_add_task_deps(unsigned long dep_prev, unsigned long dep_succ); void _starpu_fxt_dag_set_task_done(unsigned long job_id, const char *label, const char *color); void _starpu_fxt_dag_add_sync_point(void); /* * MPI */ int _starpu_fxt_mpi_find_sync_point(char *filename_in, uint64_t *offset, int *key, int *rank); void _starpu_fxt_mpi_add_send_transfer(int src, int dst, int mpi_tag, size_t size, float date); void _starpu_fxt_mpi_add_recv_transfer(int src, int dst, int mpi_tag, float date); 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); #endif // STARPU_USE_FXT #endif // __STARPU__FXT_H__ starpu-1.1.5/src/debug/traces/starpu_paje.c0000644000373600000000000003151712571536572015611 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2010-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include "starpu_fxt.h" #include #ifdef STARPU_HAVE_POTI #include #endif #ifdef STARPU_USE_FXT void _starpu_fxt_write_paje_header(FILE *file STARPU_ATTRIBUTE_UNUSED) { unsigned i; #ifdef STARPU_HAVE_POTI poti_header(1, 1); /* 1 as parameter means basic, no extended events */ #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"); #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("Mm", "Mn", "Memory Manager"); poti_DefineContainerType("W", "T", "Worker"); poti_DefineContainerType("MPICt", "T", "MPI Communication Thread"); poti_DefineContainerType("Sc", "P", "Scheduler"); poti_DefineEventType("prog_event", "P", "program event type"); /* Types for the memory node */ poti_DefineVariableType("bw", "Mm", "Bandwidth", "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 .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("thread_event", "T", "thread event type"); poti_DefineStateType("S", "T", "Thread State"); poti_DefineEntityValue("I", "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("Sc", "S", "Scheduling", ".7 .36 .0"); poti_DefineEntityValue("Sl", "S", "Sleeping", ".9 .1 .0"); poti_DefineEntityValue("P", "S", "Progressing", ".4 .1 .6"); poti_DefineEntityValue("U", "S", "Unpartitioning", ".0 .0 1.0"); /* Types for the MPI Communication Thread of the Memory Node */ poti_DefineEventType("MPIev", "MPICt", "MPI event type"); poti_DefineStateType("CtS", "MPICt", "Communication Thread State"); poti_DefineEntityValue("P", "CtS", "Processing", "0 0 0"); poti_DefineEntityValue("Sl", "CtS", "Sleeping", ".9 .1 .0"); poti_DefineEntityValue("UT", "CtS", "UserTesting", ".2 .1 .6"); poti_DefineEntityValue("UW", "CtS", "UserWaiting", ".4 .1 .3"); poti_DefineEntityValue("SdS", "CtS", "SendSubmitted", "1.0 .1 1.0"); poti_DefineEntityValue("RvS", "CtS", "RecieveSubmitted", "0.1 1.0 1.0"); poti_DefineEntityValue("SdC", "CtS", "SendCompleted", "1.0 .5 1.0"); poti_DefineEntityValue("RvC", "CtS", "RecieveCompleted", "0.5 1.0 1.0"); for (i=1; i<=10; i++) { char inctx[8]; snprintf(inctx, sizeof(inctx), "InCtx%u", i); char *ctx = inctx+2; poti_DefineStateType(ctx, "T", inctx); poti_DefineEntityValue("I", ctx, "Initializing", "0.0 .7 1.0"); poti_DefineEntityValue("D", ctx, "Deinitializing", "0.0 .1 .7"); poti_DefineEntityValue("Fi", ctx, "FetchingInput", "1.0 .1 1.0"); poti_DefineEntityValue("Po", ctx, "PushingOutput", "0.1 1.0 1.0"); poti_DefineEntityValue("C", ctx, "Callback", ".0 .3 .8"); poti_DefineEntityValue("B", ctx, "Overhead", ".5 .18 .0"); poti_DefineEntityValue("Sc", ctx, "Scheduling", ".7 .36 .0"); poti_DefineEntityValue("Sl", ctx, "Sleeping", ".9 .1 .0"); poti_DefineEntityValue("P", ctx, "Progressing", ".4 .1 .6"); poti_DefineEntityValue("U", ctx, "Unpartitioning", ".0 .0 1.0"); poti_DefineEntityValue("H", ctx, "Hypervisor", ".5 .18 .0"); } /* Types for the Scheduler */ poti_DefineVariableType("nsubmitted", "Sc", "Number of Submitted Uncompleted Tasks", "0 0 0"); poti_DefineVariableType("nready", "Sc", "Number of Ready Tasks", "0 0 0"); /* Link types */ poti_DefineLinkType("MPIL", "P", "MPICt", "MPICt", "Links between two MPI Communication Threads"); poti_DefineLinkType("L", "P", "Mm", "Mm", "Links between two Memory Managers"); /* Creating the MPI Program */ poti_CreateContainer(0, "MPIroot", "MPIP", "0", "root"); #else fprintf(file, " \n\ 1 MPIP 0 \"MPI Program\" \n\ 1 P MPIP \"Program\" \n\ 1 Mn P \"Memory Node\" \n\ 1 T Mn \"Thread\" \n\ 1 Mm Mn \"Memory Manager\" \n\ 1 W T \"Worker\" \n\ 1 MPICt T \"MPI Communication Thread\" \n\ 1 Sc P \"Scheduler State\" \n\ 2 prog_event P \"program event type\" \n\ 2 thread_event T \"thread event type\" \n\ 2 MPIev MPICt \"MPI event type\" \n\ 3 S T \"Thread State\" \n\ 3 CtS MPICt \"Communication Thread State\" \n"); for (i=1; i<=10; i++) fprintf(file, "3 Ctx%u T \"InCtx%u\" \n", i, i); fprintf(file, "\ 3 MS Mm \"Memory Node State\" \n\ 4 nsubmitted Sc \"Number of Submitted Uncompleted Tasks\" \n\ 4 nready Sc \"Number of Ready Tasks\" \n\ 4 bw Mm \"Bandwidth\" \n\ 6 I S Initializing \"0.0 .7 1.0\" \n\ 6 D S Deinitializing \"0.0 .1 .7\" \n\ 6 Fi S FetchingInput \"1.0 .1 1.0\" \n\ 6 Po S PushingOutput \"0.1 1.0 1.0\" \n\ 6 C S Callback \".0 .3 .8\" \n\ 6 B S Overhead \".5 .18 .0\" \n\ 6 Sc S Scheduling \".7 .36 .0\" \n\ 6 Sl S Sleeping \".9 .1 .0\" \n\ 6 P S Progressing \".4 .1 .6\" \n\ 6 U S Unpartitioning \".0 .0 1.0\" \n\ 6 H S Hypervisor \".5 .18 .0\" \n"); fprintf(file, "\ 6 P CtS Processing \"0 0 0\" \n\ 6 Sl CtS Sleeping \".9 .1 .0\" \n\ 6 UT CtS UserTesting \".2 .1 .6\" \n\ 6 UW CtS UserWaiting \".4 .1 .3\" \n\ 6 SdS CtS SendSubmitted \"1.0 .1 1.0\" \n\ 6 RvS CtS RecieveSubmitted \"0.1 1.0 1.0\" \n\ 6 SdC CtS SendCompleted \"1.0 .5 1.0\" \n\ 6 RvC CtS RecieveCompleted \"0.5 1.0 1.0\" \n"); for (i=1; i<=10; i++) fprintf(file, "\ 6 I Ctx%u Initializing \"0.0 .7 1.0\" \n\ 6 D Ctx%u Deinitializing \"0.0 .1 .7\" \n\ 6 Fi Ctx%u FetchingInput \"1.0 .1 1.0\" \n\ 6 Po Ctx%u PushingOutput \"0.1 1.0 1.0\" \n\ 6 C Ctx%u Callback \".0 .3 .8\" \n\ 6 B Ctx%u Overhead \".5 .18 .0\" \n\ 6 Sc Ctx%u Scheduling \".7 .36 .0\" \n\ 6 Sl Ctx%u Sleeping \".9 .1 .0\" \n\ 6 P Ctx%u Progressing \".4 .1 .6\" \n\ 6 U Ctx%u Unpartitioning \".0 .0 1.0\" \n", i, i, i, i, i, i, i, i, i, i); fprintf(file, "\ 6 A MS Allocating \".4 .1 .0\" \n\ 6 Ar MS AllocatingReuse \".1 .1 .8\" \n\ 6 F MS Freeing \".6 .3 .0\" \n\ 6 W MS WritingBack \".0 .0 .4\" \n\ 6 R MS Reclaiming \".0 .1 .6\" \n\ 6 Co MS DriverCopy \".3 .5 .1\" \n\ 6 CoA MS DriverCopyAsync \".1 .3 .1\" \n\ 6 No MS Nothing \".0 .0 .0\" \n\ 5 MPIL P MPICt MPICt MPIL \n\ 5 L P Mm Mm L\n"); fprintf(file, "7 0.0 MPIroot MPIP 0 root\n"); #endif } #endif starpu-1.1.5/src/debug/traces/starpu_fxt.c0000644000373600000000000016363112571536572015476 00000000000000/* StarPU --- Runtime system for heterogeneous multicore architectures. * * Copyright (C) 2009-2015 Université de Bordeaux * * StarPU is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * StarPU is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License in COPYING.LGPL for more details. */ #include #include #include #ifdef STARPU_HAVE_POTI #include #define STARPU_POTI_STR_LEN 200 #endif #ifdef STARPU_USE_FXT #include "starpu_fxt.h" #include #include #define CPUS_WORKER_COLORS_NB 8 #define CUDA_WORKER_COLORS_NB 9 #define OPENCL_WORKER_COLORS_NB 9 #define OTHER_WORKER_COLORS_NB 4 static char *cpus_worker_colors[CPUS_WORKER_COLORS_NB] = {"/greens9/7", "/greens9/6", "/greens9/5", "/greens9/4", "/greens9/9", "/greens9/3", "/greens9/2", "/greens9/1" }; static char *cuda_worker_colors[CUDA_WORKER_COLORS_NB] = {"/ylorrd9/9", "/ylorrd9/6", "/ylorrd9/3", "/ylorrd9/1", "/ylorrd9/8", "/ylorrd9/7", "/ylorrd9/4", "/ylorrd9/2", "/ylorrd9/1"}; static char *opencl_worker_colors[OPENCL_WORKER_COLORS_NB] = {"/blues9/9", "/blues9/6", "/blues9/3", "/blues9/1", "/blues9/8", "/blues9/7", "/blues9/4", "/blues9/2", "/blues9/1"}; static char *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 other_index = 0; 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 const char *get_worker_color(int workerid) { if (workerid >= STARPU_NMAXWORKERS) workerid = STARPU_NMAXWORKERS - 1; return worker_colors[workerid]; } static unsigned get_colour_symbol_red(char *name) { /* choose some colour ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("red", hash_symbol) % 1024; } static unsigned get_colour_symbol_green(char *name) { /* choose some colour ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("green", hash_symbol) % 1024; } static unsigned get_colour_symbol_blue(char *name) { /* choose some colour ... that's disguting yes */ uint32_t hash_symbol = starpu_hash_crc32c_string(name, 0); return (unsigned)starpu_hash_crc32c_string("blue", hash_symbol) % 1024; } static double last_codelet_start[STARPU_NMAXWORKERS]; static char last_codelet_symbol[STARPU_NMAXWORKERS][128]; /* 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 double reclaiming[STARPU_MAXNODES]; LIST_TYPE(_starpu_symbol_name, char *name; ) static struct _starpu_symbol_name_list symbol_list; LIST_TYPE(_starpu_communication, unsigned comid; double comm_start; double bandwidth; unsigned src_node; unsigned dst_node; ) static struct _starpu_communication_list communication_list; /* * Paje trace file tools */ static FILE *out_paje_file; static FILE *distrib_time; static FILE *activity_file; /* * Generic tools */ static double get_event_time_stamp(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { return (((double)(ev->time-options->file_offset))/1000000.0); } static int nworkers = 0; struct worker_entry { UT_hash_handle hh; unsigned long tid; int workerid; } *worker_ids; static void register_worker_id(unsigned long tid, int workerid) { nworkers++; struct worker_entry *entry; HASH_FIND(hh, worker_ids, &tid, sizeof(tid), entry); 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"); /* only register a thread once */ STARPU_ASSERT(entry == NULL); entry = malloc(sizeof(*entry)); entry->tid = tid; entry->workerid = workerid; HASH_ADD(hh, worker_ids, tid, sizeof(tid), entry); } static int find_worker_id(unsigned long tid) { struct worker_entry *entry; HASH_FIND(hh, worker_ids, &tid, sizeof(tid), entry); if (!entry) return -1; return entry->workerid; } 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; } } /* * 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 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 worker_set_state(double time, const char *prefix, long unsigned int workerid, const char *name) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); poti_SetState(time, container, "S", name); #else fprintf(out_paje_file, "10 %.9f %st%lu S %s\n", time, prefix, workerid, name); #endif } static void worker_push_state(double time, const char *prefix, long unsigned int workerid, const char *name) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); poti_PushState(time, container, "S", name); #else fprintf(out_paje_file, "11 %.9f %st%lu S %s\n", time, prefix, workerid, name); #endif } static void worker_pop_state(double time, const char *prefix, long unsigned int workerid) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; thread_container_alias(container, STARPU_POTI_STR_LEN, prefix, workerid); poti_PopState(time, container, "S"); #else fprintf(out_paje_file, "12 %.9f %st%lu S\n", time, prefix, workerid); #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 } /* * Initialization */ static void handle_new_mem_node(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char program_container[STARPU_POTI_STR_LEN]; program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); char new_memnode_container_alias[STARPU_POTI_STR_LEN], new_memnode_container_name[STARPU_POTI_STR_LEN]; char new_memmanager_container_alias[STARPU_POTI_STR_LEN], new_memmanager_container_name[STARPU_POTI_STR_LEN]; memnode_container_alias (new_memnode_container_alias, STARPU_POTI_STR_LEN, prefix, ev->param[0]); /* TODO: ramkind */ snprintf(new_memnode_container_name, STARPU_POTI_STR_LEN, "%sMEMNODE%"PRIu64"", prefix, ev->param[0]); poti_CreateContainer(get_event_time_stamp(ev, options), new_memnode_container_alias, "Mn", program_container, new_memnode_container_name); memmanager_container_alias (new_memmanager_container_alias, STARPU_POTI_STR_LEN, prefix, ev->param[0]); /* TODO: ramkind */ snprintf(new_memmanager_container_name, STARPU_POTI_STR_LEN, "%sMEMMANAGER%"PRIu64"", prefix, ev->param[0]); poti_CreateContainer(get_event_time_stamp(ev, options), new_memmanager_container_alias, "Mm", new_memnode_container_alias, new_memmanager_container_name); #else fprintf(out_paje_file, "7 %.9f %smn%"PRIu64" Mn %sp %sMEMNODE%"PRIu64"\n", get_event_time_stamp(ev, options), prefix, ev->param[0], prefix, options->file_prefix, ev->param[0]); fprintf(out_paje_file, "7 %.9f %smm%"PRIu64" Mm %smn%"PRIu64" %sMEMMANAGER%"PRIu64"\n", get_event_time_stamp(ev, options), prefix, ev->param[0], prefix, ev->param[0], options->file_prefix, ev->param[0]); #endif if (!options->no_bus) #ifdef STARPU_HAVE_POTI poti_SetVariable(get_event_time_stamp(ev, options), new_memmanager_container_alias, "bw", get_event_time_stamp(ev, options)); #else fprintf(out_paje_file, "13 %.9f %smm%"PRIu64" bw 0.0\n", get_event_time_stamp(ev, options), prefix, ev->param[0]); #endif } } static void handle_worker_init_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { /* arg0 : type of worker (cuda, cpu ..) arg1 : memory node arg2 : thread id */ char *prefix = options->file_prefix; int devid = ev->param[2]; int workerid = ev->param[1]; int nodeid = ev->param[3]; int threadid = ev->param[4]; register_worker_id(threadid, workerid); char *kindstr = ""; enum starpu_perfmodel_archtype archtype = 0; 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"; archtype = STARPU_CPU_DEFAULT; break; case _STARPU_FUT_CUDA_KEY: set_next_cuda_worker_color(workerid); kindstr = "CUDA"; archtype = STARPU_CUDA_DEFAULT + devid; break; case _STARPU_FUT_OPENCL_KEY: set_next_opencl_worker_color(workerid); kindstr = "OPENCL"; archtype = STARPU_OPENCL_DEFAULT + devid; break; default: STARPU_ABORT(); } if (out_paje_file) { #ifdef STARPU_HAVE_POTI char new_thread_container_alias[STARPU_POTI_STR_LEN]; thread_container_alias (new_thread_container_alias, STARPU_POTI_STR_LEN, prefix, threadid); char new_worker_container_alias[STARPU_POTI_STR_LEN]; worker_container_alias (new_worker_container_alias, STARPU_POTI_STR_LEN, prefix, workerid); char memnode_container[STARPU_POTI_STR_LEN]; memnode_container_alias(memnode_container, STARPU_POTI_STR_LEN, prefix, nodeid); char new_thread_container_name[STARPU_POTI_STR_LEN]; snprintf(new_thread_container_name, STARPU_POTI_STR_LEN, "%s%d", prefix, threadid); char new_worker_container_name[STARPU_POTI_STR_LEN]; snprintf(new_worker_container_name, STARPU_POTI_STR_LEN, "%s%s%d", prefix, kindstr, devid); poti_CreateContainer(get_event_time_stamp(ev, options), new_thread_container_alias, "T", memnode_container, new_thread_container_name); poti_CreateContainer(get_event_time_stamp(ev, options), new_worker_container_alias, "W", new_thread_container_alias, new_worker_container_name); #else fprintf(out_paje_file, "7 %.9f %st%d T %smn%d %s%d\n", get_event_time_stamp(ev, options), prefix, threadid, prefix, nodeid, prefix, threadid); fprintf(out_paje_file, "7 %.9f %sw%d W %st%d %s%s%d\n", get_event_time_stamp(ev, options), prefix, workerid, prefix, threadid, prefix, kindstr, devid); #endif } /* start initialization */ if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), prefix, threadid, "I"); if (activity_file) fprintf(activity_file, "name\t%d\t%s %d\n", workerid, kindstr, devid); snprintf(options->worker_names[workerid], 256, "%s %d", kindstr, devid); options->worker_archtypes[workerid] = archtype; } static void handle_worker_init_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), prefix, ev->param[0], "B"); /* Initilize the accumulated time counters */ int worker = find_worker_id(ev->param[0]); last_activity_flush_timestamp[worker] = get_event_time_stamp(ev, options); accumulated_sleep_time[worker] = 0.0; accumulated_exec_time[worker] = 0.0; } static void handle_worker_deinit_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), prefix, ev->param[0], "D"); } static void handle_worker_deinit_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char worker_container[STARPU_POTI_STR_LEN]; thread_container_alias(worker_container, STARPU_POTI_STR_LEN, prefix, ev->param[1]); poti_DestroyContainer(get_event_time_stamp(ev, options), "T", worker_container); #else fprintf(out_paje_file, "8 %.9f %st%"PRIu64" T\n", get_event_time_stamp(ev, options), prefix, ev->param[1]); #endif } } #ifdef STARPU_HAVE_POTI static void create_paje_state_color(char *name, char *type, float red, float green, float blue) { char color[STARPU_POTI_STR_LEN]; snprintf(color, STARPU_POTI_STR_LEN, "%f %f %f", red, green, blue); poti_DefineEntityValue(name, type, name, color); } #endif static void create_paje_state_if_not_found(char *name, struct starpu_fxt_options *options) { struct _starpu_symbol_name *itor; for (itor = _starpu_symbol_name_list_begin(&symbol_list); itor != _starpu_symbol_name_list_end(&symbol_list); itor = _starpu_symbol_name_list_next(itor)) { if (!strcmp(name, itor->name)) { /* we found an entry */ return; } } /* it's the first time ... */ struct _starpu_symbol_name *entry = _starpu_symbol_name_new(); entry->name = malloc(strlen(name) + 1); strcpy(entry->name, name); _starpu_symbol_name_list_push_front(&symbol_list, entry); /* choose some colour ... that's disguting yes */ unsigned hash_symbol_red = get_colour_symbol_red(name); unsigned hash_symbol_green = get_colour_symbol_green(name); unsigned hash_symbol_blue = get_colour_symbol_blue(name); uint32_t hash_sum = hash_symbol_red + hash_symbol_green + hash_symbol_blue; float red, green, blue; if (options->per_task_colour) { red = (1.0f * hash_symbol_red) / hash_sum; green = (1.0f * hash_symbol_green) / hash_sum; blue = (1.0f * hash_symbol_blue) / hash_sum; } else { /* Use the hardcoded value for execution mode */ red = 0.0f; green = 0.6f; blue = 0.4f; } /* create the Paje state */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI create_paje_state_color(name, "S", red, green, blue); create_paje_state_color(name, "Ctx1", 255.0, 102.0, 255.0); create_paje_state_color(name, "Ctx2", .0, 255.0, 0.0); create_paje_state_color(name, "Ctx3", 255.0, 255.0, .0); create_paje_state_color(name, "Ctx4", .0, 245.0, 255.0); create_paje_state_color(name, "Ctx5", .0, .0, .0); create_paje_state_color(name, "Ctx6", .0, .0, 128.0); create_paje_state_color(name, "Ctx7", 105.0, 105.0, 105.0); create_paje_state_color(name, "Ctx8", 255.0, .0, 255.0); create_paje_state_color(name, "Ctx9", .0, .0, 1.0); create_paje_state_color(name, "Ctx10", 154.0, 205.0, 50.0); #else fprintf(out_paje_file, "6 %s S %s \"%f %f %f\" \n", name, name, red, green, blue); fprintf(out_paje_file, "6 %s Ctx1 %s \"255.0 102.0 255.0\" \n", name, name); fprintf(out_paje_file, "6 %s Ctx2 %s \".0 255.0 .0\" \n", name, name); fprintf(out_paje_file, "6 %s Ctx3 %s \"225.0 225.0 .0\" \n", name, name); fprintf(out_paje_file, "6 %s Ctx4 %s \".0 245.0 255.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 128.0\" \n", name, name); fprintf(out_paje_file, "6 %s Ctx7 %s \"105.0 105.0 105.0\" \n", name, name); fprintf(out_paje_file, "6 %s Ctx8 %s \"255.0 .0 255.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 \"154.0 205.0 50.0\" \n", name, name); #endif } } static void handle_start_codelet_body(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[2]); unsigned sched_ctx = ev->param[1]; if (worker < 0) return; char *prefix = options->file_prefix; unsigned long has_name = ev->param[3]; char *name = has_name?(char *)&ev->param[4]:"unknown"; snprintf(last_codelet_symbol[worker], sizeof(last_codelet_symbol[worker]), "%s", name); double start_codelet_time = get_event_time_stamp(ev, options); last_codelet_start[worker] = start_codelet_time; create_paje_state_if_not_found(name, options); if (out_paje_file) { 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%d", sched_ctx); thread_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 %st%"PRIu64" Ctx%d %s\n", start_codelet_time, prefix, ev->param[2], sched_ctx, name); #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; worker = find_worker_id(ev->param[4]); if (worker < 0) return; char *prefix = options->file_prefix; double end_codelet_time = get_event_time_stamp(ev, options); size_t codelet_size = ev->param[1]; uint32_t codelet_hash = ev->param[2]; if (out_paje_file) worker_set_state(end_codelet_time, prefix, ev->param[4], "B"); double codelet_length = (end_codelet_time - last_codelet_start[worker]); update_accumulated_time(worker, 0.0, codelet_length, end_codelet_time, 0); if (distrib_time) fprintf(distrib_time, "%s\t%s%d\t%ld\t%"PRIx32"\t%.9f\n", last_codelet_symbol[worker], prefix, worker, (unsigned long) codelet_size, codelet_hash, codelet_length); if (options->dumped_codelets) { enum starpu_perfmodel_archtype archtype = ev->param[3]; dumped_codelets_count++; dumped_codelets = realloc(dumped_codelets, dumped_codelets_count*sizeof(struct starpu_fxt_codelet_event)); snprintf(dumped_codelets[dumped_codelets_count - 1].symbol, 256, "%s", last_codelet_symbol[worker]); dumped_codelets[dumped_codelets_count - 1].workerid = worker; dumped_codelets[dumped_codelets_count - 1].archtype = archtype; 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; } } static void handle_user_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; unsigned long code = ev->param[0]; #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%lu", code); #endif char *prefix = options->file_prefix; worker = find_worker_id(ev->param[1]); if (worker < 0) { if (out_paje_file) #ifdef STARPU_HAVE_POTI program_container_alias (container, STARPU_POTI_STR_LEN, prefix); #else fprintf(out_paje_file, "9 %.9f event %sp %lu\n", get_event_time_stamp(ev, options), prefix, code); #endif } else { if (out_paje_file) #ifdef STARPU_HAVE_POTI thread_container_alias (container, STARPU_POTI_STR_LEN, prefix, ev->param[1]); #else fprintf(out_paje_file, "9 %.9f event %st%"PRIu64" %lu\n", get_event_time_stamp(ev, options), prefix, ev->param[1], code); #endif } #ifdef STARPU_HAVE_POTI if (out_paje_file) poti_NewEvent(get_event_time_stamp(ev, options), container, "thread_event", paje_value); #endif } static void handle_start_callback(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[1]); if (worker < 0) return; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "C"); } static void handle_end_callback(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[1]); if (worker < 0) return; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], "B"); } static void handle_hyp_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "H"); } static void handle_hyp_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { /* int worker; */ /* worker = find_worker_id(ev->param[0]); */ /* if (worker < 0) */ /* return; */ /* if (out_paje_file) */ /* worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "B"); */ } static void handle_worker_status(struct fxt_ev_64 *ev, struct starpu_fxt_options *options, const char *newstatus) { int worker; worker = find_worker_id(ev->param[1]); if (worker < 0) return; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[1], newstatus); } static double last_sleep_start[STARPU_NMAXWORKERS]; static void handle_start_scheduling(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); } static void handle_end_scheduling(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "B"); } static void handle_push_scheduling(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) worker_push_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sc"); } static void handle_pop_scheduling(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; if (out_paje_file) worker_pop_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0]); } static void handle_start_sleep(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; double start_sleep_time = get_event_time_stamp(ev, options); last_sleep_start[worker] = start_sleep_time; if (out_paje_file) worker_set_state(get_event_time_stamp(ev, options), options->file_prefix, ev->param[0], "Sl"); } static void handle_end_sleep(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int worker; worker = find_worker_id(ev->param[0]); if (worker < 0) return; double end_sleep_timestamp = get_event_time_stamp(ev, options); if (out_paje_file) worker_set_state(end_sleep_timestamp, options->file_prefix, ev->param[0], "B"); double sleep_length = end_sleep_timestamp - last_sleep_start[worker]; update_accumulated_time(worker, sleep_length, 0.0, end_sleep_timestamp, 0); } static void handle_data_copy(void) { } 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]; char *prefix = options->file_prefix; if (!options->no_bus) { if (out_paje_file) { double time = get_event_time_stamp(ev, options); memnode_set_state(time, prefix, dst, "Co"); #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN], src_memnode_container[STARPU_POTI_STR_LEN]; char program_container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%u", size); snprintf(paje_key, STARPU_POTI_STR_LEN, "com_%u", comid); program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); memmanager_container_alias(src_memnode_container, STARPU_POTI_STR_LEN, prefix, src); poti_StartLink(time, program_container, "L", src_memnode_container, paje_value, paje_key); #else fprintf(out_paje_file, "18 %.9f L %sp %u %smm%u com_%u\n", time, prefix, size, prefix, src, comid); #endif } /* create a structure to store the start of the communication, this will be matched later */ struct _starpu_communication *com = _starpu_communication_new(); com->comid = comid; com->comm_start = get_event_time_stamp(ev, options); com->src_node = src; com->dst_node = dst; _starpu_communication_list_push_back(&communication_list, com); } } static void handle_end_driver_copy(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned dst = ev->param[1]; unsigned size = ev->param[2]; unsigned comid = ev->param[3]; char *prefix = options->file_prefix; if (!options->no_bus) { if (out_paje_file) { double time = get_event_time_stamp(ev, options); memnode_set_state(time, prefix, dst, "No"); #ifdef STARPU_HAVE_POTI char paje_value[STARPU_POTI_STR_LEN], paje_key[STARPU_POTI_STR_LEN]; char dst_memnode_container[STARPU_POTI_STR_LEN], program_container[STARPU_POTI_STR_LEN]; snprintf(paje_value, STARPU_POTI_STR_LEN, "%u", size); snprintf(paje_key, STARPU_POTI_STR_LEN, "com_%u", comid); program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); memmanager_container_alias(dst_memnode_container, STARPU_POTI_STR_LEN, prefix, dst); poti_EndLink(time, program_container, "L", dst_memnode_container, paje_value, paje_key); #else fprintf(out_paje_file, "19 %.9f L %sp %u %smm%u com_%u\n", time, prefix, size, prefix, dst, comid); #endif } /* look for a data transfer to match */ struct _starpu_communication *itor; for (itor = _starpu_communication_list_begin(&communication_list); itor != _starpu_communication_list_end(&communication_list); itor = _starpu_communication_list_next(itor)) { if (itor->comid == comid) { double comm_end = get_event_time_stamp(ev, options); double bandwidth = (double)((0.001*size)/(comm_end - itor->comm_start)); itor->bandwidth = bandwidth; struct _starpu_communication *com = _starpu_communication_new(); com->comid = comid; com->comm_start = get_event_time_stamp(ev, options); com->bandwidth = -bandwidth; com->src_node = itor->src_node; com->dst_node = itor->dst_node; _starpu_communication_list_push_back(&communication_list, com); break; } } } } static void handle_start_driver_copy_async(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned dst = ev->param[1]; char *prefix = options->file_prefix; if (!options->no_bus) if (out_paje_file) memnode_set_state(get_event_time_stamp(ev, options), prefix, dst, "CoA"); } static void handle_end_driver_copy_async(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned dst = ev->param[1]; char *prefix = options->file_prefix; if (!options->no_bus) if (out_paje_file) memnode_set_state(get_event_time_stamp(ev, options), prefix, dst, "Co"); } 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); } /* * Number of task submitted to the scheduler */ static int curq_size = 0; static int nsubmitted = 0; static void handle_job_push(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); curq_size++; if (!options->no_counter && out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, options->file_prefix); poti_SetVariable(current_timestamp, container, "nready", (double)curq_size); #else fprintf(out_paje_file, "13 %.9f %ssched nready %f\n", current_timestamp, options->file_prefix, (float)curq_size); #endif } if (activity_file) fprintf(activity_file, "cnt_ready\t%.9f\t%d\n", current_timestamp, curq_size); } static void handle_job_pop(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); curq_size--; nsubmitted--; if (!options->no_counter && out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; scheduler_container_alias(container, STARPU_POTI_STR_LEN, options->file_prefix); poti_SetVariable(current_timestamp, container, "nready", (double)curq_size); poti_SetVariable(current_timestamp, container, "nsubmitted", (double)nsubmitted); #else fprintf(out_paje_file, "13 %.9f %ssched nready %f\n", current_timestamp, options->file_prefix, (float)curq_size); fprintf(out_paje_file, "13 %.9f %ssched nsubmitted %f\n", current_timestamp, options->file_prefix, (float)nsubmitted); #endif } if (activity_file) { fprintf(activity_file, "cnt_ready\t%.9f\t%d\n", current_timestamp, curq_size); fprintf(activity_file, "cnt_submitted\t%.9f\t%d\n", current_timestamp, nsubmitted); } } static void handle_update_task_cnt(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double current_timestamp = get_event_time_stamp(ev, options); nsubmitted++; 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_codelet_tag(struct fxt_ev_64 *ev) { uint64_t tag; unsigned long job; tag = ev->param[0]; job = ev->param[1]; _starpu_fxt_dag_add_tag(tag, job); } static void handle_codelet_tag_deps(struct fxt_ev_64 *ev) { uint64_t child; uint64_t father; child = ev->param[0]; father = ev->param[1]; _starpu_fxt_dag_add_tag_deps(child, father); } static void handle_task_deps(struct fxt_ev_64 *ev) { unsigned long dep_prev = ev->param[0]; unsigned long dep_succ = ev->param[1]; /* There is a dependency between both job id : dep_prev -> dep_succ */ _starpu_fxt_dag_add_task_deps(dep_prev, dep_succ); } static void handle_task_done(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { unsigned long job_id; job_id = ev->param[0]; unsigned long has_name = ev->param[3]; char *name = has_name?(char *)&ev->param[4]:"unknown"; int worker; worker = find_worker_id(ev->param[1]); const char *colour; char buffer[32]; if (options->per_task_colour) { snprintf(buffer, 32, "#%x%x%x", get_colour_symbol_red(name)/4, get_colour_symbol_green(name)/4, get_colour_symbol_blue(name)/4); colour = &buffer[0]; } else { colour= (worker < 0)?"#aaaaaa":get_worker_color(worker); } unsigned exclude_from_dag = ev->param[2]; if (!exclude_from_dag) _starpu_fxt_dag_set_task_done(job_id, name, colour); } static void handle_tag_done(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { uint64_t tag_id; tag_id = ev->param[0]; unsigned long has_name = ev->param[2]; char *name = has_name?(char *)&ev->param[3]:"unknown"; int worker; worker = find_worker_id(ev->param[1]); const char *colour; char buffer[32]; if (options->per_task_colour) { snprintf(buffer, 32, "%.4f,%.4f,%.4f", get_colour_symbol_red(name)/1024.0, get_colour_symbol_green(name)/1024.0, get_colour_symbol_blue(name)/1024.0); colour = &buffer[0]; } else { colour= (worker < 0)?"0.0,0.0,0.0":get_worker_color(worker); } _starpu_fxt_dag_set_tag_done(tag_id, colour); } static void handle_mpi_barrier(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int rank = ev->param[0]; STARPU_ASSERT(rank == options->file_rank || options->file_rank == -1); /* Add an event in the trace */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN], paje_value[STARPU_POTI_STR_LEN]; snprintf(container, STARPU_POTI_STR_LEN, "%sp", options->file_prefix); snprintf(paje_value, STARPU_POTI_STR_LEN, "%d", rank); poti_NewEvent(get_event_time_stamp(ev, options), container, "prog_event", paje_value); #else fprintf(out_paje_file, "9 %.9f prog_event %sp %d\n", get_event_time_stamp(ev, options), options->file_prefix, rank); #endif } } static void handle_mpi_start(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char program_container[STARPU_POTI_STR_LEN]; program_container_alias(program_container, STARPU_POTI_STR_LEN, prefix); char new_mpicommthread_container_alias[STARPU_POTI_STR_LEN], new_mpicommthread_container_name[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(new_mpicommthread_container_alias, STARPU_POTI_STR_LEN, prefix); snprintf(new_mpicommthread_container_alias, STARPU_POTI_STR_LEN, "%smpict", prefix); poti_CreateContainer(date, new_mpicommthread_container_alias, "MPICt", program_container, new_mpicommthread_container_name); #else fprintf(out_paje_file, "7 %.9f %smpict MPICt %sp %smpict\n", date, prefix, prefix, prefix); #endif mpicommthread_set_state(date, prefix, "Sl"); } } static void handle_mpi_stop(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); char *prefix = options->file_prefix; if (out_paje_file) { #ifdef STARPU_HAVE_POTI char mpicommthread_container[STARPU_POTI_STR_LEN]; mpicommthread_container_alias(mpicommthread_container, STARPU_POTI_STR_LEN, prefix); poti_DestroyContainer(date, "MPICt", mpicommthread_container); #else fprintf(out_paje_file, "8 %.9f %smpict MPICt\n", date, prefix); #endif } } static void handle_mpi_isend_submit_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "SdS"); } static 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]; double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); _starpu_fxt_mpi_add_send_transfer(options->file_rank, dest, mpi_tag, size, date); } static void handle_mpi_irecv_submit_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "RvS"); } static void handle_mpi_irecv_submit_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_isend_complete_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "SdC"); } static void handle_mpi_isend_complete_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_irecv_complete_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { int src = ev->param[0]; int mpi_tag = ev->param[1]; double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "RvC"); _starpu_fxt_mpi_add_recv_transfer(src, options->file_rank, mpi_tag, date); } static void handle_mpi_irecv_complete_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_sleep_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "Sl"); } static void handle_mpi_sleep_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_dtesting_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "DT"); } static void handle_mpi_dtesting_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_utesting_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "UT"); } static void handle_mpi_utesting_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_mpi_uwait_begin(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "UW"); } static void handle_mpi_uwait_end(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { double date = get_event_time_stamp(ev, options); if (out_paje_file) mpicommthread_set_state(date, options->file_prefix, "P"); } static void handle_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_event(struct fxt_ev_64 *ev, struct starpu_fxt_options *options) { char *event = (char*)&ev->param[0]; /* Add an event in the trace */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char container[STARPU_POTI_STR_LEN]; snprintf(container, STARPU_POTI_STR_LEN, "%sp", options->file_prefix); poti_NewEvent(get_event_time_stamp(ev, options), container, "prog_event", event); #else fprintf(out_paje_file, "9 %.9f prog_event %sp %s\n", get_event_time_stamp(ev, options), options->file_prefix, event); #endif } } static void _starpu_fxt_display_bandwidth(struct starpu_fxt_options *options) { float current_bandwidth_per_node[STARPU_MAXNODES] = {0.0}; char *prefix = options->file_prefix; 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)) { current_bandwidth_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, "bw", current_bandwidth_per_node[itor->src_node]); #else fprintf(out_paje_file, "13 %.9f %smm%u bw %f\n", itor->comm_start, prefix, itor->src_node, current_bandwidth_per_node[itor->src_node]); #endif } current_bandwidth_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, "bw", current_bandwidth_per_node[itor->dst_node]); #else fprintf(out_paje_file, "13 %.9f %smm%u bw %f\n", itor->comm_start, prefix, itor->dst_node, current_bandwidth_per_node[itor->dst_node]); #endif } } } /* * Public functions */ static void starpu_fxt_parse_new_file(char *filename_in, struct starpu_fxt_options *options) { /* Open the trace file */ int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } static fxt_t fut; fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } fxt_blockev_t block; block = fxt_blockev_enter(fut); _starpu_symbol_name_list_init(&symbol_list); _starpu_communication_list_init(&communication_list); char *prefix = options->file_prefix; /* TODO starttime ...*/ /* create the "program" container */ if (out_paje_file) { #ifdef STARPU_HAVE_POTI char new_program_container_alias[STARPU_POTI_STR_LEN], new_program_container_name[STARPU_POTI_STR_LEN]; program_container_alias(new_program_container_alias, STARPU_POTI_STR_LEN, prefix); snprintf(new_program_container_name, STARPU_POTI_STR_LEN, "program %s", prefix); poti_CreateContainer (0, new_program_container_alias, "P", "MPIroot", new_program_container_name); if (!options->no_counter) { char new_scheduler_container_alias[STARPU_POTI_STR_LEN], new_scheduler_container_name[STARPU_POTI_STR_LEN]; scheduler_container_alias(new_scheduler_container_alias, STARPU_POTI_STR_LEN, prefix); snprintf(new_scheduler_container_name, STARPU_POTI_STR_LEN, "scheduler %s", prefix); poti_CreateContainer(0.0, new_scheduler_container_alias, "Sc", new_program_container_alias, new_scheduler_container_name); poti_SetVariable(0.0, new_scheduler_container_alias, "nsubmitted", 0.0); poti_SetVariable(0.0, new_scheduler_container_alias, "nready", 0.0); } #else fprintf(out_paje_file, "7 0.0 %sp P MPIroot %sprogram \n", prefix, prefix); /* create a variable with the number of tasks */ if (!options->no_counter) { fprintf(out_paje_file, "7 %.9f %ssched Sc %sp scheduler\n", 0.0, prefix, prefix); 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); } #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_END_CODELET_BODY: handle_end_codelet_body(&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; /* check the memory transfer overhead */ case _STARPU_FUT_START_FETCH_INPUT: handle_worker_status(&ev, options, "Fi"); break; case _STARPU_FUT_START_PUSH_OUTPUT: handle_worker_status(&ev, options, "Po"); break; case _STARPU_FUT_START_PROGRESS: handle_worker_status(&ev, options, "P"); break; case _STARPU_FUT_START_UNPARTITION: handle_worker_status(&ev, options, "U"); break; case _STARPU_FUT_END_FETCH_INPUT: case _STARPU_FUT_END_PROGRESS: case _STARPU_FUT_END_PUSH_OUTPUT: case _STARPU_FUT_END_UNPARTITION: handle_worker_status(&ev, options, "B"); break; case _STARPU_FUT_WORKER_SCHEDULING_START: handle_start_scheduling(&ev, options); break; case _STARPU_FUT_WORKER_SCHEDULING_END: handle_end_scheduling(&ev, options); break; case _STARPU_FUT_WORKER_SCHEDULING_PUSH: handle_push_scheduling(&ev, options); break; case _STARPU_FUT_WORKER_SCHEDULING_POP: handle_pop_scheduling(&ev, options); break; case _STARPU_FUT_WORKER_SLEEP_START: handle_start_sleep(&ev, options); break; case _STARPU_FUT_WORKER_SLEEP_END: handle_end_sleep(&ev, options); break; case _STARPU_FUT_TAG: handle_codelet_tag(&ev); break; case _STARPU_FUT_TAG_DEPS: handle_codelet_tag_deps(&ev); break; case _STARPU_FUT_TASK_DEPS: handle_task_deps(&ev); 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_DATA_COPY: if (!options->no_bus) handle_data_copy(); 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: /* XXX */ 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_memnode_event(&ev, options, "A"); break; case _STARPU_FUT_START_ALLOC_REUSE: if (!options->no_bus) handle_memnode_event(&ev, options, "Ar"); break; case _STARPU_FUT_END_ALLOC: case _STARPU_FUT_END_ALLOC_REUSE: if (!options->no_bus) handle_memnode_event(&ev, options, "No"); break; case _STARPU_FUT_START_FREE: if (!options->no_bus) { handle_memnode_event(&ev, options, "F"); } break; case _STARPU_FUT_END_FREE: if (!options->no_bus) { unsigned memnode = ev.param[0]; if (reclaiming[memnode]) handle_memnode_event(&ev, options, "R"); else handle_memnode_event(&ev, options, "No"); } break; case _STARPU_FUT_START_WRITEBACK: if (!options->no_bus) { handle_memnode_event(&ev, options, "W"); } break; case _STARPU_FUT_END_WRITEBACK: if (!options->no_bus) { unsigned memnode = ev.param[0]; if (reclaiming[memnode]) handle_memnode_event(&ev, options, "R"); else handle_memnode_event(&ev, options, "No"); } break; case _STARPU_FUT_START_MEMRECLAIM: if (!options->no_bus) { unsigned memnode = ev.param[0]; reclaiming[memnode] = 1; handle_memnode_event(&ev, options, "R"); } break; case _STARPU_FUT_END_MEMRECLAIM: if (!options->no_bus) { unsigned memnode = ev.param[0]; reclaiming[memnode] = 0; handle_memnode_event(&ev, options, "No"); } break; case _STARPU_FUT_USER_EVENT: handle_user_event(&ev, options); break; case FUT_MPI_START: handle_mpi_start(&ev, options); break; case FUT_MPI_STOP: handle_mpi_stop(&ev, options); break; case FUT_MPI_BARRIER: handle_mpi_barrier(&ev, options); break; case FUT_MPI_ISEND_SUBMIT_BEGIN: handle_mpi_isend_submit_begin(&ev, options); break; case FUT_MPI_ISEND_SUBMIT_END: handle_mpi_isend_submit_end(&ev, options); break; case FUT_MPI_IRECV_SUBMIT_BEGIN: handle_mpi_irecv_submit_begin(&ev, options); break; case FUT_MPI_IRECV_SUBMIT_END: handle_mpi_irecv_submit_end(&ev, options); break; case FUT_MPI_ISEND_COMPLETE_BEGIN: handle_mpi_isend_complete_begin(&ev, options); break; case FUT_MPI_ISEND_COMPLETE_END: handle_mpi_isend_complete_end(&ev, options); break; case FUT_MPI_IRECV_COMPLETE_BEGIN: handle_mpi_irecv_complete_begin(&ev, options); break; case FUT_MPI_IRECV_COMPLETE_END: handle_mpi_irecv_complete_end(&ev, options); break; case FUT_MPI_SLEEP_BEGIN: handle_mpi_sleep_begin(&ev, options); break; case FUT_MPI_SLEEP_END: handle_mpi_sleep_end(&ev, options); break; case FUT_MPI_DTESTING_BEGIN: handle_mpi_dtesting_begin(&ev, options); break; case FUT_MPI_DTESTING_END: handle_mpi_dtesting_end(&ev, options); break; case FUT_MPI_UTESTING_BEGIN: handle_mpi_utesting_begin(&ev, options); break; case FUT_MPI_UTESTING_END: handle_mpi_utesting_end(&ev, options); break; case FUT_MPI_UWAIT_BEGIN: handle_mpi_uwait_begin(&ev, options); break; case FUT_MPI_UWAIT_END: handle_mpi_uwait_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: handle_event(&ev, options); break; case _STARPU_FUT_HYPERVISOR_BEGIN: handle_hyp_begin(&ev, options); break; case _STARPU_FUT_HYPERVISOR_END: handle_hyp_end(&ev, options); break; default: #ifdef STARPU_VERBOSE fprintf(stderr, "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; } } /* 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_counter = 0; options->no_bus = 0; options->ninputfiles = 0; options->out_paje_path = "paje.trace"; options->dag_path = "dag.dot"; options->distrib_time_path = "distrib.data"; options->dumped_codelets = NULL; options->activity_path = "activity.data"; } static void starpu_fxt_distrib_file_init(struct starpu_fxt_options *options) { dumped_codelets_count = 0; dumped_codelets = NULL; if (options->distrib_time_path) { distrib_time = fopen(options->distrib_time_path, "w+"); } else { distrib_time = NULL; } } static void starpu_fxt_distrib_file_close(struct starpu_fxt_options *options) { if (distrib_time) fclose(distrib_time); if (options->dumped_codelets) { *options->dumped_codelets = dumped_codelets; options->dumped_codelets_count = dumped_codelets_count; } } static void starpu_fxt_activity_file_init(struct starpu_fxt_options *options) { if (options->activity_path) activity_file = fopen(options->activity_path, "w+"); else activity_file = NULL; } static void starpu_fxt_activity_file_close(void) { if (activity_file) fclose(activity_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) { fprintf(stderr,"error while opening %s\n", options->out_paje_path); perror("fopen"); exit(1); } #ifdef STARPU_HAVE_POTI poti_init (out_paje_file); #endif _starpu_fxt_write_paje_header(out_paje_file); } else { out_paje_file = NULL; } } static void starpu_fxt_paje_file_close(void) { if (out_paje_file) fclose(out_paje_file); } static uint64_t starpu_fxt_find_start_time(char *filename_in) { /* Open the trace file */ int fd_in; fd_in = open(filename_in, O_RDONLY); if (fd_in < 0) { perror("open failed :"); exit(-1); } static fxt_t fut; fut = fxt_fdopen(fd_in); if (!fut) { perror("fxt_fdopen :"); exit(-1); } fxt_blockev_t block; block = fxt_blockev_enter(fut); struct fxt_ev_64 ev; int ret = fxt_next_ev(block, FXT_EV_TYPE_64, (struct fxt_ev *)&ev); STARPU_ASSERT (ret == FXT_EV_OK); /* Close the trace file */ if (close(fd_in)) { perror("close failed :"); exit(-1); } return (ev.time); } void starpu_fxt_generate_trace(struct starpu_fxt_options *options) { _starpu_fxt_dag_init(options->dag_path); starpu_fxt_distrib_file_init(options); starpu_fxt_activity_file_init(options); starpu_fxt_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 = ""; 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]) { fprintf(stderr, "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]; #ifdef STARPU_VERBOSE fprintf(stderr, "Handle file %s (rank %d)\n", options->filenames[inputfile], filerank); #endif char file_prefix[32]; snprintf(file_prefix, sizeof(file_prefix), "%d_", filerank); options->file_prefix = 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); } _starpu_fxt_display_bandwidth(options); /* close the different files */ starpu_fxt_paje_file_close(); starpu_fxt_activity_file_close(); starpu_fxt_distrib_file_close(options); _starpu_fxt_dag_terminate(); options->nworkers = nworkers; } #endif // STARPU_USE_FXT starpu-1.1.5/STARPU-REVISION0000644000373600000000000000000612571536652012153 0000000000000016013 starpu-1.1.5/configure.ac0000644000373600000000000023075212571536551012257 00000000000000# StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009-2015 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Centre National de la Recherche Scientifique # Copyright (C) 2011 Télécom-SudParis # Copyright (C) 2011, 2012 Institut National de Recherche en Informatique et Automatique # Copyright (C) 2015 Inria # # StarPU is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or (at # your option) any later version. # # StarPU is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # See the GNU Lesser General Public License in COPYING.LGPL for more details. AC_INIT([StarPU], [1.1.5], [starpu-devel@lists.gforge.inria.fr], [starpu], [http://runtime.bordeaux.inria.fr/StarPU/]) AC_CONFIG_SRCDIR(include/starpu.h) AC_CONFIG_AUX_DIR([build-aux]) # libtool doesn't actually properly manage a space in the workdir case `pwd` in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac dnl Versioning. STARPU_MAJOR_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 1`" STARPU_MINOR_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 2`" STARPU_RELEASE_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 3`" STARPU_RELEASE_VERSION="`echo $PACKAGE_VERSION | cut -d . -f 3| sed 's/rc.*//'`" dnl we do not want the rcXX in the release version. we would like to use sed -r 's/[a-z]+.*//' to remove any string but the -r option is not portable AC_SUBST([STARPU_MAJOR_VERSION]) AC_SUBST([STARPU_MINOR_VERSION]) AC_SUBST([STARPU_RELEASE_VERSION]) AC_SUBST([STARPU_EFFECTIVE_VERSION]) AC_DEFINE_UNQUOTED([STARPU_MAJOR_VERSION], [$STARPU_MAJOR_VERSION], [Major version number of StarPU.]) AC_DEFINE_UNQUOTED([STARPU_MINOR_VERSION], [$STARPU_MINOR_VERSION], [Minor version number of StarPU.]) AC_DEFINE_UNQUOTED([STARPU_RELEASE_VERSION], [$STARPU_RELEASE_VERSION], [Release version number of StarPU.]) . "$srcdir/STARPU-VERSION" AC_SUBST([LIBSTARPU_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPU_INTERFACE_REVISION]) AC_SUBST([LIBSTARPU_INTERFACE_AGE]) AC_SUBST([LIBSTARPUMPI_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPUMPI_INTERFACE_REVISION]) AC_SUBST([LIBSTARPUMPI_INTERFACE_AGE]) AC_SUBST([LIBSTARPUFFT_INTERFACE_CURRENT]) AC_SUBST([LIBSTARPUFFT_INTERFACE_REVISION]) AC_SUBST([LIBSTARPUFFT_INTERFACE_AGE]) AC_SUBST([LIBSOCL_INTERFACE_CURRENT]) AC_SUBST([LIBSOCL_INTERFACE_REVISION]) AC_SUBST([LIBSOCL_INTERFACE_AGE]) AC_CANONICAL_SYSTEM dnl Automake 1.11 introduced `silent-rules' and `color-tests'. Use them dnl when they're available. m4_ifdef([AM_SILENT_RULES], [AM_INIT_AUTOMAKE([1.11 -Wall foreign silent-rules color-tests parallel-tests])], [AM_INIT_AUTOMAKE([1.10 -Wall foreign])]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)]) AC_PREREQ(2.60) 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 LT_PREREQ([2.2]) LT_INIT([win32-dll]) AC_PROG_INSTALL AC_PROG_MKDIR_P AC_PROG_LN_S AC_HEADER_STDC AC_C_RESTRICT # Check if bash is available AC_CHECK_PROGS([BASH], [bash]) # Check whether subversion is installed AC_PATH_PROG(svncommand, svn) AC_PATH_PROG(svnversioncommand, svnversion) # find out if we are are in a subversion directory svndir=0 if test "$svncommand" != "" ; then $svncommand info $srcdir >/dev/null 2>&1 if test $? -eq 0; then svndir=1 fi fi # use svnversion to record the current repository revision only if # subversion is installed and we are in a working copy if test "$svnversioncommand" = "" || test `LC_ALL=C $svnversioncommand -n $srcdir` = "exported" ; then if test -f $srcdir/STARPU-REVISION ; then cp $srcdir/STARPU-REVISION . else echo "unknown" > ./STARPU-REVISION fi else LC_ALL=C svnversion $srcdir > ./STARPU-REVISION fi AC_PATH_PROGS([STARPU_MS_LIB], [lib]) AC_ARG_VAR([STARPU_MS_LIB], [Path to Microsoft's Visual Studio `lib' tool]) AM_CONDITIONAL([STARPU_HAVE_MS_LIB], [test "x$STARPU_MS_LIB" != "x"]) case "$target" in *-*-mingw*|*-*-cygwin*) starpu_windows=yes libext=a AC_DEFINE(STARPU_HAVE_WINDOWS, [], [Define this on windows.]) ;; esac AM_CONDITIONAL([STARPU_HAVE_WINDOWS], [test "x$starpu_windows" = "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 CPPFLAGS+=" -I$STARPU_SRC_DIR/include/pthread_win32 " AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[ #include ]], [[ pthread_t t; pthread_create(&t, NULL, NULL, NULL); ]])], AC_DEFINE(STARPU_NATIVE_WINTHREADS,[],[Using native windows threads]), AC_MSG_ERROR([pthread_create unavailable])) else AC_CHECK_LIB([pthread], [pthread_create]) fi AC_CHECK_TYPE([struct timespec], AC_DEFINE(STARPU_HAVE_STRUCT_TIMESPEC,[],[struct timespec is defined]), [], [ #include #include #ifdef HAVE_UNISTD_H #include #endif #include #ifndef STARPU_NATIVE_WINTHREADS #include #endif ]) AC_SEARCH_LIBS([sqrt],[m],,AC_MSG_ERROR([math library unavailable])) AC_HAVE_LIBRARY([ws2_32]) AC_CHECK_FUNCS([sysconf]) 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,[],[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,[],[pthread_barrier is available]) fi # yes, that's non portable, but it's still better than sched_setaffinity AC_CHECK_FUNCS(pthread_setaffinity_np) # 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"]) 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/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.])]) # This defines HAVE_SYNC_VAL_COMPARE_AND_SWAP STARPU_CHECK_SYNC_VAL_COMPARE_AND_SWAP # This defines HAVE_SYNC_BOOL_COMPARE_AND_SWAP STARPU_CHECK_SYNC_BOOL_COMPARE_AND_SWAP # This defines HAVE_SYNC_FETCH_AND_ADD STARPU_CHECK_SYNC_FETCH_AND_ADD # This defines HAVE_SYNC_FETCH_AND_OR STARPU_CHECK_SYNC_FETCH_AND_OR # This defines HAVE_SYNC_LOCK_TEST_AND_SET STARPU_CHECK_SYNC_LOCK_TEST_AND_SET # This defines HAVE_SYNC_SYNCHRONIZE STARPU_CHECK_SYNC_SYNCHRONIZE CPPFLAGS="${CPPFLAGS} -D_GNU_SOURCE " STARPU_SEARCH_LIBS([LIBNUMA],[set_mempolicy],[numa],[enable_libnuma=yes],[enable_libnuma=no]) AC_MSG_CHECKING(whether libnuma is available) AC_MSG_RESULT($enable_libnuma) if test x$enable_libnuma = xyes; then AC_DEFINE(STARPU_HAVE_LIBNUMA,[],[libnuma is 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"]) ############################################################################### # # # 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 # How many parallel worker can we support ? nmaxcombinedworkers=`expr 2 \* $maxcpus` AC_DEFINE_UNQUOTED(STARPU_NMAX_COMBINEDWORKERS, [$nmaxcombinedworkers], [Maximum number of worker combinations]) ############################################################################### # # # CUDA settings # # # ############################################################################### AC_MSG_CHECKING(maximum number of CUDA devices) AC_ARG_ENABLE(maxcudadev, [AS_HELP_STRING([--enable-maxcudadev=], [maximum number of CUDA devices])], nmaxcudadev=$enableval, nmaxcudadev=4) AC_MSG_RESULT($nmaxcudadev) AC_DEFINE_UNQUOTED(STARPU_MAXCUDADEVS, [$nmaxcudadev], [maximum number of CUDA devices]) AC_ARG_ENABLE(cuda, [AS_HELP_STRING([--disable-cuda], [do not use CUDA device(s)])],, [enable_cuda=maybe]) #AC_MSG_CHECKING(whether CUDA is available) AC_ARG_WITH(cuda-dir, [AS_HELP_STRING([--with-cuda-dir=], [specify CUDA installation directory])], [ cuda_dir="$withval" # in case this was not explicit yet enable_cuda=yes ], cuda_dir=no) AC_ARG_WITH(cuda-include-dir, [AS_HELP_STRING([--with-cuda-include-dir=], [specify where CUDA headers are installed])], [ cuda_include_dir="$withval" # in case this was not explicit yet enable_cuda=yes ], [cuda_include_dir=no]) AC_ARG_WITH(cuda-lib-dir, [AS_HELP_STRING([--with-cuda-lib-dir=], [specify where CUDA libraries are installed])], [ cuda_lib_dir="$withval" # in case this was not explicit yet enable_cuda=yes ], [cuda_lib_dir=no]) AC_DEFUN([STARPU_CHECK_CUDA_L], [ __cuda_L=$1 SAVED_LDFLAGS="${LDFLAGS}" STARPU_CUDA_LDFLAGS="${__cuda_L}" AC_MSG_CHECKING(whether CUDA is available with: $__cuda_L) AC_MSG_RESULT() LDFLAGS="${SAVED_LDFLAGS} ${__cuda_L}" AC_HAVE_LIBRARY([cuda],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_lib_cuda_main if test "$have_valid_cuda" = "yes" ; then AC_HAVE_LIBRARY([cudart],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_lib_cudart_main if test "$have_valid_cuda" = yes ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcudart" LDFLAGS="${SAVED_LDFLAGS} ${STARPU_CUDA_LDFLAGS}" # we also check that CUBLAS is available AC_HAVE_LIBRARY([cublas],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_lib_cublas_main if test "$have_valid_cuda" = "yes" ; then STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcublas" fi fi fi LDFLAGS="${SAVED_LDFLAGS}" ]) AC_DEFUN([STARPU_CHECK_CUDA], [ __cuda_dir=$1 __cuda_include_dir=$2 __cuda_lib_dir=$3 if test -z "$__cuda_lib_dir" ; then __cuda_lib_dir=no fi if test -z "$__cuda_include_dir" ; then __cuda_include_dir=no fi if test -z "$__cuda_dir" ; then __cuda_dir=no fi if test "$__cuda_dir" != "no" ; then AC_MSG_CHECKING(whether CUDA is available in $__cuda_dir, $__cuda_include_dir and $__cuda_lib_dir) else AC_MSG_CHECKING(whether CUDA is available) fi AC_MSG_RESULT() if test "$__cuda_include_dir" = "no" -a "$__cuda_dir" != "no" ; then __cuda_include_dir="$__cuda_dir/include" fi SAVED_CPPFLAGS="$CPPFLAGS" have_valid_cuda=no if test "$__cuda_include_dir" != "no" ; then CPPFLAGS="${CPPFLAGS} -I$__cuda_include_dir" fi AC_CHECK_HEADER([cuda.h],[have_valid_cuda=yes],[have_valid_cuda=no]) unset ac_cv_header_cuda_h if test "$have_valid_cuda" = "yes" ; then if test "$__cuda_lib_dir" != "no" ; then STARPU_CHECK_CUDA_L("-L${__cuda_lib_dir}") else if test "$__cuda_dir" != "no" ; then for __cuda_libdir in lib64 lib lib/x64 lib/Win32 ; do STARPU_CHECK_CUDA_L("-L${__cuda_dir}/${__cuda_libdir}") if test "$have_valid_cuda" = yes ; then break fi done else STARPU_CHECK_CUDA_L("") fi fi fi if test "$have_valid_cuda" = "no" ; then CPPFLAGS="${SAVED_CPPFLAGS}" unset STARPU_CUDA_LDFLAGS else if test "$NVCC" = "" ; then AC_PATH_PROG([NVCC], [nvcc], [not-found], [$cuda_dir/bin:$PATH:/usr/local/cuda/bin:/usr/bin:/bin]) fi if test "x$NVCC" = "xnot-found"; then AC_MSG_WARN(['nvcc' not found, disabling CUDA]) have_valid_cuda=no else 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 rm -f cuda_test* fi # nvcc is a wrapper around GCC, and calls it with the -dumpspecs # option, which is GCC specific. If $CC does not support -dumpspecs, we # should let nvcc choose another compiler (by default, gcc, if it is # installed). If gcc is not installed, the build will probably fail. $CC -dumpspecs >/dev/null 2>&1 if test $? -eq 0 -a x$starpu_windows != xyes; then NVCCFLAGS="${NVCCFLAGS} -ccbin \${CC}" fi if test "$__cuda_include_dir" != "no"; then STARPU_CUDA_CPPFLAGS="-I$__cuda_include_dir" NVCCFLAGS="${NVCCFLAGS} -I$__cuda_include_dir" fi fi ]) if test x$enable_cuda = xyes -o x$enable_cuda = xmaybe; then STARPU_CHECK_CUDA("$cuda_dir", "$cuda_include_dir", "$cuda_lib_dir") if test "$have_valid_cuda" = "no" ; then STARPU_CHECK_CUDA("$CUDA_ROOT", "$CUDA_PATH", "$CUDA_INC_PATH", "$CUDA_LIB_PATH") fi if test "$have_valid_cuda" = "no" ; then for f in "/usr/local/cuda" "/c/cuda" "/cygdrive/c/cuda" "/opt/cuda" "$CUDA_ROOT" "$CUDA_PATH" "$CUDA_INC_PATH/.." "$CUDA_INC/.." "$CUDA_BIN/.." "$CUDA_SDK/.." "$CUDA_INSTALL_PATH" "$CUDA_TOOLKIT"; do if test -n "$f" ; then STARPU_CHECK_CUDA("$f", "no", "no") if test "$have_valid_cuda" = "yes" ; then break fi fi done fi # Check cuda is compatible with the C compiler AC_MSG_CHECKING(whether CUDA is working) if test "$have_valid_cuda" = "yes" ; then SAVED_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} ${STARPU_CUDA_CPPFLAGS}" SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS} -lcuda" AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[#include ]], [[]] )], [ AC_RUN_IFELSE([AC_LANG_PROGRAM( [[#include ]], [[]] )], [have_valid_cuda="yes"], [ AC_MSG_RESULT([CUDA found and can be compiled, but compiled application can not be run, is the CUDA path missing in LD_LIBRARY_PATH?]) have_valid_cuda="no" ]) ], [ AC_MSG_ERROR([CUDA found, but cuda.h could not be compiled]) have_valid_cuda="no" ] ) CPPFLAGS="${SAVED_CPPFLAGS}" LDFLAGS="${SAVED_LDFLAGS}" fi AC_MSG_RESULT($have_valid_cuda) # in case CUDA was explicitely required, but is not available, this is an error if test x$enable_cuda = xyes -a x$have_valid_cuda = xno; then AC_MSG_ERROR([cannot find CUDA]) fi # now we enable CUDA if and only if a proper setup is available enable_cuda=$have_valid_cuda fi AC_MSG_CHECKING(whether CUDA should be used) AC_MSG_RESULT($enable_cuda) AC_SUBST(STARPU_USE_CUDA, $enable_cuda) AM_CONDITIONAL(STARPU_USE_CUDA, test x$enable_cuda = xyes) if test x$enable_cuda = xyes; then AC_DEFINE(STARPU_USE_CUDA, [1], [CUDA support is activated]) # On Darwin, the libstdc++ dependency is not automatically added by nvcc # case "$target" in # *-*darwin*) AC_HAVE_LIBRARY([stdc++], []) ;; # #*-*darwin*) AC_HAVE_LIBRARY([stdc++], [STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lstdc++"]) ;; # esac STARPU_CUDA_LDFLAGS="$STARPU_CUDA_LDFLAGS -lcuda" STARPU_CUFFT_LDFLAGS="-lcufft" if test "$F77" = "gfortran" -o "$FC" = "gfortran" ; then STARPU_CUDA_FORTRAN_LDFLAGS="-lgfortran" AC_SUBST(STARPU_CUDA_FORTRAN_LDFLAGS) fi #in case this is a 64bit setup, we tell nvcc to use a -m64 flag if test x$SIZEOF_VOID_P = x8; then NVCCFLAGS="${NVCCFLAGS} -m64" AC_SUBST(NVCCFLAGS) fi AC_CHECK_HEADERS([cuda_gl_interop.h]) fi dnl Hey dude, are you around? PKG_PROG_PKG_CONFIG have_magma=no if test x$enable_cuda = xyes; then PKG_CHECK_MODULES([MAGMA], [magma], [ AC_DEFINE([STARPU_HAVE_MAGMA], [1], [Define to 1 if you have the MAGMA library.]) AC_SUBST([STARPU_HAVE_MAGMA], [1]) have_magma=yes ], [:]) fi AM_CONDITIONAL(STARPU_HAVE_MAGMA, [test x$have_magma = xyes]) AC_MSG_CHECKING(whether MAGMA should be used) AC_MSG_RESULT($have_magma) # cufftDoubleComplex may not be available on an old CUDA setup AC_CHECK_TYPE(cufftDoubleComplex, [have_cufftdoublecomplex=yes], [have_cufftdoublecomplex=no], [#include ]) AM_CONDITIONAL(STARPU_HAVE_CUFFTDOUBLECOMPLEX, test x$have_cufftdoublecomplex = xyes) if test x$have_cufftdoublecomplex = xyes; then AC_DEFINE(STARPU_HAVE_CUFFTDOUBLECOMPLEX, [1], [cufftDoubleComplex is available]) fi # The CURAND library is only available since CUDA 3.2 have_curand=$enable_cuda if test x$enable_cuda = xyes; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" AC_HAVE_LIBRARY([curand],[have_curand=yes],[have_curand=no]) LDFLAGS="${SAVED_LDFLAGS}" fi AC_MSG_CHECKING(whether CURAND is available) AC_MSG_RESULT($have_curand) if test x$have_curand = xyes; then AC_DEFINE(STARPU_HAVE_CURAND,[1], [CURAND is available]) STARPU_CURAND_LDFLAGS="$STARPU_CURAND_LDFLAGS -lcurand" AC_SUBST(STARPU_CURAND_LDFLAGS) fi # Peer transfers are only supported since CUDA 4.0 # Disable them if user explicity wants to disable them AC_ARG_ENABLE(cuda_memcpy_peer, [AS_HELP_STRING([--disable-cuda-memcpy-peer], [do not allow peer transfers when using CUDA 4.0])],, [enable_cuda_memcpy_peer=yes]) have_cuda_memcpy_peer=no if test x$enable_cuda_memcpy_peer = xyes -a x$enable_cuda = xyes ; then SAVED_LDFLAGS="${LDFLAGS}" LDFLAGS="${LDFLAGS} ${STARPU_CUDA_LDFLAGS}" AC_CHECK_FUNC([cudaMemcpyPeer], have_cuda_memcpy_peer=yes, have_cuda_memcpy_peer=no) LDFLAGS="${SAVED_LDFLAGS}" fi if test x$have_cuda_memcpy_peer = xyes; then AC_DEFINE(HAVE_CUDA_MEMCPY_PEER,[],[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([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 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" 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 ############################################################################### # # # Drivers # # # ############################################################################### AC_ARG_ENABLE(opencl-simulator, [AS_HELP_STRING([--enable-opencl-simulator], [Enable the use of an OpenCL simulator])], enable_opencl_simulator=$enableval, enable_opencl_simulator=no) if test x$enable_opencl_simulator = xyes; then enable_simgrid=yes AC_DEFINE(STARPU_OPENCL_SIMULATOR, 1, [Define this to enable using an OpenCL simulator]) fi AC_ARG_WITH(simgrid-dir, [AS_HELP_STRING([--with-simgrid-dir=], [specify SimGrid installation directory])], [ simgrid_dir="$withval" # in case this was not explicit yet enable_simgrid=yes ], simgrid_dir=no) AC_ARG_WITH(simgrid-include-dir, [AS_HELP_STRING([--with-simgrid-include-dir=], [specify where SimGrid headers are installed])], [ simgrid_include_dir="$withval" # in case this was not explicit yet enable_simgrid=yes ], [simgrid_include_dir=no]) AC_ARG_WITH(simgrid-lib-dir, [AS_HELP_STRING([--with-simgrid-lib-dir=], [specify where SimGrid libraries are installed])], [ simgrid_lib_dir="$withval" # in case this was not explicit yet enable_simgrid=yes ], [simgrid_lib_dir=no]) AC_ARG_ENABLE(simgrid, [AS_HELP_STRING([--enable-simgrid], [Enable simulating execution in simgrid])], enable_simgrid=$enableval, enable_simgrid=no) if test x$enable_simgrid = xyes ; then if test -n "$SIMGRID_CFLAGS" ; then CFLAGS="$SIMGRID_CFLAGS $CFLAGS" CXXFLAGS="$SIMGRID_CFLAGS $CXXFLAGS" NVCCFLAGS="$SIMGRID_CFLAGS $NVCCFLAGS" fi if test -n "$SIMGRID_LIBS" ; then LDFLAGS="$SIMGRID_LIBS $LDFLAGS" fi if test "$simgrid_dir" != "no" ; then CFLAGS="-I$simgrid_dir/include $CFLAGS" CXXFLAGS="-I$simgrid_dir/include $CXXFLAGS" NVCCFLAGS="-I$simgrid_dir/include $NVCCFLAGS" LDFLAGS="-L$simgrid_dir/lib $LDFLAGS" fi if test "$simgrid_include_dir" != "no" ; then CFLAGS="-I$simgrid_include_dir $CFLAGS" CXXFLAGS="-I$simgrid_include_dir $CXXFLAGS" NVCCFLAGS="-I$simgrid_include_dir $NVCCFLAGS" fi if test "$simgrid_lib_dir" != "no" ; then LDFLAGS="-L$simgrid_lib_dir $LDFLAGS" fi AC_HAVE_LIBRARY([simgrid], [], [ AC_MSG_ERROR(Simgrid support needs simgrid installed) ] ) AC_CHECK_HEADERS([simgrid/msg.h], [AC_DEFINE([STARPU_HAVE_SIMGRID_MSG_H], [1], [Define to 1 if you have msg.h in simgrid/.])]) AC_CHECK_FUNCS([xbt_mutex_try_acquire]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[ #ifdef STARPU_HAVE_SIMGRID_MSG_H #include #else #include #endif ]], [[msg_host_t foo; ]] )], [], [ AC_MSG_ERROR(StarPU needs a version of Simgrid which defines the type msg_host_t (should be any version >= 3.8.1)) ]) AC_DEFINE(STARPU_SIMGRID, 1, [Define this to enable simgrid execution]) # We won't bind or detect anything with_hwloc=no fi AM_CONDITIONAL(STARPU_SIMGRID, test x$enable_simgrid = xyes) AC_SUBST(SIMGRID_CFLAGS) AC_SUBST(SIMGRID_LIBS) AC_MSG_CHECKING(whether SimGrid is enabled) AC_MSG_RESULT($enable_simgrid) AC_MSG_CHECKING(whether blocking drivers should be disabled) 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 ############################################################################### # # # 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) if test x$enable_debug = xyes; then AC_DEFINE(STARPU_DEBUG, [1], [enable debugging statements]) CFLAGS="$CFLAGS -O0" CXXFLAGS="$CXXFLAGS -O0" enable_spinlock_check=yes else CFLAGS="-O3 $CFLAGS" CXXFLAGS="-O3 $CXXFLAGS" fi CFLAGS+=" -gdwarf-2 -g3 " CXXFLAGS+=" -gdwarf-2 -g3 " if test x$enable_spinlock_check = xyes; then AC_DEFINE(STARPU_SPINLOCK_CHECK, [1], [check spinlock use]) fi AC_MSG_CHECKING(whether extra checks should be performed) AC_ARG_ENABLE(fast, [AS_HELP_STRING([--enable-fast], [do not enforce assertions])], enable_fast=$enableval, enable_fast=no) AC_MSG_RESULT($enable_fast) if test x$enable_fast = xyes; then AC_DEFINE(STARPU_NO_ASSERT, [1], [disable assertions]) 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=$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 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" LDFLAGS="${LDFLAGS} --coverage" fi # shall we use FxT to generate trace of the execution ? AC_MSG_CHECKING(whether FxT traces should be generated) AC_ARG_WITH(fxt, [AS_HELP_STRING([--with-fxt[=]], [generate fxt traces])], [ if test x$withval != xno; then use_fxt=yes if test x$withval = xyes; then AC_MSG_RESULT(yes) use_fxt_from_system=yes else # use specified path # TODO check if the dir is actually containing FxT use_fxt_from_system=no fxtdir=$withval AC_MSG_RESULT(yes using $fxtdir) AC_SUBST(FXTDIR, $fxtdir) fi else use_fxt=no AC_MSG_RESULT(no) fi ], [ use_fxt=no AC_MSG_RESULT(no) ]) AC_SUBST(STARPU_USE_FXT, $use_fxt) AM_CONDITIONAL(STARPU_USE_FXT, test x$use_fxt = xyes) if test x$use_fxt = xyes; then AC_DEFINE(STARPU_USE_FXT, [1], [enable FxT traces]) AC_DEFINE(CONFIG_FUT, [1], [enable FUT traces]) if test x$use_fxt_from_system = xno; then save_PKG_CONFIG_PATH="$PKG_CONFIG_PATH" PKG_CONFIG_PATH="$fxtdir/lib/pkgconfig:$PKG_CONFIG_PATH" PKG_CHECK_MODULES([FXT], [fxt], , [ AC_MSG_WARN([Old FxT without fxt.pc file, hoping link will succeed]) FXT_CFLAGS="-I$fxtdir/include/ " FXT_LDFLAGS="-L$fxtdir/lib/" AC_ARG_VAR(FXT_LDFLAGS) FXT_LIBS="-lfxt" ]) PKG_CONFIG_PATH="$save_PKG_CONFIG_PATH" else PKG_CHECK_MODULES([FXT], [fxt]) fi save_LIBS="$LIBS" LIBS="$LIBS $FXT_LIBS" save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $FXT_LDFLAGS" AC_CHECK_FUNCS([enable_fut_flush]) AC_CHECK_FUNCS([fut_set_filename]) LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $FXT_CFLAGS" AC_CHECK_DECLS([enable_fut_flush]) AC_CHECK_DECLS([fut_set_filename]) CFLAGS="$save_CFLAGS" ########################################## # Poti is a library to generate paje trace files ########################################## PKG_CHECK_MODULES([POTI], [poti], [ AC_DEFINE(STARPU_HAVE_POTI, [1], [Define to 1 if you have libpoti]) ], [:]) FXT_CFLAGS="$FXT_CFLAGS $POTI_CFLAGS" FXT_LIBS="$FXT_LIBS $POTI_LIBS" 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 -fprofile-arcs " LDFLAGS="${LDFLAGS} -pg -fprofile-arcs " fi AC_MSG_CHECKING(whether performance model debugging should be enabled) AC_ARG_ENABLE(model-debug, [AS_HELP_STRING([--enable-model-debug], [enable performance model debugging])], enable_model_debug=$enableval, enable_model_debug=no) AC_MSG_RESULT($enable_model_debug) if test x$enable_model_debug = xyes; then AC_DEFINE(STARPU_MODEL_DEBUG, [1], [enable performance model debug]) fi AC_MSG_CHECKING(whether statistics should be generated) AC_ARG_ENABLE(stats, [AS_HELP_STRING([--enable-stats], [enable statistics])], enable_stats=$enableval, enable_stats=no) AC_MSG_RESULT($enable_stats) AC_SUBST(STATS, $enable_stats) AC_SUBST(STARPU_ENABLE_STATS, $enable_stats) if test x$enable_stats = xyes; then AC_DEFINE(STARPU_ENABLE_STATS, [1], [enable statistics]) fi AC_MSG_CHECKING(whether memory stats should be displayed) AC_ARG_ENABLE(memory-stats, [AS_HELP_STRING([--enable-memory-stats], [enable memory stats])], enable_memory_stats=$enableval, enable_memory_stats=no) AC_MSG_RESULT($enable_memory_stats) if test x$enable_memory_stats = xyes; then AC_DEFINE(STARPU_MEMORY_STATS, [1], [enable memory stats]) fi AC_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]) AC_CHECK_HEADERS([Ayudame.h]) ############################################################################### # # # 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]) # TODO: add option to choose maxnodes if test x$enable_simgrid = xyes ; then # We still need the room for the virtual CUDA/OpenCL devices maxnodes=16 else # We have one memory node shared by all CPU workers, one node per GPU nodes=1 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 # 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 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 fi nmaxworkers=`expr 16 \* \( \( $maxcpus + $nmaxcudadev + $nmaxopencldev + 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 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]) ############################################################################### # # # MPI # # # ############################################################################### AC_ARG_WITH(mpicc, [AS_HELP_STRING([--with-mpicc[=]], [Path of the mpicc compiler])], [ if test x$withval = xyes; then AC_MSG_ERROR(--with-mpicc must be given a pathname) else mpicc_path=$withval fi ], [ # nothing was specified: default value is used AC_PATH_PROG(mpicc_path, mpicc, [no], []) ]) # We test if the MPICC compiler exists if test ! -x $mpicc_path; then #MPICC does not exists or is not executable AC_MSG_RESULT(The mpicc compiler is not valid) use_mpi=no else use_mpi=yes fi AC_MSG_CHECKING(mpicc path) AC_MSG_RESULT($mpicc_path) AC_SUBST(MPICC, $mpicc_path) if test x$use_mpi = xyes; then cc_or_mpicc=$mpicc_path # For some reason, libtool uses gcc instead of mpicc when linking # libstarpumpi. # On Darwin (and maybe other systems ?) the linker will fail (undefined # references to MPI_*). We manually add the required flags to fix this # issue. AC_SUBST(MPICC_LDFLAGS, `$mpicc_path --showme:link`) else cc_or_mpicc=$CC fi AC_SUBST(CC_OR_MPICC, $cc_or_mpicc) # If the user specifically asks for it, or if we are in a developer checkout, we enable mpi check AC_ARG_ENABLE(mpi-check, AC_HELP_STRING([--enable-mpi-check], [Enable execution of MPI testcases])) running_mpi_check=no if test $svndir = 1 -o -d "$srcdir/.git" ; then running_mpi_check=yes fi if test x$enable_mpi_check = xyes ; then running_mpi_check=yes fi if test x$enable_mpi_check = xno ; then running_mpi_check=no fi # Check if mpiexec is available AC_ARG_WITH(mpiexec, [AS_HELP_STRING([--with-mpiexec[=]], [Path of mpiexec])], [ if test x$withval = xyes; then AC_MSG_ERROR(--with-mpiexec must be given a pathname) else mpiexec_path=$withval fi ], [ # nothing was specified: look in the path AC_PATH_PROG(mpiexec_path, mpiexec, [no], [$(dirname $mpicc_path):$PATH]) ]) AC_MSG_CHECKING(whether mpiexec is available) AC_MSG_RESULT($mpiexec_path) # We test if MPIEXEC exists if test ! -x $mpiexec_path; then #MPIEXEC does not exists or is not executable AC_MSG_RESULT(The mpiexec script is not valid) running_mpi_check=no mpiexec_path="" fi AM_CONDITIONAL(STARPU_MPI_CHECK, test x$running_mpi_check = xyes) if test x$use_mpi = xyes; then AC_MSG_CHECKING(whether MPI tests should be run) AC_MSG_RESULT($running_mpi_check) AC_SUBST(MPIEXEC,$mpiexec_path) fi AC_MSG_CHECKING(whether the StarPU MPI library should be generated) AC_MSG_RESULT($use_mpi) AC_SUBST(USE_MPI, $use_mpi) AM_CONDITIONAL(USE_MPI, test x$use_mpi = xyes) if test x$use_mpi = xyes; then AC_DEFINE(STARPU_USE_MPI,[],[whether the StarPU MPI library is available]) else running_mpi_check=no fi AC_ARG_ENABLE(mpi-progression-hook, [AS_HELP_STRING([--enable-mpi-progression-hook], [Enable StarPU MPI activity polling method])], enable_mpi_progression_hook=$enableval, enable_mpi_progression_hook=no) if test x$enable_mpi_progression_hook = xyes; then AC_DEFINE(STARPU_MPI_ACTIVITY, [1], [enable StarPU MPI activity polling method]) fi ############################################################################### # # # StarPU-Top # # # ############################################################################### AC_ARG_ENABLE([starpu-top], [AS_HELP_STRING([--disable-starpu-top], [build StarPU-Top])], [enable_starpu_top="$enableval"], [enable_starpu_top="maybe"]) # Check whether StarPU-Top can be built AC_MSG_CHECKING(for StarPU-Top) if test "x$enable_starpu_top" != "xno" ; then can_build_starpu_top=no AC_PATH_PROGS([QMAKE], [qmake-qt4 qmake], [not-found]) if test x$QMAKE != xnot-found; then QMAKE_VERSION=`$QMAKE --version 2>&1 | head -n 1 | cut -d '.' -f 1 | cut -d ' ' -f 3` if test $QMAKE_VERSION -ge 2 ; then PKG_CHECK_EXISTS([QtGui QtNetwork QtOpenGL QtSql], [ QT_MAJVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 1` QT_MINVERSION=`$PKG_CONFIG --modversion QtGui | cut -d '.' -f 2` if test $QT_MAJVERSION -gt 4 -o \( $QT_MAJVERSION -eq 4 -a $QT_MINVERSION -ge 7 \) ; then can_build_starpu_top=yes fi QWT_PRI=embed AC_ARG_WITH(qwt-include-dir, [AS_HELP_STRING([--with-qwt-include-dir=], [specify installed libqwt include path])], [ STARPU_QWT_INCLUDE="$withval" AC_SUBST(STARPU_QWT_INCLUDE) QWT_PRI=system ]) AC_ARG_WITH(qwt-lib-dir, [AS_HELP_STRING([--with-qwt-lib-dir=], [specify installed libqwt library path])], [ STARPU_QWT_LDFLAGS="-L$withval" QWT_PRI=system ]) AC_ARG_WITH(qwt-lib, [AS_HELP_STRING([--with-qwt-lib=], [specify installed libqwt library name])], [ STARPU_QWT_LDFLAGS="${STARPU_QWT_LDFLAGS} -l$withval" QWT_PRI=system ]) AC_SUBST(STARPU_QWT_LDFLAGS) AC_SUBST(QWT_PRI) ]) fi fi fi if test "x$enable_starpu_top" != "xno" ; then build_starpu_top=$can_build_starpu_top else build_starpu_top=no fi AC_SUBST(STARPU_USE_TOP, $build_starpu_top) AM_CONDITIONAL(BUILD_STARPU_TOP, test "x$build_starpu_top" = "xyes") if test "x$build_starpu_top" = "xyes"; then AC_DEFINE(STARPU_USE_TOP, [1], [StarPU-Top is activated]) fi ############################################################################### # # # Flags for C Compiler # # # ############################################################################### # IS_SUPPORTED_CFLAG(flag) # ------------------------ # Check if the CFLAGS `flag' is supported by the compiler AC_DEFUN([IS_SUPPORTED_CFLAG], [ AC_REQUIRE([AC_PROG_CC]) AC_MSG_CHECKING([whether compiler support $1]) SAVED_CFLAGS="$CFLAGS" CFLAGS="$1" # -we10006" AC_COMPILE_IFELSE( AC_LANG_PROGRAM( [[]], [[ AC_LANG_SOURCE([ const char *hello = "Hello World"; ]) ]] ), [ GLOBAL_AM_CFLAGS="$GLOBAL_AM_CFLAGS $1" AC_MSG_RESULT(yes) ], AC_MSG_RESULT(no) ) CFLAGS="$SAVED_CFLAGS" ]) IS_SUPPORTED_CFLAG(-Wall) IS_SUPPORTED_CFLAG(-Werror=implicit) IS_SUPPORTED_CFLAG(-Werror=implicit-function-declaration) if test "x$STARPU_DEVEL" != x; then AC_DEFINE(STARPU_DEVEL, [1], [enable developer warnings]) IS_SUPPORTED_CFLAG(-Wextra) IS_SUPPORTED_CFLAG(-Wunused) IS_SUPPORTED_CFLAG(-Wundef) IS_SUPPORTED_CFLAG(-Wshadow) IS_SUPPORTED_CFLAG(-Werror=pointer-arith) fi AM_CONDITIONAL([STARPU_DEVEL],[test "x$STARPU_DEVEL" != x]) AC_SUBST(GLOBAL_AM_CFLAGS) # Same value as Automake's, for use in other places. pkglibdir="\${libdir}/$PACKAGE" AC_SUBST([pkglibdir]) ############################################################################### # # # GCC extensions # # # ############################################################################### AC_ARG_ENABLE([gcc-extensions], [AS_HELP_STRING([--enable-gcc-extensions], [build the GCC plug-in that provides C language extensions (experimental)])], [enable_gcc_plugin="$enableval"], [enable_gcc_plugin="maybe"]) if test "x$enable_gcc_plugin" = "xyes" -o "x$enable_gcc_plugin" = "xmaybe" ; then STARPU_GCC_PLUGIN_SUPPORT if test "x$ac_cv_have_gcc_plugins" = "xno" ; then if test "x$enable_gcc_plugin" = "xyes" ; then # Since this was explicitly asked for, error out. AC_MSG_ERROR([This compiler lacks GCC plug-in support.]) else AC_MSG_WARN([GCC plug-ins not supported; StarPU's GCC plug-in will not be built]) fi else # What GCC version are we using? STARPU_GCC_VERSION # The `.so' itself cannot be called `starpu-gcc.so' (because # `-fplugin-arg-' option names and such must match the `.so' # name), so use a meaningful directory name. gccplugindir="\${pkglibdir}/${STARPU_EFFECTIVE_VERSION}/gcc/${STARPU_GCC_VERSION_MAJOR}.${STARPU_GCC_VERSION_MINOR}" AC_SUBST([gccplugindir]) # Lines to be inserted in the `.pc' file. GCC_PLUGIN_DIR_PKGCONFIG="gccplugindir=$gccplugindir" GCC_PLUGIN_PKGCONFIG="gccplugin=\${gccplugindir}/starpu.so" AC_SUBST([GCC_PLUGIN_DIR_PKGCONFIG]) AC_SUBST([GCC_PLUGIN_PKGCONFIG]) fi fi AM_CONDITIONAL([HAVE_PTR_DEREFS_MAY_ALIAS_P], [test "x$ac_cv_have_decl_ptr_derefs_may_alias_p" = "xyes"]) if test "x$ac_cv_have_gcc_plugins" = "xyes" ; then build_gcc_plugin="yes" # GNU Guile 1.8/2.0 is used to run the test suite. AC_PATH_PROG([GUILE], [guile]) if test "x$GUILE" != "x"; then if test "x$enable_cpu" = "xyes"; then run_gcc_plugin_test_suite="yes" else AC_MSG_WARN([CPU back-end disabled; GCC plug-in test suite will not be run]) run_gcc_plugin_test_suite="no" fi else run_gcc_plugin_test_suite="no" fi else build_gcc_plugin="no" run_gcc_plugin_test_suite="no" fi # Bison is used to generate the C expression parser. The generated # parser is part of the distribution, though. AM_MISSING_PROG([YACC], [bison]) AM_CONDITIONAL([BUILD_GCC_PLUGIN], [test "x$build_gcc_plugin" = "xyes"]) AM_CONDITIONAL([RUN_GCC_PLUGIN_TESTS], [test "x$run_gcc_plugin_test_suite" = "xyes"]) ############################################################################### # # # SOCL interface # # # ############################################################################### AC_ARG_ENABLE([socl], [AS_HELP_STRING([--enable-socl], [build the OpenCL interface (experimental)])], [enable_socl="$enableval"], [enable_socl="maybe"]) AC_MSG_CHECKING(for SOCL) # in case SOCL was explicitely required, but is not available, this is an error if test "x$enable_socl" = "xyes" -a "$have_valid_opencl" = "no" ; then AC_MSG_ERROR([SOCL cannot be enabled without OpenCL]) fi # now we enable SOCL if and only if a proper setup is available if test "x$enable_socl" = "xyes" -o "x$enable_socl" = "xmaybe" ; then build_socl=$have_valid_opencl else build_socl=no fi AC_MSG_RESULT($build_socl) AM_CONDITIONAL([BUILD_SOCL], [test "x$build_socl" = "xyes"]) AM_CONDITIONAL([STARPU_USE_SOCL], [test "x$build_socl" = "xyes"]) if test "$build_socl" = "yes" ; then AC_CHECK_FUNCS([clGetExtensionFunctionAddressForPlatform]) if test -n "$SOCL_OCL_LIB_OPENCL" -a -f $SOCL_OCL_LIB_OPENCL ; then run_socl_check=yes SOCL_OCL_LIB_OPENCL_DIR=$(dirname $SOCL_OCL_LIB_OPENCL) AC_SUBST(SOCL_OCL_LIB_OPENCL_DIR) else run_socl_check=no fi else run_socl_check=no fi ############################################################################### # # # Debugging # # # ############################################################################### AC_PATH_PROG([GDB], [gdb], [not-found]) if test "x$GDB" != "xnot-found"; then AC_DEFINE_UNQUOTED([STARPU_GDB_PATH], ["$GDB"], [Path to the GNU debugger.]) fi ############################################################################### # # # Examples # # # ############################################################################### AC_ARG_ENABLE(build-examples, [AS_HELP_STRING([--disable-build-examples], [disable building of examples])], enable_build_examples=$enableval, enable_build_examples=yes) # check stuff for examples (todo) AM_CONDITIONAL(BUILD_EXAMPLES, [test x$enable_build_examples != xno]) AC_ARG_ENABLE(opengl-render, [AS_HELP_STRING([--enable-opengl-render], [enable OpenGL rendering of some examples])], enable_opengl_render=$enableval, enable_opengl_render=no) if test x$enable_opengl_render = xyes; then STARPU_CHECK_LIB(OPENGL_RENDER, glut, glutInit,,AC_MSG_ERROR([cannot find glut])) STARPU_CHECK_LIB(OPENGL_RENDER, GL, glXCreateContext,,AC_MSG_ERROR([cannot find GL])) STARPU_CHECK_LIB(OPENGL_RENDER, GLU, gluLookAt,,AC_MSG_ERROR([cannot find GLU])) AC_DEFINE(STARPU_OPENGL_RENDER, [1], [enable OpenGL rendering of some examples]) fi AC_MSG_CHECKING(whether OpenGL rendering is enabled) AC_SUBST(STARPU_OPENGL_RENDER, $enable_opengl_render) AC_MSG_RESULT($enable_opengl_render) AM_CONDITIONAL([HAVE_OPENGL], [test "x$enable_opengl_render" = xyes]) AC_PATH_XTRA if test "x$no_x" != "xyes"; then AC_DEFINE(STARPU_HAVE_X11, [1], [enable X11]) fi AM_CONDITIONAL([HAVE_X11], [test "x$no_x" != "xyes"]) # In case there are BLAS kernels that are used by the example applications # we may specify which library to use. Note that this is not used for StarPU # itself. blas_lib=maybe AC_ARG_ENABLE(blas-lib, [ --enable-blas-lib[=blaslibname]: none [default]: no BLAS lib is used atlas: use ATLAS library goto: use GotoBLAS library], [ if test "x$enableval" = "xatlas" ; then blas_lib=atlas elif test "x$enableval" = "xgoto" ; then blas_lib=goto elif test "x$enableval" = "xnone" ; then blas_lib=none elif test x$enableval = 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; then # Should we use MKL ? 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])], [ LDFLAGS="${LDFLAGS} $withval" blas_lib=mkl ]) if test x$blas_lib = xmkl; then AC_DEFINE(STARPU_MKL, [1], [use MKL library]) fi fi if test x$blas_lib = xmaybe; then #perhaps it is possible to use some BLAS lib from the system use_system_blas=no STARPU_SEARCH_LIBS(BLAS,[sgemm_],[blas],use_system_blas=yes,,) if test x$use_system_blas = xyes; then AC_DEFINE(STARPU_SYSTEM_BLAS, [1], [use refblas library]) blas_lib=system elif test x"$BLAS_LIBS" != x; then AC_DEFINE(STARPU_SYSTEM_BLAS, [1], [use user defined library]) STARPU_BLAS_LDFLAGS="$BLAS_LIBS" AC_SUBST(STARPU_BLAS_LDFLAGS) blas_lib=system AC_ARG_VAR([BLAS_LIBS], [linker flags for blas]) else blas_lib=none fi fi AM_CONDITIONAL(ATLAS_BLAS_LIB, test x$blas_lib = xatlas) AM_CONDITIONAL(GOTO_BLAS_LIB, test x$blas_lib = xgoto) AM_CONDITIONAL(MKL_BLAS_LIB, test x$blas_lib = xmkl) AM_CONDITIONAL(SYSTEM_BLAS_LIB, test x$blas_lib = xsystem) AM_CONDITIONAL(NO_BLAS_LIB, test x$blas_lib = xnone -a x$enable_simgrid = xno) AC_MSG_CHECKING(which BLAS lib should be used) AC_MSG_RESULT($blas_lib) AC_SUBST(BLAS_LIB,$blas_lib) ########################################## # FFT # ########################################## have_fftw=no have_fftwf=no have_fftwl=no fft_support=no AC_ARG_ENABLE(starpufft, [AS_HELP_STRING([--disable-starpufft], [Disable build of StarPU-FFT])], enable_starpufft=$enableval,enable_starpufft=yes) PKG_CHECK_MODULES([FFTW], [fftw3], [ AC_DEFINE([STARPU_HAVE_FFTW], [1], [Define to 1 if you have the libfftw3 library.]) AC_SUBST([STARPU_HAVE_FFTW], [1]) have_fftw=yes ], [:]) AM_CONDITIONAL(STARPU_HAVE_FFTW, [test x$have_fftw = xyes]) PKG_CHECK_MODULES([FFTWF], [fftw3f], [ AC_DEFINE([STARPU_HAVE_FFTWF], [1], [Define to 1 if you have the libfftw3f library.]) AC_SUBST([STARPU_HAVE_FFTWF], [1]) have_fftwf=yes ], [:]) AM_CONDITIONAL(STARPU_HAVE_FFTWF, [test x$have_fftwf = xyes]) PKG_CHECK_MODULES([FFTWL], [fftw3l], [ AC_DEFINE([STARPU_HAVE_FFTWL], [1], [Define to 1 if you have the libfftw3l library.]) AC_SUBST([HAVE_FFTWFL], [1]) have_fftwl=yes ], [:]) AM_CONDITIONAL(STARPU_HAVE_FFTWL, [test x$have_fftwl = xyes]) if test x$enable_starpufft = xyes -a \( \( x$enable_cpu = xyes -a x$have_fftw = xyes -a x$have_fftwf = xyes \) -o x$have_cufftdoublecomplex = xyes \); then fft_support=yes fi AM_CONDITIONAL(BUILD_STARPUFFT, [test x$fft_support = xyes]) AC_ARG_ENABLE(starpufft-examples, [AS_HELP_STRING([--enable-starpufft-examples], [disable execution of StarPU FFT examples])], enable_starpufft_examples=$enableval, enable_starpufft_examples=no) AM_CONDITIONAL(BUILD_STARPUFFT_EXAMPLES, [test x$enable_starpufft_examples = xyes]) ########################################## # hwloc # ########################################## 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_from_system=yes use_hwloc=yes else # use specified path use_hwloc_from_system=no if test ! -d "$withval" ; then AC_MSG_ERROR("Directory specified for hwloc <$withval> does not exist") fi hwloc_dir=$withval use_hwloc=yes fi else use_hwloc=no fi ], [ use_hwloc=maybe use_hwloc_from_system=yes ]) SAVED_LDFLAGS="${LDFLAGS}" SAVED_CPPFLAGS="${CPPFLAGS}" AS_IF([test "$use_hwloc" = "no"], [have_valid_hwloc=no], [AS_IF([test "$use_hwloc_from_system" = "yes"], [PKG_CHECK_MODULES([HWLOC],[hwloc], [ have_valid_hwloc=yes have_pkgconfig_hwloc=yes], [ have_valid_hwloc=no have_pkgconfig_hwloc=no]) ], #else [have_pkgconfig_hwloc=no CPPFLAGS="${SAVED_CPPFLAGS} -I$hwloc_dir/include" AC_CHECK_HEADER([hwloc.h],[have_valid_hwloc=yes],[have_valid_hwloc=no]) LDFLAGS="${SAVED_LDFLAGS} -L$hwloc_dir/lib" AC_HAVE_LIBRARY([hwloc],[have_valid_hwloc=yes],[have_valid_hwloc=no]) ]) ]) # in case hwloc was explicitely required, but is not available, this is an error AS_IF([test "$use_hwloc" = "yes" -a "$have_valid_hwloc" = "no"], [AC_MSG_ERROR([cannot find hwloc])] ) # in case hwloc is not available but was not explicitely disabled, this is an error AS_IF([test "$have_valid_hwloc" = "no" -a "$use_hwloc" != "no"], [AC_MSG_ERROR([hwloc 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 hwloc. However, if you really want to use StarPU without enabling hwloc, please restart configure by specifying the option '--without-hwloc'.])] ) 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]) AS_IF([test "$have_pkgconfig_hwloc" = "no"], [HWLOC_CFLAGS="-I$hwloc_dir/include" HWLOC_LIBS="-L$hwloc_dir/lib -lhwloc"] ) ]) LDFLAGS="${SAVED_LDFLAGS}" CPPFLAGS="${SAVED_CPPFLAGS}" AC_MSG_CHECKING(whether hwloc should be used) AC_MSG_RESULT($have_valid_hwloc) AC_SUBST(HWLOC_REQUIRES) # is the header file f77.h available ? AC_CHECK_HEADER([f77.h], [have_f77_h=yes], [have_f77_h=no]) AC_SUBST(STARPU_HAVE_F77_H, $have_f77_h) AM_CONDITIONAL(STARPU_HAVE_F77_H, test x$have_f77_h = xyes) if test x$have_f77_h = xyes; then AC_DEFINE([STARPU_HAVE_F77_H], [1], [Define to 1 if you have the header file.]) fi # Check if icc is available AC_CHECK_PROGS([ICC], [icc]) # If cuda and icc are both available, check they are compatible if test "$enable_cuda" = "yes" -a "$ICC" != ""; then AC_MSG_CHECKING(whether CUDA and ICC are compatible) OLD_CC="$CC" CC="$ICC" OLD_CFLAGS="$CFLAGS" CFLAGS="-I$PWD/include -I$srcdir/include" AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#include #include ]], [[]] )], AC_MSG_RESULT(yes), [ICC="" AC_MSG_RESULT(no)] ) CC="$OLD_CC" CFLAGS="$OLD_CFLAGS" fi # Fortran compiler if test "x$FC" != "x"; then AC_DEFINE(STARPU_HAVE_FC, [], [Define this if a Fortran compiler is available]) fi AM_CONDITIONAL([STARPU_HAVE_FC], [test "x$FC" != "x"]) # 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, [], [Define this if icc is available]) fi AM_CONDITIONAL([STARPU_HAVE_ICC], [test "x$ICC" != "x"]) # Do not generate manpages for the tools if we do not have help2man AC_CHECK_PROGS([HELP2MAN], [help2man]) # Disable on windows if test "$starpu_windows" = "yes" ; then HELP2MAN="" fi AM_CONDITIONAL([STARPU_HAVE_HELP2MAN], [test "x$HELP2MAN" != "x"]) AC_CHECK_MEMBER([struct cudaDeviceProp.pciDomainID], AC_DEFINE([STARPU_HAVE_DOMAINID],[1],[Define to 1 if CUDA device properties include DomainID]), , [[#include ]]) AC_CHECK_MEMBER([struct cudaDeviceProp.pciBusID], AC_DEFINE([STARPU_HAVE_BUSID],[1],[Define to 1 if CUDA device properties include BusID]), , [[#include ]]) dnl Set this condition when Automake 1.11 or later is being used. dnl Automake 1.11 introduced `silent-rules', hence the check. m4_ifdef([AM_SILENT_RULES], AM_CONDITIONAL([STARPU_HAVE_AM111], [true]), AM_CONDITIONAL([STARPU_HAVE_AM111], [false])) ########################################## # Documentation # ########################################## AC_ARG_ENABLE(build-doc, [AS_HELP_STRING([--disable-build-doc], [disable building of documentation])], enable_build_doc=$enableval, enable_build_doc=yes) if test "$enable_build_doc" = "yes" ; then # Check whether doxygen needed tools are installed AC_PATH_PROG(doxygencommand, doxygen) if test "$doxygencommand" = "" ; then enable_build_doc="no" else DOXYGEN_VERSION_MAJOR=`$doxygencommand --version| cut -d '.' -f1` DOXYGEN_VERSION_MINOR=`$doxygencommand --version| cut -d '.' -f2` if test $DOXYGEN_VERSION_MAJOR -ge 1 -a $DOXYGEN_VERSION_MINOR -ge 8 ; then enable_build_doc="yes" else enable_build_doc="no" fi fi AC_PATH_PROG(pdflatexcommand, pdflatex) if test "$pdflatexcommand" = "" ; then enable_build_doc="no" fi AC_PATH_PROG(epstopdfcommand, epstopdf) if test "$epstopdfcommand" = "" ; then enable_build_doc="no" fi fi AC_MSG_CHECKING(whether documentation should be compiled) AC_MSG_RESULT($enable_build_doc) AM_CONDITIONAL(BUILD_DOC, [test x$enable_build_doc != xno]) ############################################################################### # # # Final settings # # # ############################################################################### # these are the flags needed for static linking LIBSTARPU_LDFLAGS="$STARPU_GLPK_LDFLAGS" AC_SUBST([LIBSTARPU_LDFLAGS]) LIBSTARPU_LINK=libstarpu-$STARPU_EFFECTIVE_VERSION.la if test x$enable_perf_debug = xyes; then LIBSTARPU_LINK=".libs/libstarpu-$STARPU_EFFECTIVE_VERSION.a $LIBSTARPU_LDFLAGS $HWLOC_LIBS $SIMGRID_LIBS $STARPU_CUDA_LDFLAGS $STARPU_OPENCL_LDFLAGS" fi AC_SUBST([LIBSTARPU_LINK]) # File configuration AC_CONFIG_COMMANDS([executable-scripts], [ chmod +x tests/regression/regression.sh chmod +x gcc-plugin/tests/run-test chmod +x tools/starpu_codelet_profile chmod +x tools/starpu_codelet_histo_profile chmod +x tools/starpu_workers_activity chmod +x tools/starpu_paje_draw_histogram chmod +x tools/starpu_paje_state_stats chmod +x tools/starpu_paje_summary chmod +x tools/starpu_paje_sort chmod +x doc/doxygen/doxygen_filter.sh ]) # Create links to ICD files in build/socl/vendors directory. SOCL will use this # directory as the OCL_ICD_VENDORS directory SOCL_VENDORS="vendors/install/socl.icd" for icd in /etc/OpenCL/vendors/*.icd ; do if test -f $icd ; then if test "$(basename $icd)" != "socl.icd" ; then new_icd=$(basename $icd) AC_CONFIG_LINKS([socl/vendors/$new_icd:$icd]) SOCL_VENDORS="$SOCL_VENDORS vendors/$new_icd" fi fi done AC_SUBST(SOCL_VENDORS) AC_CONFIG_FILES(tests/regression/regression.sh tests/regression/profiles tests/regression/profiles.build.only) AC_CONFIG_HEADER(src/common/config.h include/starpu_config.h gcc-plugin/include/starpu-gcc/config.h starpu-top/config.h) AH_BOTTOM([ #if defined(STARPU_DEVEL) && defined(BUILDING_STARPU) # ifndef STARPU_CHECKED_UNISTD_H # define STARPU_CHECKED_UNISTD_H # ifdef _UNISTD_H # define _UNISTD_H PLEASE_DONT_INCLUDE_IT # error Please do not unconditionally include unistd.h, it is not available on Windows, include config.h and test for HAVE_UNISTD_H # endif # endif #endif ]) SANITIZE=$(echo $CFLAGS | grep sanitize) AM_CONDITIONAL(STARPU_SANITIZE, test -n "$SANITIZE") AC_OUTPUT([ Makefile src/Makefile tools/Makefile tools/starpu_codelet_profile tools/starpu_codelet_histo_profile tools/starpu_workers_activity tools/starpu_paje_draw_histogram tools/starpu_paje_state_stats tools/starpu_paje_summary tools/starpu_paje_sort 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 mpi/libstarpumpi.pc mpi/starpumpi-1.0.pc mpi/starpumpi-1.1.pc starpufft/Makefile starpufft/src/Makefile starpufft/tests/Makefile starpufft/libstarpufft.pc starpufft/starpufft-1.0.pc starpufft/starpufft-1.1.pc examples/Makefile examples/stencil/Makefile tests/Makefile mpi/Makefile mpi/src/Makefile mpi/tests/Makefile mpi/examples/Makefile starpu-top/StarPU-Top.pro starpu-top/StarPU-Top-qwt-embed.pri starpu-top/StarPU-Top-qwt-system.pri gcc-plugin/Makefile gcc-plugin/src/Makefile gcc-plugin/tests/Makefile gcc-plugin/tests/run-test gcc-plugin/examples/Makefile sc_hypervisor/Makefile sc_hypervisor/src/Makefile sc_hypervisor/examples/Makefile doc/Makefile doc/doxygen/Makefile doc/doxygen/doxygen-config.cfg doc/doxygen/doxygen_filter.sh tools/mvsc/starpu_var.bat ]) AC_MSG_NOTICE([ CPUs enabled: $enable_cpu CUDA enabled: $enable_cuda OpenCL enabled: $enable_opencl Compile-time limits (change these with --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev, --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 memory nodes: $maxnodes Maximum number of task buffers: $nmaxbuffers GPU-GPU transfers: $have_cuda_memcpy_peer Allocation cache: $enable_allocation_cache Magma enabled: $have_magma BLAS library: $blas_lib hwloc: $have_valid_hwloc FxT trace enabled: $use_fxt StarPU-Top: $build_starpu_top Documentation: $enable_build_doc Examples: $enable_build_examples StarPU Extensions: MPI enabled: $use_mpi MPI test suite: $running_mpi_check FFT Support: $fft_support GCC plug-in: $build_gcc_plugin GCC plug-in test suite (requires GNU Guile): $run_gcc_plugin_test_suite SOCL enabled: $build_socl SOCL test suite: $run_socl_check Scheduler Hypervisor: $build_sc_hypervisor simgrid enabled: $enable_simgrid ayudame enabled: $ac_cv_header_Ayudame_h ]) if test "$build_socl" = "yes" -a "$run_socl_check" = "no" ; then AC_MSG_NOTICE([ WARNING: SOCL test suite will not be run as the environment variable SOCL_OCL_LIB_OPENCL is not defined. To run the tests, you need to install the OCL implementation of ICD (https://forge.imag.fr/projects/ocl-icd/ or Debian package ocl-icd-libopencl1) and set the variable SOCL_OCL_LIB_OPENCL to the location of the libOpenCL.so.]) fi if test x"$have_valid_hwloc" = xno -a "$enable_simgrid" = "no" then AC_MSG_NOTICE([ WARNING: hwloc was not enabled. If the target machine is hyperthreaded the performance may be impacted a lot. It is strongly recommended to install hwloc]) fi starpu-1.1.5/doc/0002755000373600000000000000000012571541162010601 500000000000000starpu-1.1.5/doc/Makefile.in0000644000373600000000000006270512571536631012603 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2013 Centre National de la Recherche Scientifique # # 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. # # See the GNU Free Documentation License in COPYING.GFDL for more details. VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(txtdir)" DATA = $(txt_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = doxygen DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_DOC_TRUE@SUBDIRS = doxygen EXTRA_DIST = tutorial/hello_world.c \ tutorial/hello_world_plugin.c \ tutorial/hello_world_mvsc.c \ tutorial/Makefile \ tutorial/README \ tutorial/vector_scal.c \ tutorial/vector_scal_cpu.c \ tutorial/vector_scal_cuda.cu \ tutorial/vector_scal_opencl.c \ tutorial/vector_scal_opencl_kernel.cl \ tutorial/vector_scal_plugin.c \ tutorial/vector_scal_plugin_cuda.cu txtdir = ${docdir}/tutorial txt_DATA = $(EXTRA_DIST) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-txtDATA: $(txt_DATA) @$(NORMAL_INSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(txtdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(txtdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(txtdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(txtdir)" || exit $$?; \ done uninstall-txtDATA: @$(NORMAL_UNINSTALL) @list='$(txt_DATA)'; test -n "$(txtdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(txtdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(txtdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-txtDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-txtDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-txtDATA installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-txtDATA showcheck: RET=0 ; \ for i in $(SUBDIRS) ; do \ make -C $$i showcheck || RET=1 ; \ done ; \ exit $$RET # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.1.5/doc/doxygen/0002755000373600000000000000000012571541163012257 500000000000000starpu-1.1.5/doc/doxygen/Makefile.in0000644000373600000000000007077012571536631014261 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # StarPU --- Runtime system for heterogeneous multicore architectures. # # Copyright (C) 2009, 2011, 2013-2014 Université de Bordeaux # Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Centre National de la Recherche Scientifique # # 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. # # See the GNU Free Documentation License in COPYING.GFDL for more details. VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' 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/doxygen DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/doxygen-config.cfg.in $(srcdir)/doxygen_filter.sh.in \ $(dist_pdf_DATA) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acinclude.m4 \ $(top_srcdir)/m4/gcc.m4 $(top_srcdir)/m4/libs.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/common/config.h \ $(top_builddir)/include/starpu_config.h \ $(top_builddir)/gcc-plugin/include/starpu-gcc/config.h \ $(top_builddir)/starpu-top/config.h CONFIG_CLEAN_FILES = doxygen-config.cfg doxygen_filter.sh CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pdfdir)" DATA = $(dist_pdf_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) pkglibdir = @pkglibdir@ ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ ATLASDIR = @ATLASDIR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BLAS_LIB = @BLAS_LIB@ BLAS_LIBS = @BLAS_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_OR_MPICC = @CC_OR_MPICC@ CFLAGS = @CFLAGS@ COVERAGE = @COVERAGE@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FFLAGS = @FFLAGS@ FFTWF_CFLAGS = @FFTWF_CFLAGS@ FFTWF_LIBS = @FFTWF_LIBS@ FFTWL_CFLAGS = @FFTWL_CFLAGS@ FFTWL_LIBS = @FFTWL_LIBS@ FFTW_CFLAGS = @FFTW_CFLAGS@ FFTW_LIBS = @FFTW_LIBS@ FGREP = @FGREP@ FXTDIR = @FXTDIR@ FXT_CFLAGS = @FXT_CFLAGS@ FXT_LDFLAGS = @FXT_LDFLAGS@ FXT_LIBS = @FXT_LIBS@ GCC_FOR_PLUGIN = @GCC_FOR_PLUGIN@ GCC_FOR_PLUGIN_LIBTOOL_TAG = @GCC_FOR_PLUGIN_LIBTOOL_TAG@ GCC_PLUGIN_DIR_PKGCONFIG = @GCC_PLUGIN_DIR_PKGCONFIG@ GCC_PLUGIN_INCLUDE_DIR = @GCC_PLUGIN_INCLUDE_DIR@ GCC_PLUGIN_PKGCONFIG = @GCC_PLUGIN_PKGCONFIG@ GDB = @GDB@ GLOBAL_AM_CFLAGS = @GLOBAL_AM_CFLAGS@ GOTODIR = @GOTODIR@ GREP = @GREP@ GUILE = @GUILE@ HAVE_FFTWFL = @HAVE_FFTWFL@ HELP2MAN = @HELP2MAN@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ ICC = @ICC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSOCL_INTERFACE_AGE = @LIBSOCL_INTERFACE_AGE@ LIBSOCL_INTERFACE_CURRENT = @LIBSOCL_INTERFACE_CURRENT@ LIBSOCL_INTERFACE_REVISION = @LIBSOCL_INTERFACE_REVISION@ LIBSTARPUFFT_INTERFACE_AGE = @LIBSTARPUFFT_INTERFACE_AGE@ LIBSTARPUFFT_INTERFACE_CURRENT = @LIBSTARPUFFT_INTERFACE_CURRENT@ LIBSTARPUFFT_INTERFACE_REVISION = @LIBSTARPUFFT_INTERFACE_REVISION@ LIBSTARPUMPI_INTERFACE_AGE = @LIBSTARPUMPI_INTERFACE_AGE@ LIBSTARPUMPI_INTERFACE_CURRENT = @LIBSTARPUMPI_INTERFACE_CURRENT@ LIBSTARPUMPI_INTERFACE_REVISION = @LIBSTARPUMPI_INTERFACE_REVISION@ LIBSTARPU_INTERFACE_AGE = @LIBSTARPU_INTERFACE_AGE@ LIBSTARPU_INTERFACE_CURRENT = @LIBSTARPU_INTERFACE_CURRENT@ LIBSTARPU_INTERFACE_REVISION = @LIBSTARPU_INTERFACE_REVISION@ LIBSTARPU_LDFLAGS = @LIBSTARPU_LDFLAGS@ LIBSTARPU_LINK = @LIBSTARPU_LINK@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAGMA_CFLAGS = @MAGMA_CFLAGS@ MAGMA_LIBS = @MAGMA_LIBS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPICC = @MPICC@ MPICC_LDFLAGS = @MPICC_LDFLAGS@ MPIEXEC = @MPIEXEC@ NM = @NM@ NMEDIT = @NMEDIT@ NVCC = @NVCC@ NVCCFLAGS = @NVCCFLAGS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ 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@ QMAKE = @QMAKE@ QWT_PRI = @QWT_PRI@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIMGRID_CFLAGS = @SIMGRID_CFLAGS@ SIMGRID_LIBS = @SIMGRID_LIBS@ SOCL_OCL_LIB_OPENCL_DIR = @SOCL_OCL_LIB_OPENCL_DIR@ SOCL_VENDORS = @SOCL_VENDORS@ STARPU_BLAS_LDFLAGS = @STARPU_BLAS_LDFLAGS@ STARPU_BUILD_DIR = @STARPU_BUILD_DIR@ STARPU_CUDA_CPPFLAGS = @STARPU_CUDA_CPPFLAGS@ STARPU_CUDA_FORTRAN_LDFLAGS = @STARPU_CUDA_FORTRAN_LDFLAGS@ STARPU_CUDA_LDFLAGS = @STARPU_CUDA_LDFLAGS@ STARPU_CUFFT_LDFLAGS = @STARPU_CUFFT_LDFLAGS@ STARPU_CURAND_LDFLAGS = @STARPU_CURAND_LDFLAGS@ STARPU_EFFECTIVE_VERSION = @STARPU_EFFECTIVE_VERSION@ STARPU_ENABLE_STATS = @STARPU_ENABLE_STATS@ STARPU_GCC_VERSION_MAJOR = @STARPU_GCC_VERSION_MAJOR@ STARPU_GCC_VERSION_MINOR = @STARPU_GCC_VERSION_MINOR@ STARPU_GLPK_LDFLAGS = @STARPU_GLPK_LDFLAGS@ STARPU_HAVE_F77_H = @STARPU_HAVE_F77_H@ STARPU_HAVE_FFTW = @STARPU_HAVE_FFTW@ STARPU_HAVE_FFTWF = @STARPU_HAVE_FFTWF@ STARPU_HAVE_HWLOC = @STARPU_HAVE_HWLOC@ STARPU_HAVE_MAGMA = @STARPU_HAVE_MAGMA@ STARPU_LIBNUMA_LDFLAGS = @STARPU_LIBNUMA_LDFLAGS@ STARPU_MAJOR_VERSION = @STARPU_MAJOR_VERSION@ STARPU_MINOR_VERSION = @STARPU_MINOR_VERSION@ STARPU_MS_LIB = @STARPU_MS_LIB@ STARPU_MS_LIB_ARCH = @STARPU_MS_LIB_ARCH@ STARPU_OPENCL_CPPFLAGS = @STARPU_OPENCL_CPPFLAGS@ STARPU_OPENCL_DATAdir = @STARPU_OPENCL_DATAdir@ STARPU_OPENCL_LDFLAGS = @STARPU_OPENCL_LDFLAGS@ STARPU_OPENGL_RENDER = @STARPU_OPENGL_RENDER@ STARPU_OPENGL_RENDER_LDFLAGS = @STARPU_OPENGL_RENDER_LDFLAGS@ STARPU_PERF_DEBUG = @STARPU_PERF_DEBUG@ STARPU_QWT_INCLUDE = @STARPU_QWT_INCLUDE@ STARPU_QWT_LDFLAGS = @STARPU_QWT_LDFLAGS@ STARPU_RELEASE_VERSION = @STARPU_RELEASE_VERSION@ STARPU_SC_HYPERVISOR = @STARPU_SC_HYPERVISOR@ STARPU_SRC_DIR = @STARPU_SRC_DIR@ STARPU_USE_CPU = @STARPU_USE_CPU@ STARPU_USE_CUDA = @STARPU_USE_CUDA@ STARPU_USE_FXT = @STARPU_USE_FXT@ STARPU_USE_OPENCL = @STARPU_USE_OPENCL@ STARPU_USE_TOP = @STARPU_USE_TOP@ STATS = @STATS@ STRIP = @STRIP@ USE_MPI = @USE_MPI@ VERSION = @VERSION@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ YACC = @YACC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_FC = @ac_ct_FC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ doxygencommand = @doxygencommand@ dvidir = @dvidir@ epstopdfcommand = @epstopdfcommand@ exec_prefix = @exec_prefix@ gccplugindir = @gccplugindir@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ mpicc_path = @mpicc_path@ mpiexec_path = @mpiexec_path@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ pdflatexcommand = @pdflatexcommand@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ svncommand = @svncommand@ svnversioncommand = @svnversioncommand@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ DOXYGEN = doxygen PDFLATEX = pdflatex MAKEINDEX = makeindex DOX_DIR = $(top_builddir)/doc/doxygen DOX_CONFIG = $(top_srcdir)/doc/doxygen/doxygen.cfg DOX_HTML_DIR = html DOX_LATEX_DIR = latex DOX_PDF = starpu.pdf DOX_TAG = starpu.tag chapters = \ chapters/00introduction.doxy \ chapters/01building.doxy \ chapters/02basic_examples.doxy \ chapters/03advanced_examples.doxy \ chapters/04optimize_performance.doxy \ chapters/05performance_feedback.doxy \ chapters/06tips_and_tricks.doxy \ chapters/08mpi_support.doxy \ chapters/09fft_support.doxy \ chapters/11c_extensions.doxy \ chapters/12socl_opencl_extensions.doxy \ chapters/13scheduling_contexts.doxy \ chapters/14scheduling_context_hypervisor.doxy \ chapters/15environment_variables.doxy \ chapters/16configure_options.doxy \ chapters/17files.doxy \ chapters/18scaling-vector-example.doxy \ chapters/19fdl-1.3.doxy \ chapters/code/hello_pragma2.c \ chapters/code/hello_pragma.c \ chapters/code/scal_pragma.cu \ chapters/code/matmul_pragma.c \ chapters/code/matmul_pragma2.c \ chapters/code/cholesky_pragma.c \ chapters/code/forkmode.c \ chapters/code/multiformat.c \ chapters/code/complex.c \ chapters/code/simgrid.c \ chapters/code/vector_scal_c.c \ chapters/code/vector_scal_cpu.c \ chapters/code/vector_scal_cuda.cu \ chapters/code/vector_scal_opencl.c \ chapters/code/vector_scal_opencl_codelet.cl \ chapters/api/codelet_and_tasks.doxy \ chapters/api/cuda_extensions.doxy \ chapters/api/data_interfaces.doxy \ chapters/api/data_management.doxy \ chapters/api/data_partition.doxy \ chapters/api/expert_mode.doxy \ chapters/api/explicit_dependencies.doxy \ chapters/api/fft_support.doxy \ chapters/api/fxt_support.doxy \ chapters/api/implicit_dependencies.doxy \ chapters/api/initialization.doxy \ chapters/api/insert_task.doxy \ chapters/api/lower_bound.doxy \ chapters/api/misc_helpers.doxy \ chapters/api/mpi.doxy \ chapters/api/multiformat_data_interface.doxy \ chapters/api/opencl_extensions.doxy \ chapters/api/parallel_tasks.doxy \ chapters/api/performance_model.doxy \ chapters/api/profiling.doxy \ chapters/api/running_driver.doxy \ chapters/api/scheduling_contexts.doxy \ chapters/api/scheduling_policy.doxy \ chapters/api/standard_memory_library.doxy \ chapters/api/task_bundles.doxy \ chapters/api/task_lists.doxy \ chapters/api/top.doxy \ chapters/api/versioning.doxy \ chapters/api/workers.doxy \ chapters/api/threads.doxy \ chapters/api/toolbox.doxy \ chapters/api/sc_hypervisor/sc_hypervisor.doxy \ chapters/api/sc_hypervisor/sc_hypervisor_usage.doxy EXTRA_DIST = \ $(chapters) \ chapters/version.sty \ chapters/version.html \ chapters/tasks_size_overhead.png \ chapters/tasks_size_overhead.eps \ chapters/tasks_size_overhead.pdf \ chapters/distrib_data.png \ chapters/distrib_data.eps \ chapters/distrib_data.pdf \ chapters/distrib_data_histo.png \ chapters/distrib_data_histo.eps \ chapters/distrib_data_histo.pdf \ chapters/paje_draw_histogram.eps \ chapters/paje_draw_histogram.png \ chapters/paje_draw_histogram.pdf \ chapters/starpu_chol_model_11_type.png \ chapters/starpu_chol_model_11_type.eps \ chapters/starpu_chol_model_11_type.pdf \ chapters/starpu_non_linear_memset_regression_based.png \ chapters/starpu_non_linear_memset_regression_based.eps \ chapters/starpu_non_linear_memset_regression_based.pdf \ chapters/starpu_non_linear_memset_regression_based_2.png \ chapters/starpu_non_linear_memset_regression_based_2.eps \ chapters/starpu_non_linear_memset_regression_based_2.pdf \ chapters/starpu_starpu_slu_lu_model_11.png \ chapters/starpu_starpu_slu_lu_model_11.eps \ chapters/starpu_starpu_slu_lu_model_11.pdf \ chapters/temanejo.png \ doxygen.cfg \ refman.tex \ $(DOX_HTML_DIR) dox_inputs = $(DOX_CONFIG) \ $(chapters) \ starpu_config.h \ chapters/version.sty \ chapters/version.html \ $(top_srcdir)/include/starpu.h \ $(top_srcdir)/include/starpu_data_filters.h \ $(top_srcdir)/include/starpu_data_interfaces.h \ $(top_srcdir)/include/starpu_worker.h \ $(top_srcdir)/include/starpu_task.h \ $(top_srcdir)/include/starpu_task_bundle.h \ $(top_srcdir)/include/starpu_task_list.h \ $(top_srcdir)/include/starpu_task_util.h \ $(top_srcdir)/include/starpu_data.h \ $(top_srcdir)/include/starpu_perfmodel.h \ $(top_srcdir)/include/starpu_util.h \ $(top_srcdir)/include/starpu_fxt.h \ $(top_srcdir)/include/starpu_cuda.h \ $(top_srcdir)/include/starpu_opencl.h \ $(top_srcdir)/include/starpu_expert.h \ $(top_srcdir)/include/starpu_profiling.h \ $(top_srcdir)/include/starpu_bound.h \ $(top_srcdir)/include/starpu_scheduler.h \ $(top_srcdir)/include/starpu_sched_ctx.h \ $(top_srcdir)/include/starpu_sched_ctx_hypervisor.h \ $(top_srcdir)/include/starpu_top.h \ $(top_srcdir)/include/starpu_hash.h \ $(top_srcdir)/include/starpu_rand.h \ $(top_srcdir)/include/starpu_cublas.h \ $(top_srcdir)/include/starpu_driver.h \ $(top_srcdir)/include/starpu_stdlib.h \ $(top_srcdir)/include/starpu_thread.h \ $(top_srcdir)/include/starpu_thread_util.h \ $(top_srcdir)/mpi/include/starpu_mpi.h \ $(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 dist_pdf_DATA = $(DOX_PDF) CLEANFILES = $(DOX_TAG) starpu_config.h \ -r \ $(DOX_HTML_DIR) \ $(DOX_LATEX_DIR) \ $(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 .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): doxygen-config.cfg: $(top_builddir)/config.status $(srcdir)/doxygen-config.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ doxygen_filter.sh: $(top_builddir)/config.status $(srcdir)/doxygen_filter.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_pdfDATA: $(dist_pdf_DATA) @$(NORMAL_INSTALL) @list='$(dist_pdf_DATA)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || 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)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; \ done uninstall-dist_pdfDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pdf_DATA)'; test -n "$(pdfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pdfdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pdfdir)"; 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." 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-dist_pdfDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-dist_pdfDATA .MAKE: install-am install-strip .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-dist_pdfDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am uninstall-dist_pdfDATA 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 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 date --date=@`cat timestamp_sty` +"%d %B %Y" > timestamp_sty_updated ;\ LC_ALL=C 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 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 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 date --date=@`cat timestamp_html` +"%d %B %Y" > timestamp_html_updated ;\ LC_ALL=C 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_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 @$(SED) -i '/\\begin{titlepage}/,$$d' $(DOX_LATEX_DIR)/refman.tex @cat $(top_srcdir)/doc/doxygen/refman.tex >> $(DOX_LATEX_DIR)/refman.tex $(DOX_PDF): $(DOX_TAG) refman.tex cp $(top_srcdir)/doc/doxygen/chapters/version.sty $(DOX_LATEX_DIR) cp $(top_srcdir)/doc/doxygen/chapters/*pdf $(DOX_LATEX_DIR) cd $(DOX_LATEX_DIR); \ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \ sed -i -e 's/__env__/\\_Environment Variables!/' -e 's/\\-\\_\\-\\-\\_\\-env\\-\\_\\-\\-\\_\\-//' ExecutionConfigurationThroughEnvironmentVariables.tex ;\ sed -i -e 's/__configure__/\\_Configure Options!/' -e 's/\\-\\_\\-\\-\\_\\-configure\\-\\_\\-\\-\\_\\-//' CompilationConfiguration.tex ;\ sed -i s'/\\item Module\\-Documentation/\\item \\hyperlink{ModuleDocumentation}{Module Documentation}/' index.tex ;\ sed -i s'/\\item File\\-Documentation/\\item \\hyperlink{FileDocumentation}{File Documentation}/' index.tex ;\ $(PDFLATEX) refman.tex; \ $(MAKEINDEX) refman.idx;\ $(PDFLATEX) 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 \ $(PDFLATEX) refman.tex; \ repeat=`expr $$repeat - 1`; \ else \ done=1; \ fi; \ done; \ mv refman.pdf ../$(DOX_PDF) # Rule to update documentation on web server. Should only be used locally. PUBLISHHOST ?= gforge update-web: $(DOX_PDF) scp -pr starpu.pdf html $(PUBLISHHOST):/home/groups/starpu/htdocs/doc showcheck: -cat /dev/null # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: starpu-1.1.5/doc/doxygen/html/0000755000373600000000000000000012571536763013233 500000000000000starpu-1.1.5/doc/doxygen/html/group__API__Scheduling__Policy.html0000644000373600000000000012655312571536763022023 00000000000000 StarPU Handbook: Scheduling Policy
Scheduling Policy

TODO. While StarPU comes with a variety of scheduling policies (see Task Scheduling Policy), 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. More...

Data Structures

struct  starpu_sched_policy

Functions

struct starpu_sched_policy ** starpu_sched_get_predefined_policies ()
void starpu_worker_get_sched_condition (int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond)
int starpu_sched_set_min_priority (int min_prio)
int starpu_sched_set_max_priority (int max_prio)
int starpu_sched_get_min_priority (void)
int starpu_sched_get_max_priority (void)
int starpu_push_local_task (int workerid, struct starpu_task *task, int back)
int starpu_push_task_end (struct starpu_task *task)
int starpu_worker_can_execute_task (unsigned workerid, struct starpu_task *task, unsigned nimpl)
double starpu_timing_now (void)
uint32_t starpu_task_footprint (struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_expected_length (struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_worker_get_relative_speedup (enum starpu_perfmodel_archtype perf_archtype)
double starpu_task_expected_data_transfer_time (unsigned memory_node, struct starpu_task *task)
double starpu_data_expected_transfer_time (starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode)
double starpu_task_expected_power (struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_expected_conversion_time (struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
int starpu_get_prefetch_flag (void)
int starpu_prefetch_task_input_on_node (struct starpu_task *task, unsigned node)
void starpu_sched_ctx_worker_shares_tasks_lists (int workerid, int sched_ctx_id)

Detailed Description

TODO. While StarPU comes with a variety of scheduling policies (see Task Scheduling Policy), 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.


Data Structure Documentation

struct starpu_sched_policy

This structure contains all the methods that implement a scheduling policy. An application may specify which scheduling strategy in the field starpu_conf::sched_policy passed to the function starpu_init().

Data Fields

void(* init_sched )(unsigned sched_ctx_id)
void(* deinit_sched )(unsigned sched_ctx_id)
int(* push_task )(struct starpu_task *)
void(* push_task_notify )(struct starpu_task *, int workerid, int perf_workerid, unsigned sched_ctx_id)
struct starpu_task *(* pop_task )(unsigned sched_ctx_id)
struct starpu_task *(* pop_every_task )(unsigned sched_ctx_id)
void(* pre_exec_hook )(struct starpu_task *)
void(* post_exec_hook )(struct starpu_task *)
void(* add_workers )(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
void(* remove_workers )(unsigned sched_ctx_id, int *workerids, unsigned nworkers)
const char * policy_name
const char * policy_description

Field Documentation

starpu_sched_policy::init_sched

Initialize the scheduling policy.

starpu_sched_policy::deinit_sched

Cleanup the scheduling policy.

starpu_sched_policy::push_task

Insert a task into the scheduler.

starpu_sched_policy::push_task_notify

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.

starpu_sched_policy::pop_task
read

Get a task from the scheduler. The mutex associated to the worker is already taken when this method is called. 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.

starpu_sched_policy::pop_every_task
read

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.

starpu_sched_policy::pre_exec_hook

Optional field. This method is called every time a task is starting.

starpu_sched_policy::post_exec_hook

Optional field. This method is called every time a task has been executed.

starpu_sched_policy::add_workers

Initialize scheduling structures corresponding to each worker used by the policy.

starpu_sched_policy::remove_workers

Deinitialize scheduling structures corresponding to each worker used by the policy.

starpu_sched_policy::policy_name

Optional field. Name of the policy.

starpu_sched_policy::policy_description

Optional field. Human readable description of the policy.

Function Documentation

struct starpu_sched_policy ** starpu_sched_get_predefined_policies ( )
read

Return an NULL-terminated array of all the predefined scheduling policies.

void starpu_worker_get_sched_condition ( int  workerid,
starpu_pthread_mutex_t **  sched_mutex,
starpu_pthread_cond_t **  sched_cond 
)

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.

int starpu_sched_set_min_priority ( int  min_prio)

TODO: check if this is correct Defines the minimum task priority level supported by the scheduling policy. The default minimum priority level is the same as the default priority level which is 0 by convention. The application may access that value by calling the function starpu_sched_get_min_priority(). This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application.

int starpu_sched_set_max_priority ( int  max_prio)

TODO: check if this is correct Defines the maximum priority level supported by the scheduling policy. The default maximum priority level is 1. The application may access that value by calling the function starpu_sched_get_max_priority(). This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application.

int starpu_sched_get_min_priority ( void  )

TODO: check if this is correct Returns the current minimum priority level supported by the scheduling policy

int starpu_sched_get_max_priority ( void  )

TODO: check if this is correct Returns the current maximum priority level supported by the scheduling policy

int starpu_push_local_task ( int  workerid,
struct starpu_task task,
int  back 
)

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 is not 0, 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_task_end ( struct starpu_task task)

This function must be called by a scheduler to notify that the given task has just been pushed.

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. Schedulers need to call it before assigning a task to a worker, otherwise the task may fail to execute.

double starpu_timing_now ( void  )

Return the current date in micro-seconds.

uint32_t starpu_task_footprint ( struct starpu_perfmodel model,
struct starpu_task task,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl 
)

Returns the footprint for a given task

double starpu_task_expected_length ( struct starpu_task task,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl 
)

Returns expected task duration in micro-seconds.

double starpu_worker_get_relative_speedup ( enum starpu_perfmodel_archtype  perf_archtype)

Returns an estimated speedup factor relative to CPU speed

double starpu_task_expected_data_transfer_time ( unsigned  memory_node,
struct starpu_task task 
)

Returns expected data transfer time in micro-seconds.

double starpu_data_expected_transfer_time ( starpu_data_handle_t  handle,
unsigned  memory_node,
enum starpu_data_access_mode  mode 
)

Predict the transfer time (in micro-seconds) to move handle to a memory node

double starpu_task_expected_power ( struct starpu_task task,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl 
)

Returns expected power consumption in J

double starpu_task_expected_conversion_time ( struct starpu_task task,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl 
)

Returns expected conversion time in ms (multiformat interface only)

int starpu_get_prefetch_flag ( void  )

Whether STARPU_PREFETCH was set

int starpu_prefetch_task_input_on_node ( struct starpu_task task,
unsigned  node 
)

Prefetch data for a given task on a given node

void starpu_sched_ctx_worker_shares_tasks_lists ( int  workerid,
int  sched_ctx_id 
)

The scheduling policies indicates if the worker may pop tasks from the list of other workers or if there is a central list with task for all the workers

starpu-1.1.5/doc/doxygen/html/dir_eabc850dd59aa171eea51d63d27d3483.html0000644000373600000000000001254412571536763021416 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/starpufft/ Directory Reference
starpufft Directory Reference

Directories

directory  include
starpu-1.1.5/doc/doxygen/html/ftv2mlastnode.png0000644000373600000000000000036612571536757016461 00000000000000PNG  IHDRɪ|IDATx!NA\ Um@`5i`h W7] b&ofdY4 c 3v=]\B I=BB;k WN@vy4]Y|M}]x6a }dׇY>||5?>|B"'IENDB`starpu-1.1.5/doc/doxygen/html/starpu__thread__util_8h_source.html0000644000373600000000000017136712571536757022242 00000000000000 StarPU Handbook: starpu_thread_util.h Source File
starpu_thread_util.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010, 2012-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_THREAD_UTIL_H__
19 #define __STARPU_THREAD_UTIL_H__
20 
21 #include <starpu_util.h>
22 #include <errno.h>
23 
24 #if !(defined(_MSC_VER) && !defined(BUILDING_STARPU))
25 /*
26  * Encapsulation of the starpu_pthread_create_* functions.
27  */
28 
29 #define STARPU_PTHREAD_CREATE_ON(name, thread, attr, routine, arg, where) do { \
30  int p_ret = starpu_pthread_create_on((name), (thread), (attr), (routine), (arg), (where)); \
31  if (STARPU_UNLIKELY(p_ret != 0)) { \
32  fprintf(stderr, \
33  "%s:%d starpu_pthread_create_on: %s\n", \
34  __FILE__, __LINE__, strerror(p_ret)); \
35  STARPU_ABORT(); \
36  } \
37 } while (0)
38 
39 #define STARPU_PTHREAD_CREATE(thread, attr, routine, arg) do { \
40  int p_ret = starpu_pthread_create((thread), (attr), (routine), (arg)); \
41  if (STARPU_UNLIKELY(p_ret != 0)) { \
42  fprintf(stderr, \
43  "%s:%d starpu_pthread_create: %s\n", \
44  __FILE__, __LINE__, strerror(p_ret)); \
45  STARPU_ABORT(); \
46  } \
47 } while (0)
48 
49 /*
50  * Encapsulation of the starpu_pthread_mutex_* functions.
51  */
52 
53 #define STARPU_PTHREAD_MUTEX_INIT(mutex, attr) do { \
54  int p_ret = starpu_pthread_mutex_init((mutex), (attr)); \
55  if (STARPU_UNLIKELY(p_ret)) { \
56  fprintf(stderr, \
57  "%s:%d starpu_pthread_mutex_init: %s\n", \
58  __FILE__, __LINE__, strerror(p_ret)); \
59  STARPU_ABORT(); \
60  } \
61 } while (0)
62 
63 #define STARPU_PTHREAD_MUTEX_DESTROY(mutex) do { \
64  int p_ret = starpu_pthread_mutex_destroy(mutex); \
65  if (STARPU_UNLIKELY(p_ret)) { \
66  fprintf(stderr, \
67  "%s:%d starpu_pthread_mutex_destroy: %s\n", \
68  __FILE__, __LINE__, strerror(p_ret)); \
69  STARPU_ABORT(); \
70  } \
71 } while(0)
72 
73 #define STARPU_PTHREAD_MUTEX_LOCK(mutex) do { \
74  int p_ret = starpu_pthread_mutex_lock(mutex); \
75  if (STARPU_UNLIKELY(p_ret)) { \
76  fprintf(stderr, \
77  "%s:%d starpu_pthread_mutex_lock: %s\n", \
78  __FILE__, __LINE__, strerror(p_ret)); \
79  STARPU_ABORT(); \
80  } \
81 } while (0)
82 
83 #define STARPU_PTHREAD_MUTEX_TRYLOCK(mutex) \
84  _starpu_pthread_mutex_trylock(mutex, __FILE__, __LINE__)
85 static STARPU_INLINE
86 int _starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex, char *file, int line)
87 {
88  int p_ret = starpu_pthread_mutex_trylock(mutex);
89  if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) {
90  fprintf(stderr,
91  "%s:%d starpu_pthread_mutex_trylock: %s\n",
92  file, line, strerror(p_ret));
93  STARPU_ABORT();
94  }
95  return p_ret;
96 }
97 
98 #define STARPU_PTHREAD_MUTEX_UNLOCK(mutex) do { \
99  int p_ret = starpu_pthread_mutex_unlock(mutex); \
100  if (STARPU_UNLIKELY(p_ret)) { \
101  fprintf(stderr, \
102  "%s:%d starpu_pthread_mutex_unlock: %s\n", \
103  __FILE__, __LINE__, strerror(p_ret)); \
104  STARPU_ABORT(); \
105  } \
106 } while (0)
107 
108 /*
109  * Encapsulation of the starpu_pthread_key_* functions.
110  */
111 #define STARPU_PTHREAD_KEY_CREATE(key, destr) do { \
112  int p_ret = starpu_pthread_key_create((key), (destr)); \
113  if (STARPU_UNLIKELY(p_ret != 0)) { \
114  fprintf(stderr, \
115  "%s:%d starpu_pthread_key_create: %s\n", \
116  __FILE__, __LINE__, strerror(p_ret)); \
117  } \
118 } while (0)
119 
120 #define STARPU_PTHREAD_KEY_DELETE(key) do { \
121  int p_ret = starpu_pthread_key_delete((key)); \
122  if (STARPU_UNLIKELY(p_ret != 0)) { \
123  fprintf(stderr, \
124  "%s:%d starpu_pthread_key_delete: %s\n", \
125  __FILE__, __LINE__, strerror(p_ret)); \
126  } \
127 } while (0)
128 
129 #define STARPU_PTHREAD_SETSPECIFIC(key, ptr) do { \
130  int p_ret = starpu_pthread_setspecific((key), (ptr)); \
131  if (STARPU_UNLIKELY(p_ret != 0)) { \
132  fprintf(stderr, \
133  "%s:%d starpu_pthread_setspecific: %s\n", \
134  __FILE__, __LINE__, strerror(p_ret)); \
135  }; \
136 } while (0)
137 
138 #define STARPU_PTHREAD_GETSPECIFIC(key) starpu_pthread_getspecific((key))
139 
140 /*
141  * Encapsulation of the starpu_pthread_rwlock_* functions.
142  */
143 #define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) do { \
144  int p_ret = starpu_pthread_rwlock_init((rwlock), (attr)); \
145  if (STARPU_UNLIKELY(p_ret)) { \
146  fprintf(stderr, \
147  "%s:%d starpu_pthread_rwlock_init: %s\n", \
148  __FILE__, __LINE__, strerror(p_ret)); \
149  STARPU_ABORT(); \
150  } \
151 } while (0)
152 
153 #define STARPU_PTHREAD_RWLOCK_RDLOCK(rwlock) do { \
154  int p_ret = starpu_pthread_rwlock_rdlock(rwlock); \
155  if (STARPU_UNLIKELY(p_ret)) { \
156  fprintf(stderr, \
157  "%s:%d starpu_pthread_rwlock_rdlock: %s\n", \
158  __FILE__, __LINE__, strerror(p_ret)); \
159  STARPU_ABORT(); \
160  } \
161 } while (0)
162 
163 #define STARPU_PTHREAD_RWLOCK_TRYRDLOCK(rwlock) \
164  _starpu_pthread_rwlock_tryrdlock(rwlock, __FILE__, __LINE__)
165 static STARPU_INLINE
166 int _starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock, char *file, int line)
167 {
168  int p_ret = starpu_pthread_rwlock_tryrdlock(rwlock);
169  if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) {
170  fprintf(stderr,
171  "%s:%d starpu_pthread_rwlock_tryrdlock: %s\n",
172  file, line, strerror(p_ret));
173  STARPU_ABORT();
174  }
175  return p_ret;
176 }
177 
178 #define STARPU_PTHREAD_RWLOCK_WRLOCK(rwlock) do { \
179  int p_ret = starpu_pthread_rwlock_wrlock(rwlock); \
180  if (STARPU_UNLIKELY(p_ret)) { \
181  fprintf(stderr, \
182  "%s:%d starpu_pthread_rwlock_wrlock: %s\n", \
183  __FILE__, __LINE__, strerror(p_ret)); \
184  STARPU_ABORT(); \
185  } \
186 } while (0)
187 
188 #define STARPU_PTHREAD_RWLOCK_TRYWRLOCK(rwlock) \
189  _starpu_pthread_rwlock_trywrlock(rwlock, __FILE__, __LINE__)
190 static STARPU_INLINE
191 int _starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock, char *file, int line)
192 {
193  int p_ret = starpu_pthread_rwlock_trywrlock(rwlock);
194  if (STARPU_UNLIKELY(p_ret != 0 && p_ret != EBUSY)) {
195  fprintf(stderr,
196  "%s:%d starpu_pthread_rwlock_trywrlock: %s\n",
197  file, line, strerror(p_ret));
198  STARPU_ABORT();
199  }
200  return p_ret;
201 }
202 
203 #define STARPU_PTHREAD_RWLOCK_UNLOCK(rwlock) do { \
204  int p_ret = starpu_pthread_rwlock_unlock(rwlock); \
205  if (STARPU_UNLIKELY(p_ret)) { \
206  fprintf(stderr, \
207  "%s:%d starpu_pthread_rwlock_unlock: %s\n", \
208  __FILE__, __LINE__, strerror(p_ret)); \
209  STARPU_ABORT(); \
210  } \
211 } while (0)
212 
213 #define STARPU_PTHREAD_RWLOCK_DESTROY(rwlock) do { \
214  int p_ret = starpu_pthread_rwlock_destroy(rwlock); \
215  if (STARPU_UNLIKELY(p_ret)) { \
216  fprintf(stderr, \
217  "%s:%d starpu_pthread_rwlock_destroy: %s\n", \
218  __FILE__, __LINE__, strerror(p_ret)); \
219  STARPU_ABORT(); \
220  } \
221 } while (0)
222 
223 /*
224  * Encapsulation of the starpu_pthread_cond_* functions.
225  */
226 #define STARPU_PTHREAD_COND_INIT(cond, attr) do { \
227  int p_ret = starpu_pthread_cond_init((cond), (attr)); \
228  if (STARPU_UNLIKELY(p_ret)) { \
229  fprintf(stderr, \
230  "%s:%d starpu_pthread_cond_init: %s\n", \
231  __FILE__, __LINE__, strerror(p_ret)); \
232  STARPU_ABORT(); \
233  } \
234 } while (0)
235 
236 #define STARPU_PTHREAD_COND_DESTROY(cond) do { \
237  int p_ret = starpu_pthread_cond_destroy(cond); \
238  if (STARPU_UNLIKELY(p_ret)) { \
239  fprintf(stderr, \
240  "%s:%d starpu_pthread_cond_destroy: %s\n", \
241  __FILE__, __LINE__, strerror(p_ret)); \
242  STARPU_ABORT(); \
243  } \
244 } while (0)
245 
246 #define STARPU_PTHREAD_COND_SIGNAL(cond) do { \
247  int p_ret = starpu_pthread_cond_signal(cond); \
248  if (STARPU_UNLIKELY(p_ret)) { \
249  fprintf(stderr, \
250  "%s:%d starpu_pthread_cond_signal: %s\n", \
251  __FILE__, __LINE__, strerror(p_ret)); \
252  STARPU_ABORT(); \
253  } \
254 } while (0)
255 
256 #define STARPU_PTHREAD_COND_BROADCAST(cond) do { \
257  int p_ret = starpu_pthread_cond_broadcast(cond); \
258  if (STARPU_UNLIKELY(p_ret)) { \
259  fprintf(stderr, \
260  "%s:%d starpu_pthread_cond_broadcast: %s\n", \
261  __FILE__, __LINE__, strerror(p_ret)); \
262  STARPU_ABORT(); \
263  } \
264 } while (0)
265 
266 #define STARPU_PTHREAD_COND_WAIT(cond, mutex) do { \
267  int p_ret = starpu_pthread_cond_wait((cond), (mutex)); \
268  if (STARPU_UNLIKELY(p_ret)) { \
269  fprintf(stderr, \
270  "%s:%d starpu_pthread_cond_wait: %s\n", \
271  __FILE__, __LINE__, strerror(p_ret)); \
272  STARPU_ABORT(); \
273  } \
274 } while (0)
275 
276 /*
277  * Encapsulation of the starpu_pthread_barrier_* functions.
278  */
279 
280 #define STARPU_PTHREAD_BARRIER_INIT(barrier, attr, count) do { \
281  int p_ret = starpu_pthread_barrier_init((barrier), (attr), (count)); \
282  if (STARPU_UNLIKELY(p_ret)) { \
283  fprintf(stderr, \
284  "%s:%d starpu_pthread_barrier_init: %s\n", \
285  __FILE__, __LINE__, strerror(p_ret)); \
286  STARPU_ABORT(); \
287  } \
288 } while (0)
289 
290 #define STARPU_PTHREAD_BARRIER_DESTROY(barrier) do { \
291  int p_ret = starpu_pthread_barrier_destroy((barrier)); \
292  if (STARPU_UNLIKELY(p_ret)) { \
293  fprintf(stderr, \
294  "%s:%d starpu_pthread_barrier_destroy: %s\n", \
295  __FILE__, __LINE__, strerror(p_ret)); \
296  STARPU_ABORT(); \
297  } \
298 } while (0)
299 
300 #define STARPU_PTHREAD_BARRIER_WAIT(barrier) do { \
301  int p_ret = starpu_pthread_barrier_wait((barrier)); \
302  if (STARPU_UNLIKELY(!((p_ret == 0) || (p_ret == STARPU_PTHREAD_BARRIER_SERIAL_THREAD)))) { \
303  fprintf(stderr, \
304  "%s:%d starpu_pthread_barrier_wait: %s\n", \
305  __FILE__, __LINE__, strerror(p_ret)); \
306  STARPU_ABORT(); \
307  } \
308 } while (0)
309 #endif /* _MSC_VER */
310 
311 #endif /* __STARPU_THREAD_UTIL_H__ */
starpu-1.1.5/doc/doxygen/html/dynsections.js0000644000373600000000000000413412571536757016060 00000000000000function toggleVisibility(linkObj) { var base = $(linkObj).attr('id'); var summary = $('#'+base+'-summary'); var content = $('#'+base+'-content'); var trigger = $('#'+base+'-trigger'); var src=$(trigger).attr('src'); if (content.is(':visible')===true) { content.hide(); summary.show(); $(linkObj).addClass('closed').removeClass('opened'); $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); } else { content.show(); summary.hide(); $(linkObj).removeClass('closed').addClass('opened'); $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); } return false; } function updateStripes() { $('table.directory tr'). removeClass('even').filter(':visible:even').addClass('even'); } function toggleLevel(level) { $('table.directory tr').each(function(){ var l = this.id.split('_').length-1; var i = $('#img'+this.id.substring(3)); var a = $('#arr'+this.id.substring(3)); if (l StarPU Handbook: Expert Mode
StarPU Handbook
Expert Mode

Functions

void starpu_wake_all_blocked_workers (void)
int starpu_progression_hook_register (unsigned(*func)(void *arg), void *arg)
void starpu_progression_hook_deregister (int hook_id)

Detailed Description

Function Documentation

void starpu_wake_all_blocked_workers ( void  )

Wake all the workers, so they can inspect data requests and task submissions again.

int starpu_progression_hook_register ( unsigned(*)(void *arg)  func,
void *  arg 
)

Register a progression hook, to be called when workers are idle.

void starpu_progression_hook_deregister ( int  hook_id)

Unregister a given progression hook.

starpu-1.1.5/doc/doxygen/html/GNUFreeDocumentationLicense.html0000644000373600000000000007077412571536763021350 00000000000000 StarPU Handbook: The GNU Free Documentation License
The GNU Free Documentation License
Version 1.3, 3 November 2008

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.

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.1.5/doc/doxygen/html/group__API__Codelet__And__Tasks.html0000644000373600000000000036626212571536763022067 00000000000000 StarPU Handbook: Codelet And Tasks
StarPU Handbook

This section describes the interface to manipulate codelets and tasks. More...

Data Structures

struct  starpu_codelet
struct  starpu_data_descr
struct  starpu_task

Macros

#define STARPU_NOWHERE
#define STARPU_CPU
#define STARPU_CUDA
#define STARPU_OPENCL
#define STARPU_MULTIPLE_CPU_IMPLEMENTATIONS
#define STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS
#define STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS
#define STARPU_NMAXBUFS
#define STARPU_TASK_INITIALIZER
#define STARPU_TASK_GET_HANDLE(task, i)
#define STARPU_TASK_SET_HANDLE(task, handle, i)
#define STARPU_CODELET_GET_MODE(codelet, i)
#define STARPU_CODELET_SET_MODE(codelet, mode, i)
#define STARPU_TASK_INVALID

Typedefs

typedef void(* starpu_cpu_func_t )(void **, void *)
typedef void(* starpu_cuda_func_t )(void **, void *)
typedef void(* starpu_opencl_func_t )(void **, void *)

Enumerations

enum  starpu_codelet_type { STARPU_SEQ, STARPU_SPMD, STARPU_FORKJOIN }
enum  starpu_task_status {
  STARPU_TASK_INVALID, STARPU_TASK_INVALID, STARPU_TASK_BLOCKED, STARPU_TASK_READY,
  STARPU_TASK_RUNNING, STARPU_TASK_FINISHED, STARPU_TASK_BLOCKED_ON_TAG, STARPU_TASK_BLOCKED_ON_TASK,
  STARPU_TASK_BLOCKED_ON_DATA
}

Functions

void starpu_codelet_init (struct starpu_codelet *cl)
void starpu_task_init (struct starpu_task *task)
struct starpu_taskstarpu_task_create (void)
struct starpu_taskstarpu_task_dup (struct starpu_task *task)
void starpu_task_clean (struct starpu_task *task)
void starpu_task_destroy (struct starpu_task *task)
int starpu_task_wait (struct starpu_task *task) STARPU_WARN_UNUSED_RESULT
int starpu_task_submit (struct starpu_task *task) STARPU_WARN_UNUSED_RESULT
int starpu_task_submit_to_ctx (struct starpu_task *task, unsigned sched_ctx_id)
int starpu_task_wait_for_all (void)
int starpu_task_wait_for_all_in_ctx (unsigned sched_ctx_id)
int starpu_task_wait_for_n_submitted (unsigned n)
int starpu_task_wait_for_n_submitted_in_ctx (unsigned sched_ctx_id, unsigned n)
int starpu_task_nready (void)
int starpu_task_nsubmitted (void)
struct starpu_taskstarpu_task_get_current (void)
void starpu_codelet_display_stats (struct starpu_codelet *cl)
int starpu_task_wait_for_no_ready (void)
void starpu_task_set_implementation (struct starpu_task *task, unsigned impl)
unsigned starpu_task_get_implementation (struct starpu_task *task)
void starpu_create_sync_task (starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void(*callback)(void *), void *callback_arg)

Detailed Description

This section describes the interface to manipulate codelets and tasks.


Data Structure Documentation

struct starpu_codelet

The codelet structure describes a kernel that is possibly implemented on various targets. For compatibility, make sure to initialize the whole structure to zero, either by using explicit memset, or the function starpu_codelet_init(), or by letting the compiler implicitly do it in e.g. static storage case.

Data Fields

uint32_t where
int(* can_execute )(unsigned workerid, struct starpu_task *task, unsigned nimpl)
enum starpu_codelet_type type
int max_parallelism
starpu_cpu_func_t cpu_func
starpu_cuda_func_t cuda_func
starpu_opencl_func_t opencl_func
starpu_cpu_func_t cpu_funcs [STARPU_MAXIMPLEMENTATIONS]
starpu_cuda_func_t cuda_funcs [STARPU_MAXIMPLEMENTATIONS]
starpu_opencl_func_t opencl_funcs [STARPU_MAXIMPLEMENTATIONS]
unsigned nbuffers
enum starpu_data_access_mode modes [STARPU_NMAXBUFS]
enum starpu_data_access_modedyn_modes
unsigned specific_nodes
int nodes [STARPU_NMAXBUFS]
int * dyn_nodes
struct starpu_perfmodelmodel
struct starpu_perfmodelpower_model
unsigned long per_worker_stats [STARPU_NMAXWORKERS]
const char * name

Field Documentation

starpu_codelet::where

Optional field to indicate which types of processing units are able to execute the codelet. The different values STARPU_CPU, STARPU_CUDA, STARPU_OPENCL can be combined to specify on which types of processing units the codelet can be executed. STARPU_CPU|STARPU_CUDA for instance indicates that the codelet is implemented for both CPU cores and CUDA devices while STARPU_OPENCL indicates that it is only available on OpenCL devices. If the field is unset, its value will be automatically set based on the availability of the XXX_funcs fields defined below. It can also be set to STARPU_NOWHERE to specify that no computation has to be actually done.

starpu_codelet::can_execute

Define a function which should return 1 if the worker designated by workerid can execute the nimplth implementation of the given task, 0 otherwise.

starpu_codelet::type

Optional field to specify the type of the codelet. The default is STARPU_SEQ, i.e. usual sequential implementation. Other values (STARPU_SPMD or STARPU_FORKJOIN declare that a parallel implementation is also available. See Parallel Tasks for details.

starpu_codelet::max_parallelism

Optional field. If a parallel implementation is available, this denotes the maximum combined worker size that StarPU will use to execute parallel tasks for this codelet.

starpu_codelet::cpu_func
Deprecated:
Optional field which has been made deprecated. One should use instead the field starpu_codelet::cpu_funcs.
starpu_codelet::cuda_func
Deprecated:
Optional field which has been made deprecated. One should use instead the starpu_codelet::cuda_funcs field.
starpu_codelet::opencl_func
Deprecated:
Optional field which has been made deprecated. One should use instead the starpu_codelet::opencl_funcs field.
starpu_codelet::cpu_funcs

Optional array of function pointers to the CPU implementations of the codelet. It must be terminated by a NULL value. The functions prototype must be:

void cpu_func(void *buffers[], void *cl_arg)

The first argument being the array of data managed by the data management library, and the second argument is a pointer to the argument passed from the field starpu_task::cl_arg. If the field starpu_codelet::where is set, then the field starpu_codelet::cpu_funcs is ignored if STARPU_CPU does not appear in the field starpu_codelet::where, it must be non-null otherwise.

starpu_codelet::cuda_funcs

Optional array of function pointers to the CUDA implementations of the codelet. It must be terminated by a NULL value. The functions must be host-functions written in the CUDA runtime API. Their prototype must be:

void cuda_func(void *buffers[], void *cl_arg)

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_codelet::opencl_funcs

Optional array of function pointers to the OpenCL implementations of the codelet. It must be terminated by a NULL value. The functions prototype must be:

void opencl_func(void *buffers[], void *cl_arg)

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_codelet::nbuffers

Specify the number of arguments taken by the codelet. These arguments are managed by the DSM and are accessed from the void *buffers[] array. The constant argument passed with the field starpu_task::cl_arg is not counted in this number. This value should not be above STARPU_NMAXBUFS.

starpu_codelet::modes

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 STARPU_NMAXBUFS. If unsufficient, this value can be set with the configure option --enable-maxbuffers.

starpu_codelet::dyn_modes

Is an array of starpu_data_access_mode. It describes the required access modes to the data needed by the codelet (e.g. STARPU_RW). The number of entries in this array must be specified in the field starpu_codelet::nbuffers. This field should be used for codelets having a number of datas greater than STARPU_NMAXBUFS (see Setting The Data Handles For A Task). When defining a codelet, one should either define this field or the field starpu_codelet::modes defined above.

starpu_codelet::specific_nodes

Default value is 0. If this flag is set, StarPU will not systematically send all data to the memory node where the task will be executing, it will read the starpu_codelet::nodes or starpu_codelet::dyn_nodes array to determine, for each data, whether to send it on the memory node where the task will be executing (-1), or on a specific node (!= -1).

starpu_codelet::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 STARPU_NMAXBUFS.

starpu_codelet::dyn_nodes

Optional field. When starpu_codelet::specific_nodes is 1, this specifies the memory nodes where each data should be sent to for task execution. The number of entries in this array is starpu_codelet::nbuffers. This field should be used for codelets having a number of datas greater than STARPU_NMAXBUFS (see Setting The Data Handles For A Task). When defining a codelet, one should either define this field or the field starpu_codelet::nodes defined above.

starpu_codelet::model

Optional pointer to the task duration performance model associated to this codelet. This optional field is ignored when set to NULL or when its field starpu_perfmodel::symbol is not set.

starpu_codelet::power_model

Optional pointer to the task power consumption performance model associated to this codelet. This optional field is ignored when set to NULL or when its field starpu_perfmodel::field is not set. In the case of parallel codelets, this has to account for all processing units involved in the parallel execution.

starpu_codelet::per_worker_stats

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).

starpu_codelet::name

Optional name of the codelet. This can be useful for debugging purposes.

struct starpu_data_descr

This type is used to describe a data handle along with an access mode.

Data Fields
starpu_data_handle_t handle describes a data
enum starpu_data_access_mode mode describes its access mode
struct starpu_task

The structure describes a task that can be offloaded on the various processing units managed by StarPU. It instantiates a codelet. It can either be allocated dynamically with the function starpu_task_create(), or declared statically. In the latter case, the programmer has to zero the structure starpu_task and to fill the different fields properly. The indicated default values correspond to the configuration of a task allocated with starpu_task_create().

Data Fields

struct starpu_codeletcl
struct starpu_data_descr buffers [STARPU_NMAXBUFS]
starpu_data_handle_t handles [STARPU_NMAXBUFS]
void * interfaces [STARPU_NMAXBUFS]
starpu_data_handle_tdyn_handles
void ** dyn_interfaces
void * cl_arg
size_t cl_arg_size
unsigned cl_arg_free
void(* callback_func )(void *)
void * callback_arg
unsigned callback_arg_free
void(* prologue_callback_func )(void *)
void * prologue_callback_arg
unsigned prologue_callback_arg_free
unsigned use_tag
starpu_tag_t tag_id
unsigned sequential_consistency
unsigned synchronous
int priority
unsigned execute_on_a_specific_worker
unsigned workerid
starpu_task_bundle_t bundle
int detach
int destroy
int regenerate
enum starpu_task_status status
struct starpu_profiling_task_infoprofiling_info
double predicted
double predicted_transfer
unsigned int mf_skip
struct starpu_taskprev
struct starpu_tasknext
void * starpu_private
int magic
unsigned sched_ctx
int hypervisor_tag
double flops
unsigned scheduled

Field Documentation

starpu_task::cl

Is a pointer to the corresponding structure starpu_codelet. This describes where the kernel should be executed, and supplies the appropriate implementations. When set to NULL, no code is executed during the tasks, such empty tasks can be useful for synchronization purposes.

starpu_task::buffers
Deprecated:
This field has been made deprecated. One should use instead the field starpu_task::handles to specify the data handles accessed by the task. The access modes are now defined in the field starpu_codelet::modes.
starpu_task::handles

Is an array of starpu_data_handle_t. It specifies the handles to the different pieces of data accessed by the task. The number of entries in this array must be specified in the field starpu_codelet::nbuffers, and should not exceed STARPU_NMAXBUFS. If unsufficient, this value can be set with the configure option --enable-maxbuffers.

starpu_task::interfaces

The actual data pointers to the memory node where execution will happen, managed by the DSM.

starpu_task::dyn_handles

Is an array of starpu_data_handle_t. It specifies the handles to the different pieces of data accessed by the task. The number of entries in this array must be specified in the field starpu_codelet::nbuffers. This field should be used for tasks having a number of datas greater than STARPU_NMAXBUFS (see Setting The Data Handles For A Task). When defining a task, one should either define this field or the field starpu_task::handles defined above.

starpu_task::dyn_interfaces

The actual data pointers to the memory node where execution will happen, managed by the DSM. Is used when the field starpu_task::dyn_handles is defined.

starpu_task::cl_arg

Optional pointer which is passed to the codelet through the second argument of the codelet implementation (e.g. starpu_codelet::cpu_func or starpu_codelet::cuda_func). The default value is NULL.

starpu_task::cl_arg_size

Optional field. For some specific drivers, the pointer starpu_task::cl_arg cannot not be directly given to the driver function. A buffer of size starpu_task::cl_arg_size needs to be allocated on the driver. This buffer is then filled with the starpu_task::cl_arg_size bytes starting at address starpu_task::cl_arg. In this case, the argument given to the codelet is therefore not the starpu_task::cl_arg pointer, but the address of the buffer in local store (LS) instead. This field is ignored for CPU, CUDA and OpenCL codelets, where the starpu_task::cl_arg pointer is given as such.

starpu_task::cl_arg_free

Optional field. In case starpu_task::cl_arg was allocated by the application through malloc(), setting starpu_task::cl_arg_free to 1 makes StarPU automatically call free(cl_arg) when destroying the task. This saves the user from defining a callback just for that. This is mostly useful when targetting devices where the codelet does not execute in the same memory space as the main thread.

starpu_task::callback_func

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.

starpu_task::callback_arg

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.

starpu_task::callback_arg_free

Optional field. In case starpu_task::callback_arg was allocated by the application through malloc(), setting starpu_task::callback_arg_free to 1 makes StarPU automatically call free(callback_arg) when destroying the task.

starpu_task::prologue_callback_func

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.

starpu_task::prologue_callback_arg

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.

starpu_task::prologue_callback_arg_free

Optional field. In case starpu_task::prologue_callback_arg was allocated by the application through malloc(), setting starpu_task::prologue_callback_arg_free to 1 makes StarPU automatically call free(prologue_callback_arg) when destroying the task.

starpu_task::use_tag

Optional field, the default value is 0. If set, this flag indicates that the task should be associated with the tag contained in the starpu_task::tag_id field. Tag allow the application to synchronize with the task and to express task dependencies easily.

starpu_task::tag_id

This optional field contains the tag associated to the task if the field starpu_task::use_tag is set, it is ignored otherwise.

starpu_task::sequential_consistency

If this flag is set (which is the default), sequential consistency is enforced for the data parameters of this task for which sequential consistency is enabled. Clearing this flag permits to disable sequential consistency for this task, even if data have it enabled.

starpu_task::synchronous

If this flag is set, the function starpu_task_submit() is blocking and returns only when the task has been executed (or if no worker is able to process the task). Otherwise, starpu_task_submit() returns immediately.

starpu_task::priority

Optional field, the default value is STARPU_DEFAULT_PRIO. This field indicates a level of priority for the task. This is an integer value that must be set between the return values of the function starpu_sched_get_min_priority() for the least important tasks, and that of the function starpu_sched_get_max_priority() for the most important tasks (included). The STARPU_MIN_PRIO and STARPU_MAX_PRIO macros are provided for convenience and respectively returns the value of starpu_sched_get_min_priority() and starpu_sched_get_max_priority(). Default priority is STARPU_DEFAULT_PRIO, which is always defined as 0 in order to allow static task initialization. Scheduling strategies that take priorities into account can use this parameter to take better scheduling decisions, but the scheduling policy may also ignore it.

starpu_task::execute_on_a_specific_worker

Default value is 0. If this flag is set, StarPU will bypass the scheduler and directly affect this task to the worker specified by the field starpu_task::workerid.

starpu_task::workerid

Optional field. If the field starpu_task::execute_on_a_specific_worker is set, this field indicates the identifier of the worker that should process this task (as returned by starpu_worker_get_id()). This field is ignored if the field starpu_task::execute_on_a_specific_worker is set to 0.

starpu_task::bundle

Optional field. The bundle that includes this task. If no bundle is used, this should be NULL.

starpu_task::detach

Optional field, default value is 1. If this flag is set, it is not possible to synchronize with the task by the means of starpu_task_wait() later on. Internal data structures are only guaranteed to be freed once starpu_task_wait() is called if the flag is not set.

starpu_task::destroy

Optional value. Default value is 0 for starpu_task_init(), and 1 for starpu_task_create(). If this flag is set, the task structure will automatically be freed, either after the execution of the callback if the task is detached, or during starpu_task_wait() otherwise. If this flag is not set, dynamically allocated data structures will not be freed until starpu_task_destroy() is called explicitly. Setting this flag for a statically allocated task structure will result in undefined behaviour. The flag is set to 1 when the task is created by calling starpu_task_create(). Note that starpu_task_wait_for_all() will not free any task.

starpu_task::regenerate

Optional field. If this flag is set, the task will be re-submitted to StarPU once it has been executed. This flag must not be set if the flag starpu_task::destroy is set. This flag must be set before making another task depend on this one.

starpu_task::status

Optional field. Current state of the task.

starpu_task::profiling_info

Optional field. Profiling information for the task.

starpu_task::predicted

Output field. Predicted duration of the task. This field is only set if the scheduling strategy uses performance models.

starpu_task::predicted_transfer

Optional field. Predicted data transfer duration for the task in microseconds. This field is only valid if the scheduling strategy uses performance models.

starpu_task::mf_skip

This is only used for tasks that use multiformat handle. This should only be used by StarPU.

starpu_task::prev

A pointer to the previous task. This should only be used by StarPU.

starpu_task::next

A pointer to the next task. This should only be used by StarPU.

starpu_task::starpu_private

This is private to StarPU, do not modify. If the task is allocated by hand (without starpu_task_create()), this field should be set to NULL.

starpu_task::magic

This field is set when initializing a task. The function starpu_task_submit() will fail if the field does not have the right value. This will hence avoid submitting tasks which have not been properly initialised.

starpu_task::sched_ctx

Scheduling context.

starpu_task::hypervisor_tag

Helps the hypervisor monitor the execution of this task.

starpu_task::flops

This can be set to the number of floating points operations that the task will have to achieve. This is useful for easily getting GFlops curves from the tool starpu_perfmodel_plot, and for the hypervisor load balancing.

starpu_task::scheduled

Whether the scheduler has pushed the task on some queue

Macro Definition Documentation

#define STARPU_NOWHERE

This macro is used when setting the field starpu_codelet::where to specify that the codelet has no computation part, and thus does not need to be scheduled, and data does not need to be actually loaded. This is thus essentially used for synchronization tasks.

#define STARPU_CPU

This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a CPU processing unit.

#define STARPU_CUDA

This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a CUDA processing unit.

#define STARPU_OPENCL

This macro is used when setting the field starpu_codelet::where to specify the codelet may be executed on a OpenCL processing unit.

#define STARPU_MULTIPLE_CPU_IMPLEMENTATIONS
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_CUDA_IMPLEMENTATIONS
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_OPENCL_IMPLEMENTATIONS
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_NMAXBUFS

Defines the maximum number of buffers that tasks will be able to take as parameters. The default value is 8, it can be changed by using the configure option --enable-maxbuffers.

#define STARPU_TASK_INITIALIZER

It is possible to initialize statically allocated tasks with this value. This is equivalent to initializing a structure starpu_task with the function starpu_task_init() function.

#define STARPU_TASK_GET_HANDLE (   task,
 
)

Return the i th data handle of the given task. If the task is defined with a static or dynamic number of handles, will either return the i th element of the field starpu_task::handles or the i th element of the field starpu_task::dyn_handles (see Setting The Data Handles For A Task)

#define STARPU_TASK_SET_HANDLE (   task,
  handle,
 
)

Set the i th data handle of the given task with the given dat handle. If the task is defined with a static or dynamic number of handles, will either set the i th element of the field starpu_task::handles or the i th element of the field starpu_task::dyn_handles (see Setting The Data Handles For A Task)

#define STARPU_CODELET_GET_MODE (   codelet,
 
)

Return the access mode of the i th data handle of the given codelet. If the codelet is defined with a static or dynamic number of handles, will either return the i th element of the field starpu_codelet::modes or the i th element of the field starpu_codelet::dyn_modes (see Setting The Data Handles For A Task)

#define STARPU_CODELET_SET_MODE (   codelet,
  mode,
 
)

Set the access mode of the i th data handle of the given codelet. If the codelet is defined with a static or dynamic number of handles, will either set the i th element of the field starpu_codelet::modes or the i th element of the field starpu_codelet::dyn_modes (see Setting The Data Handles For A Task)

starpu_task_status::STARPU_TASK_INVALID

The task has just been initialized.

Typedef Documentation

starpu_cpu_func_t

CPU implementation of a codelet.

starpu_cuda_func_t

CUDA implementation of a codelet.

starpu_opencl_func_t

OpenCL implementation of a codelet.

Enumeration Type Documentation

Describes the type of parallel task. See Parallel Tasks for details.

Enumerator:
STARPU_SEQ 

(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.

Task status

Enumerator:
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.

Function Documentation

void starpu_codelet_init ( struct starpu_codelet cl)

Initialize cl with default values. Codelets should preferably be initialized statically as shown in Defining A Codelet. However such a initialisation is not always possible, e.g. when using C++.

void starpu_task_init ( struct starpu_task task)

Initialize task with default values. This function is implicitly called by starpu_task_create(). By default, tasks initialized with starpu_task_init() must be deinitialized explicitly with starpu_task_clean(). Tasks can also be initialized statically, using STARPU_TASK_INITIALIZER.

struct starpu_task * starpu_task_create ( void  )
read

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_dup ( struct starpu_task task)
read

Allocate a task structure which is the exact duplicate of the given task.

void starpu_task_clean ( struct starpu_task task)

Release all the structures automatically allocated to execute task, but not the task structure itself and values set by the user remain unchanged. It is thus useful for statically allocated tasks for instance. It is also useful when users want to execute the same operation several times with as least overhead as possible. It is called automatically by starpu_task_destroy(). It has to be called only after explicitly waiting for the task or after starpu_shutdown() (waiting for the callback is not enough, since StarPU still manipulates the task after calling the callback).

void starpu_task_destroy ( struct starpu_task task)

Free the resource allocated during starpu_task_create() and associated with task. This function is already called automatically after the execution of a task when the field starpu_task::destroy is set, which is the default for tasks created by starpu_task_create(). Calling this function on a statically allocated task results in an undefined behaviour.

int starpu_task_wait ( struct starpu_task task)

This function blocks until 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_submit ( struct starpu_task task)

This function submits task to StarPU. Calling this function does not mean that the task will be executed immediately as there can be data or task (tag) dependencies that are not fulfilled yet: StarPU will take care of scheduling this task with respect to such dependencies. This function returns immediately if the field starpu_task::synchronous is set to 0, and block until the termination of the task otherwise. It is also possible to synchronize the application with asynchronous tasks by the means of tags, using the function starpu_tag_wait() function for instance. In case of success, this function returns 0, a return value of -ENODEV means that there is no worker able to process this task (e.g. there is no GPU available and this task is only implemented for CUDA devices). starpu_task_submit() can be called from anywhere, including codelet functions and callbacks, provided that the field starpu_task::synchronous is set to 0.

int starpu_task_submit_to_ctx ( struct starpu_task task,
unsigned  sched_ctx_id 
)

This function submits a task to StarPU to the context sched_ctx_id . By default starpu_task_submit submits the task to a global context that is created automatically by StarPU.

int starpu_task_wait_for_all ( void  )

This function blocks until all the tasks that were submitted (to the current context or the global one if there aren't any) are terminated. It does not destroy these tasks.

int starpu_task_wait_for_all_in_ctx ( unsigned  sched_ctx_id)

This function waits until all the tasks that were already submitted to the context sched_ctx_id have been executed

int starpu_task_wait_for_n_submitted ( unsigned  n)

This function blocks until there are n submitted tasks left (to the current context or the global one if there aren't any) to be executed. It does not destroy these tasks.

int starpu_task_wait_for_n_submitted_in_ctx ( unsigned  sched_ctx,
unsigned  n 
)

This function waits until there are n tasks submitted left to be executed that were already submitted to the context sched_ctx_id .

int starpu_task_nready ( void  )

TODO

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_nsubmitted ( void  )

Return the number of submitted tasks which have not completed yet.

struct starpu_task * starpu_task_get_current ( void  )
read

This function returns the task currently executed by the worker, or NULL if it is called either from a thread that is not a task or simply because there is no task being executed at the moment.

void starpu_codelet_display_stats ( struct starpu_codelet cl)

Output on stderr some statistics on the codelet cl.

int starpu_task_wait_for_no_ready ( void  )

This function waits until there is no more ready task.

void starpu_task_set_implementation ( struct starpu_task task,
unsigned  impl 
)

This function should be called by schedulers to specify the codelet implementation to be executed when executing the task.

unsigned starpu_task_get_implementation ( struct starpu_task task)

This function return the codelet implementation to be executed when executing the task.

void starpu_create_sync_task ( starpu_tag_t  sync_tag,
unsigned  ndeps,
starpu_tag_t deps,
void(*)(void *)  callback,
void *  callback_arg 
)

This creates (and submits) an empty task that unlocks a tag once all its dependencies are fulfilled.

starpu-1.1.5/doc/doxygen/html/group__API__Task__Bundles.html0000644000373600000000000004163712571536763020774 00000000000000 StarPU Handbook: Task Bundles
StarPU Handbook
Task Bundles

Typedefs

typedef struct
_starpu_task_bundle * 
starpu_task_bundle_t

Functions

void starpu_task_bundle_create (starpu_task_bundle_t *bundle)
int starpu_task_bundle_insert (starpu_task_bundle_t bundle, struct starpu_task *task)
int starpu_task_bundle_remove (starpu_task_bundle_t bundle, struct starpu_task *task)
void starpu_task_bundle_close (starpu_task_bundle_t bundle)
double starpu_task_bundle_expected_length (starpu_task_bundle_t bundle, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_bundle_expected_power (starpu_task_bundle_t bundle, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_bundle_expected_data_transfer_time (starpu_task_bundle_t bundle, unsigned memory_node)

Detailed Description

Typedef Documentation

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.

Function Documentation

void starpu_task_bundle_create ( starpu_task_bundle_t bundle)

Factory function creating and initializing bundle, when the call returns, memory needed is allocated and bundle is ready to use.

int starpu_task_bundle_insert ( starpu_task_bundle_t  bundle,
struct starpu_task task 
)

Insert task in bundle. Until task is removed from 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 bundle is already closed and/or task is already submitted. On success, it returns 0. There are two cases of error : if bundle is already closed it returns -EPERM, if task was already submitted it returns -EINVAL.

int starpu_task_bundle_remove ( starpu_task_bundle_t  bundle,
struct starpu_task task 
)

Remove task from bundle. Of course task must have been previously inserted in bundle. This function must not be called if bundle is already closed and/or task is already submitted. Doing so would result in undefined behaviour. On success, it returns 0. If bundle is already closed it returns -ENOENT.

void starpu_task_bundle_close ( starpu_task_bundle_t  bundle)

Inform the runtime that the user will not modify bundle anymore, it means no more inserting or removing task. Thus the runtime can destroy it when possible.

double starpu_task_bundle_expected_length ( starpu_task_bundle_t  bundle,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl 
)

Return the expected duration of bundle in micro-seconds.

double starpu_task_bundle_expected_power ( starpu_task_bundle_t  bundle,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl 
)

Return the expected power consumption of bundle in J.

double starpu_task_bundle_expected_data_transfer_time ( starpu_task_bundle_t  bundle,
unsigned  memory_node 
)

Return the time (in micro-seconds) expected to transfer all data used within bundle.

starpu-1.1.5/doc/doxygen/html/group__API__Performance__Model.html0000644000373600000000000016351112571536763021773 00000000000000 StarPU Handbook: Performance Model
StarPU Handbook

Data Structures

struct  starpu_perfmodel
struct  starpu_perfmodel_regression_model
struct  starpu_perfmodel_per_arch
struct  starpu_perfmodel_history_list
struct  starpu_perfmodel_history_entry

Enumerations

enum  starpu_perfmodel_archtype { STARPU_CPU_DEFAULT, STARPU_CUDA_DEFAULT, STARPU_OPENCL_DEFAULT }
enum  starpu_perfmodel_type {
  STARPU_PER_ARCH, STARPU_COMMON, STARPU_HISTORY_BASED, STARPU_REGRESSION_BASED,
  STARPU_NL_REGRESSION_BASED
}

Functions

void starpu_perfmodel_free_sampling_directories (void)
int starpu_perfmodel_load_symbol (const char *symbol, struct starpu_perfmodel *model)
int starpu_perfmodel_unload_model (struct starpu_perfmodel *model)
void starpu_perfmodel_debugfilepath (struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, char *path, size_t maxlen, unsigned nimpl)
void starpu_perfmodel_get_arch_name (enum starpu_perfmodel_archtype arch, char *archname, size_t maxlen, unsigned nimpl)
enum starpu_perfmodel_archtype starpu_worker_get_perf_archtype (int workerid)
int starpu_perfmodel_list (FILE *output)
void starpu_perfmodel_directory (FILE *output)
void starpu_perfmodel_print (struct starpu_perfmodel *model, enum starpu_perfmodel_archtype 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)
void starpu_bus_print_bandwidth (FILE *f)
void starpu_bus_print_affinity (FILE *f)
void starpu_perfmodel_update_history (struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned cpuid, unsigned nimpl, double measured)
double starpu_transfer_bandwidth (unsigned src_node, unsigned dst_node)
double starpu_transfer_latency (unsigned src_node, unsigned dst_node)
double starpu_transfer_predict (unsigned src_node, unsigned dst_node, size_t size)

Detailed Description


Data Structure Documentation

struct starpu_perfmodel

Contains all information about a performance model. At least the type and symbol fields have to be filled when defining a performance model for a codelet. For compatibility, make sure to initialize the whole structure to zero, either by using explicit memset, or by letting the compiler implicitly do it in e.g. static storage case. If not provided, other fields have to be zero.

Data Fields

enum starpu_perfmodel_type type
double(* cost_model )(struct starpu_data_descr *)
double(* cost_function )(struct starpu_task *, unsigned nimpl)
size_t(* size_base )(struct starpu_task *, unsigned nimpl)
struct starpu_perfmodel_per_arch per_arch [STARPU_NARCH_VARIATIONS][STARPU_MAXIMPLEMENTATIONS]
const char * symbol
unsigned is_loaded
unsigned benchmarking
starpu_pthread_rwlock_t model_rwlock

Field Documentation

starpu_perfmodel::type

is the type of performance model

starpu_perfmodel::cost_model
Deprecated:
This field is deprecated. Use instead the field starpu_perfmodel::cost_function field.
starpu_perfmodel::cost_function

Used by STARPU_COMMON: takes a task and implementation number, and must return a task duration estimation in micro-seconds.

starpu_perfmodel::size_base

Used by STARPU_HISTORY_BASED, STARPU_REGRESSION_BASED and STARPU_NL_REGRESSION_BASED. If not NULL, takes a task and implementation number, and returns the size to be used as index for history and regression.

starpu_perfmodel::per_arch

Used by STARPU_PER_ARCH: array of structures starpu_per_arch_perfmodel

starpu_perfmodel::symbol

is the symbol name for the performance model, which will be used as file name to store the model. It must be set otherwise the model will be ignored.

starpu_perfmodel::is_loaded

Whether the performance model is already loaded from the disk.

starpu_perfmodel::benchmarking

Whether the performance model is still being calibrated.

starpu_perfmodel::model_rwlock

Lock to protect concurrency between loading from disk (W), updating the values (W), and making a performance estimation (R).

struct starpu_perfmodel_regression_model

...

Data Fields
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
struct starpu_perfmodel_per_arch

contains information about the performance model of a given arch.

Data Fields

double(* cost_model )(struct starpu_data_descr *t)
double(* cost_function )(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
size_t(* size_base )(struct starpu_task *, enum starpu_perfmodel_archtype arch, unsigned nimpl)
struct
starpu_perfmodel_history_table * 
history
struct
starpu_perfmodel_history_list
list
struct
starpu_perfmodel_regression_model 
regression

Field Documentation

starpu_perfmodel_per_arch::cost_model
Deprecated:
This field is deprecated. Use instead the field starpu_perfmodel_per_arch::cost_function.
starpu_perfmodel_per_arch::cost_function

Used by STARPU_PER_ARCH, must point to functions which take a task, the target arch and implementation number (as mere conveniency, since the array is already indexed by these), and must return a task duration estimation in micro-seconds.

starpu_perfmodel_per_arch::size_base

Same as in structure starpu_perfmodel, but per-arch, in case it depends on the architecture-specific implementation.

starpu_perfmodel_per_arch::history

The history of performance measurements.

starpu_perfmodel_per_arch::list

Used by STARPU_HISTORY_BASED and STARPU_NL_REGRESSION_BASED, records all execution history measures.

starpu_perfmodel_per_arch::regression

Used by STARPU_REGRESSION_BASED and STARPU_NL_REGRESSION_BASED, contains the estimated factors of the regression.

struct starpu_perfmodel_history_list

todo

Data Fields
struct
starpu_perfmodel_history_list *
next todo
struct
starpu_perfmodel_history_entry *
entry todo
struct starpu_perfmodel_history_entry

todo

Data Fields
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
uint32_t footprint data footprint
size_t size in bytes
double flops Provided by the application

Enumeration Type Documentation

Enumerates the various types of architectures.

it is possible that we have multiple versions of the same kind of workers, for instance multiple GPUs or even different CPUs within the same machine so we do not use the archtype enum type directly for performance models.

Enumerator:
STARPU_CPU_DEFAULT 

CPU combined workers between 0 and STARPU_MAXCPUS-1

STARPU_CUDA_DEFAULT 

CUDA workers

STARPU_OPENCL_DEFAULT 

OpenCL workers

TODO

Enumerator:
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)

Function Documentation

void starpu_perfmodel_free_sampling_directories ( void  )

this function frees internal memory used for sampling directory management. It should only be called by an application which is not calling starpu_shutdown as this function already calls it. See for example tools/starpu_perfmodel_display.c.

int starpu_perfmodel_load_symbol ( const char *  symbol,
struct starpu_perfmodel model 
)

loads a given performance model. The model structure has to be completely zero, and will be filled with the information saved in $STARPU_HOME/.starpu. The function is intended to be used by external tools that should read the performance model files.

int starpu_perfmodel_unload_model ( struct starpu_perfmodel model)

unloads the given model which has been previously loaded through the function starpu_perfmodel_load_symbol()

void starpu_perfmodel_debugfilepath ( struct starpu_perfmodel model,
enum starpu_perfmodel_archtype  arch,
char *  path,
size_t  maxlen,
unsigned  nimpl 
)

returns the path to the debugging information for the performance model.

void starpu_perfmodel_get_arch_name ( enum starpu_perfmodel_archtype  arch,
char *  archname,
size_t  maxlen,
unsigned  nimpl 
)

returns the architecture name for arch

enum starpu_perfmodel_archtype starpu_worker_get_perf_archtype ( int  workerid)

returns the architecture type of a given worker.

int starpu_perfmodel_list ( FILE *  output)

prints a list of all performance models on output

int starpu_perfmodel_directory ( FILE *  output)

prints the directory name storing performance models on output

void starpu_perfmodel_print ( struct starpu_perfmodel model,
enum starpu_perfmodel_archtype  arch,
unsigned  nimpl,
char *  parameter,
uint32_t *  footprint,
FILE *  output 
)

todo

int starpu_perfmodel_print_all ( struct starpu_perfmodel model,
char *  arch,
char *  parameter,
uint32_t *  footprint,
FILE *  output 
)

todo

void starpu_bus_print_bandwidth ( FILE *  f)

prints a matrix of bus bandwidths on f.

void starpu_bus_print_affinity ( FILE *  f)

prints the affinity devices on f.

void starpu_perfmodel_update_history ( struct starpu_perfmodel model,
struct starpu_task task,
enum starpu_perfmodel_archtype  arch,
unsigned  cpuid,
unsigned  nimpl,
double  measured 
)

This feeds the performance model model with an explicit measurement measured (in µs), in addition to measurements done by StarPU itself. This can be useful when the application already has an existing set of measurements done in good conditions, that StarPU could benefit from instead of doing on-line measurements. And example of use can be seen in PerformanceModelExample.

double starpu_transfer_bandwidth ( unsigned  src_node,
unsigned  dst_node 
)

Return the bandwidth of data transfer between two memory nodes

double starpu_transfer_latency ( unsigned  src_node,
unsigned  dst_node 
)

Return the latency of data transfer between two memory nodes

double starpu_transfer_predict ( unsigned  src_node,
unsigned  dst_node,
size_t  size 
)

Return the estimated time to transfer a given size between two memory nodes.

starpu-1.1.5/doc/doxygen/html/functions_vars_0x73.html0000644000373600000000000002633112571536763017672 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/starpu__opencl_8h_source.html0000644000373600000000000006344412571536757021053 00000000000000 StarPU Handbook: starpu_opencl.h Source File
starpu_opencl.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_OPENCL_H__
19 #define __STARPU_OPENCL_H__
20 
21 #include <starpu_config.h>
22 #ifdef STARPU_USE_OPENCL
23 #ifdef __APPLE__
24 #include <OpenCL/cl.h>
25 #else
26 #include <CL/cl.h>
27 #endif
28 #include <assert.h>
29 
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #endif
34 
35 const char *starpu_opencl_error_string(cl_int status);
36 void starpu_opencl_display_error(const char *func, const char *file, int line, const char *msg, cl_int status);
37 #define STARPU_OPENCL_DISPLAY_ERROR(status) \
38  starpu_opencl_display_error(__starpu_func__, __FILE__, __LINE__, NULL, status)
39 
40 static __starpu_inline void starpu_opencl_report_error(const char *func, const char *file, int line, const char *msg, cl_int status)
41 {
42  starpu_opencl_display_error(func, file, line, msg, status);
43  assert(0);
44 }
45 #define STARPU_OPENCL_REPORT_ERROR(status) \
46  starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, NULL, status)
47 
48 #define STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status) \
49  starpu_opencl_report_error(__starpu_func__, __FILE__, __LINE__, msg, status)
50 
52 {
54 };
55 
56 void starpu_opencl_get_context(int devid, cl_context *context);
57 void starpu_opencl_get_device(int devid, cl_device_id *device);
58 void starpu_opencl_get_queue(int devid, cl_command_queue *queue);
59 void starpu_opencl_get_current_context(cl_context *context);
60 void starpu_opencl_get_current_queue(cl_command_queue *queue);
61 
62 void starpu_opencl_load_program_source(const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source);
63 int starpu_opencl_compile_opencl_from_file(const char *source_file_name, const char *build_options);
64 int starpu_opencl_compile_opencl_from_string(const char *opencl_program_source, const char *file_name, const char *build_options);
65 
66 int starpu_opencl_load_binary_opencl(const char *kernel_id, struct starpu_opencl_program *opencl_programs);
67 
68 int starpu_opencl_load_opencl_from_file(const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options);
69 int starpu_opencl_load_opencl_from_string(const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options);
70 int starpu_opencl_unload_opencl(struct starpu_opencl_program *opencl_programs);
71 
72 int starpu_opencl_load_kernel(cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid);
73 int starpu_opencl_release_kernel(cl_kernel kernel);
74 
75 int starpu_opencl_collect_stats(cl_event event);
76 
77 int starpu_opencl_set_kernel_args(cl_int *err, cl_kernel *kernel, ...);
78 
79 cl_int starpu_opencl_allocate_memory(int devid, cl_mem *addr, size_t size, cl_mem_flags flags);
80 
81 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);
82 
83 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);
84 
85 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);
86 
87 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);
88 
89 #ifdef __cplusplus
90 }
91 #endif
92 
93 #endif /* STARPU_USE_OPENCL */
94 #endif /* __STARPU_OPENCL_H__ */
95 
starpu-1.1.5/doc/doxygen/html/sc__hypervisor__policy_8h_source.html0000644000373600000000000007435312571536757022613 00000000000000 StarPU Handbook: sc_hypervisor_policy.h Source File
sc_hypervisor_policy.h
Go to the documentation of this file.
1 /* StarPUf --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2012 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef SC_HYPERVISOR_POLICY_H
18 #define SC_HYPERVISOR_POLICY_H
19 
20 #include <sc_hypervisor.h>
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
27 
28 #define HYPERVISOR_REDIM_SAMPLE 0.02
29 #define HYPERVISOR_START_REDIM_SAMPLE 0.1
30 #define SC_NOTHING 0
31 #define SC_IDLE 1
32 #define SC_SPEED 2
33 
35 {
36  unsigned ncpus;
37  unsigned ncuda;
38  unsigned nw;
39 };
40 
42 {
43  struct starpu_codelet *cl;
44  uint32_t footprint;
45  unsigned sched_ctx_id;
46  unsigned long n;
47  size_t data_size;
49 };
50 
51 /* add task information to a task wrapper linked list */
52 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);
53 
54 /* remove task information from a task wrapper linked list */
55 void sc_hypervisor_policy_remove_task_from_pool(struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools);
56 
57 /* clone a task wrapper linked list */
58 struct sc_hypervisor_policy_task_pool* sc_hypervisor_policy_clone_task_pool(struct sc_hypervisor_policy_task_pool *tp);
59 
60 /* get the execution time of the submitted tasks out of starpu's calibration files */
61 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);
62 
63 /* find the context with the lowest priority in order to move some workers */
64 unsigned sc_hypervisor_find_lowest_prio_sched_ctx(unsigned req_sched_ctx, int nworkers_to_move);
65 
66 /* find the first most idle workers of a context*/
67 int* sc_hypervisor_get_idlest_workers(unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch);
68 
69 /* find the first most idle workers in a list */
70 int* sc_hypervisor_get_idlest_workers_in_list(int *start, int *workers, int nall_workers, int *nworkers, enum starpu_worker_archtype arch);
71 
72 /* find workers that can be moved from a context (if the constraints of min, max, etc allow this) */
73 int sc_hypervisor_get_movable_nworkers(struct sc_hypervisor_policy_config *config, unsigned sched_ctx, enum starpu_worker_archtype arch);
74 
75 /* compute how many workers should be moved from this context */
76 int sc_hypervisor_compute_nworkers_to_move(unsigned req_sched_ctx);
77 
78 /* check the policy's constraints in order to resize */
79 unsigned sc_hypervisor_policy_resize(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize, unsigned now);
80 
81 /* check the policy's constraints in order to resize and find a context willing the resources */
82 unsigned sc_hypervisor_policy_resize_to_unknown_receiver(unsigned sender_sched_ctx, unsigned now);
83 
84 /* compute the speed of a context */
85 double sc_hypervisor_get_ctx_speed(struct sc_hypervisor_wrapper* sc_w);
86 
87 /* get the time of execution of the slowest context */
88 double sc_hypervisor_get_slowest_ctx_exec_time(void);
89 
90 /* get the time of execution of the fastest context */
91 double sc_hypervisor_get_fastest_ctx_exec_time(void);
92 
93 /* compute the speed of a workers in a context */
94 double sc_hypervisor_get_speed_per_worker(struct sc_hypervisor_wrapper *sc_w, unsigned worker);
95 
96 /* compute the speed of a type of worker in a context */
97 double sc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch);
98 
99 /* compute the speed of a type of worker in a context depending on its history */
100 double sc_hypervisor_get_ref_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch);
101 
102 /* get the list of workers grouped by type */
103 void sc_hypervisor_group_workers_by_type(struct types_of_workers *tw, int *total_nw);
104 
105 /* get what type of worker corresponds to a certain index of types of workers */
106 enum starpu_worker_archtype sc_hypervisor_get_arch_for_index(unsigned w, struct types_of_workers *tw);
107 
108 /* get the index of types of workers corresponding to the type of workers indicated */
109 unsigned sc_hypervisor_get_index_for_arch(enum starpu_worker_archtype arch, struct types_of_workers *tw);
110 
111 /* check if we trigger resizing or not */
112 unsigned sc_hypervisor_criteria_fulfilled(unsigned sched_ctx, int worker);
113 
114 /* check if worker was idle long enough */
115 unsigned sc_hypervisor_check_idle(unsigned sched_ctx, int worker);
116 
117 /* check if there is a speed gap btw ctxs */
118 unsigned sc_hypervisor_check_speed_gap_btw_ctxs(void);
119 
120 /* check what triggers resizing (idle, speed, etc.)*/
121 unsigned sc_hypervisor_get_resize_criteria();
122 
123 /* load information concerning the type of workers into a types_of_workers struct */
124 struct types_of_workers* sc_hypervisor_get_types_of_workers(int *workers, unsigned nworkers);
125 
126 #ifdef __cplusplus
127 }
128 #endif
129 
130 #endif
starpu-1.1.5/doc/doxygen/html/BasicExamples.html0000644000373600000000000022557712571536761016601 00000000000000 StarPU Handbook: Basic Examples
Basic Examples

Hello World Using The C Extension

This section shows how to implement a simple program that submits a task to StarPU using the StarPU C extension (C Extensions). The complete example, and additional examples, is available in the directory gcc-plugin/examples of the StarPU distribution. A similar example showing how to directly use the StarPU's API is shown in Hello World Using StarPU's API.

GCC from version 4.5 permit to use the StarPU GCC plug-in (C Extensions). This makes writing a task both simpler and less error-prone. In a nutshell, all it takes is to declare a task, declare and define its implementations (for CPU, OpenCL, and/or CUDA), and invoke the task like a regular C function. The example below defines my_task which has a single implementation for CPU:

#include <stdio.h>
/* Task declaration. */
static void my_task (int x) __attribute__ ((task));
/* Definition of the CPU implementation of `my_task'. */
static void my_task (int x)
{
printf ("Hello, world! With x = %d\n", x);
}
int main ()
{
/* Initialize StarPU. */
#pragma starpu initialize
/* Do an asynchronous call to `my_task'. */
my_task (42);
/* Wait for the call to complete. */
#pragma starpu wait
/* Terminate. */
#pragma starpu shutdown
return 0;
}

The code can then be compiled and linked with GCC and the flag -fplugin:

$ gcc `pkg-config starpu-1.1 --cflags` hello-starpu.c \
    -fplugin=`pkg-config starpu-1.1 --variable=gccplugin` \
    `pkg-config starpu-1.1 --libs`

The code can also be compiled without the StarPU C extension and will behave as a normal sequential code.

$ gcc hello-starpu.c
hello-starpu.c:33:1: warning: ‘task’ attribute directive ignored [-Wattributes]
$ ./a.out
Hello, world! With x = 42

As can be seen above, the C extensions allows programmers to use StarPU tasks by essentially annotating ``regular'' C code.

Hello World Using StarPU's API

This section shows how to achieve the same result as in the previous section using StarPU's standard C API.

Required Headers

The header starpu.h should be included in any code using StarPU.

#include <starpu.h>

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 above.

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 the CPUs. When a CPU core will execute a codelet, it will call the function cpu_func, which must have the following prototype:

void (*cpu_func)(void *buffers[], void *cl_arg);

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.

void cpu_func(void *buffers[], void *cl_arg)
{
printf("Hello world\n");
}
struct starpu_codelet cl =
{
.nbuffers = 0
};

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 cannot be submitted after the termination of StarPU by a call to starpu_shutdown().

In the example above, a task structure is allocated by a call to starpu_task_create(). This function only allocates and fills the corresponding structure with the default settings, but it does not submit the task to StarPU.

The field starpu_task::cl is a pointer to the codelet which the task will execute: in other words, the codelet structure describes which computational kernel should be offloaded on the different architectures, and the task structure is a wrapper containing a codelet and the piece of data on which the codelet should operate.

If the field starpu_task::synchronous is non-zero, task submission will be synchronous: the function starpu_task_submit() will not return until the task has been executed. Note that the function starpu_shutdown() does not guarantee that asynchronous tasks have been executed before it returns, starpu_task_wait_for_all() can be used to that effect, or data can be unregistered (starpu_data_unregister()), which will implicitly wait for all the tasks scheduled to work on it, unless explicitly disabled thanks to starpu_data_set_default_sequential_consistency_flag() or starpu_data_set_sequential_consistency_flag().

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 */
/* terminate StarPU */
return 0;
}

Execution Of Hello World

$ make hello_world
cc $(pkg-config --cflags starpu-1.1) hello_world.c -o hello_world $(pkg-config --libs starpu-1.1)
$ ./hello_world
Hello world

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.

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);
}

As said before, the field starpu_codelet::nbuffers specifies the number of data buffers that are manipulated by the codelet. It does not count the argument — the parameter cl_arg of the function cpu_func — since it is not managed by our data management library, but just contains trivial parameters.

Be aware that this may be a pointer to a 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 Vector Scaling Using StarPU's API.

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 = &params;
task->cl_arg_size = sizeof(params);
/* starpu_task_submit will be a blocking call */
task->synchronous = 1;
/* submit the task to StarPU */
/* terminate StarPU */
return 0;
}
$ make hello_world
cc $(pkg-config --cflags starpu-1.1) hello_world.c -o hello_world $(pkg-config --libs starpu-1.1)
$ ./hello_world
Hello world (params = {1, 2.000000} )

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:

void (*callback_function)(void *);
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_arg = 0x42;
/* starpu_task_submit will be a blocking call */
task->synchronous = 1;
/* submit the task to StarPU */
/* terminate StarPU */
return 0;
}
$ make hello_world
cc $(pkg-config --cflags starpu-1.1) hello_world.c -o hello_world $(pkg-config --libs starpu-1.1)
$ ./hello_world
Hello world
Callback function (arg 42)

Where To Execute A Codelet

struct starpu_codelet cl =
{
.cpu_funcs = { cpu_func},
.cpu_funcs_name = { "cpu_func"},
.nbuffers = 0
};

We create a codelet which may only be executed on the CPUs. The optional field starpu_codelet::where is a bitmask that defines where the codelet may be executed. Here, the value STARPU_CPU means that only CPUs can execute this codelet. When the optional field starpu_codelet::where is unset, its value is automatically set based on the availability of the different fields XXX_funcs.

TODO: explain starpu_codelet::cpu_funcs_name

Vector Scaling Using the C Extension

The previous example has shown how to submit tasks. In this section, we show how StarPU tasks can manipulate data.

We will first show how to use the C language extensions provided by the GCC plug-in (C Extensions). The complete example, and additional examples, is available in the directory gcc-plugin/examples of the StarPU distribution. These extensions map directly to StarPU's main concepts: tasks, task implementations for CPU, OpenCL, or CUDA, and registered data buffers. The standard C version that uses StarPU's standard C programming interface is given in Vector Scaling Using StarPU's API.

First of all, the vector-scaling task and its simple CPU implementation has to be defined:

/* Declare the `vector_scal' task. */
static void vector_scal (unsigned size, float vector[size],
float factor)
__attribute__ ((task));
/* Define the standard CPU implementation. */
static void
vector_scal (unsigned size, float vector[size], float factor)
{
unsigned i;
for (i = 0; i < size; i++)
vector[i] *= factor;
}

Next, the body of the program, which uses the task defined above, can be implemented:

int main (void)
{
#pragma starpu initialize
#define NX 0x100000
#define FACTOR 3.14
{
float vector[NX]
__attribute__ ((heap_allocated, registered));
size_t i;
for (i = 0; i < NX; i++)
vector[i] = (float) i;
vector_scal (NX, vector, FACTOR);
#pragma starpu wait
} /* VECTOR is automatically freed here. */
#pragma starpu shutdown
return valid ? EXIT_SUCCESS : EXIT_FAILURE;
}

The function main above does several things:

  • It initializes StarPU.
  • It allocates vector in the heap; it will automatically be freed when its scope is left. Alternatively, good old malloc and free could have been used, but they are more error-prone and require more typing.
  • It registers the memory pointed to by vector. Eventually, when OpenCL or CUDA task implementations are added, this will allow StarPU to transfer that memory region between GPUs and the main memory. Removing this pragma is an error.
  • It invokes the task vector_scal. The invocation looks the same as a standard C function call. However, it is an asynchronous invocation, meaning that the actual call is performed in parallel with the caller's continuation.
  • It waits for the termination of the asynchronous call vector_scal.
  • Finally, StarPU is shut down.

The program can be compiled and linked with GCC and the flag -fplugin:

$ gcc `pkg-config starpu-1.1 --cflags` vector_scal.c 
    -fplugin=`pkg-config starpu-1.1 --variable=gccplugin` 
    `pkg-config starpu-1.1 --libs`

And voilà!

Adding an OpenCL Task Implementation

Now, this is all fine and great, but you certainly want to take advantage of these newfangled GPUs that your lab just bought, don't you?

So, let's add an OpenCL implementation of the task vector_scal. We assume that the OpenCL kernel is available in a file, vector_scal_opencl_kernel.cl, not shown here. The OpenCL task implementation is similar to that used with the standard C API (Definition of the OpenCL Kernel). It is declared and defined in our C file like this:

/* The OpenCL programs, loaded from 'main' (see below). */
static struct starpu_opencl_program cl_programs;
static void vector_scal_opencl (unsigned size, float vector[size],
float factor)
__attribute__ ((task_implementation ("opencl", vector_scal)));
static void
vector_scal_opencl (unsigned size, float vector[size], float factor)
{
int id, devid, err;
cl_kernel kernel;
cl_command_queue queue;
cl_event event;
/* VECTOR is GPU memory pointer, not a main memory pointer. */
cl_mem val = (cl_mem) vector;
/* Prepare to invoke the kernel. In the future, this will be largely automated. */
err = starpu_opencl_load_kernel (&kernel, &queue, &cl_programs,
"vector_mult_opencl", devid);
if (err != CL_SUCCESS)
err = clSetKernelArg (kernel, 0, sizeof (size), &size);
err |= clSetKernelArg (kernel, 1, sizeof (val), &val);
err |= clSetKernelArg (kernel, 2, sizeof (factor), &factor);
if (err)
size_t global = 1, local = 1;
err = clEnqueueNDRangeKernel (queue, kernel, 1, NULL, &global,
&local, 0, NULL, &event);
if (err != CL_SUCCESS)
clFinish (queue);
clReleaseEvent (event);
/* Done with KERNEL. */
}

The OpenCL kernel itself must be loaded from main, sometime after the pragma initialize:

starpu_opencl_load_opencl_from_file ("vector_scal_opencl_kernel.cl",
&cl_programs, "");

And that's it. The task vector_scal now has an additional implementation, for OpenCL, which StarPU's scheduler may choose to use at run-time. Unfortunately, the vector_scal_opencl above still has to go through the common OpenCL boilerplate; in the future, additional extensions will automate most of it.

Adding a CUDA Task Implementation

Adding a CUDA implementation of the task is very similar, except that the implementation itself is typically written in CUDA, and compiled with nvcc. Thus, the C file only needs to contain an external declaration for the task implementation:

extern void vector_scal_cuda (unsigned size, float vector[size],
float factor)
__attribute__ ((task_implementation ("cuda", vector_scal)));

The actual implementation of the CUDA task goes into a separate compilation unit, in a .cu file. It is very close to the implementation when using StarPU's standard C API (Definition of the CUDA Kernel).

/* CUDA implementation of the `vector_scal' task, to be compiled with `nvcc'. */
#include <starpu.h>
#include <stdlib.h>
static __global__ void
vector_mult_cuda (unsigned n, float *val, float factor)
{
unsigned i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n)
val[i] *= factor;
}
/* Definition of the task implementation declared in the C file. */
extern "C" void
vector_scal_cuda (size_t size, float vector[], float factor)
{
unsigned threads_per_block = 64;
unsigned nblocks = (size + threads_per_block - 1) / threads_per_block;
vector_mult_cuda <<< nblocks, threads_per_block, 0,
starpu_cuda_get_local_stream () >>> (size, vector, factor);
cudaStreamSynchronize (starpu_cuda_get_local_stream ());
}

The complete source code, in the directory gcc-plugin/examples/vector_scal of the StarPU distribution, also shows how an SSE-specialized CPU task implementation can be added.

For more details on the C extensions provided by StarPU's GCC plug-in, see C Extensions.

Vector Scaling Using StarPU's API

This section shows how to achieve the same result as explained in the previous section using StarPU's standard C API.

The full source code for this example is given in Full source code for the ’Scaling a Vector’ example.

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:

float vector[NX];
starpu_data_handle_t vector_handle;
starpu_vector_data_register(&vector_handle, 0, (uintptr_t)vector, NX,
sizeof(vector[0]));

The first argument, called the data handle, is an opaque pointer which designates the array in 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 0 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.

float factor = 3.14;
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;

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:

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},
.nbuffers = 1,
.modes = { STARPU_RW }
};

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.

Execution of Vector Scaling

$ make vector_scal
cc $(pkg-config --cflags starpu-1.1) vector_scal.c -o vector_scal $(pkg-config --libs starpu-1.1)
$ ./vector_scal
0.000000 3.000000 6.000000 9.000000 12.000000

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.

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.

#include <starpu.h>
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<<<nblocks,threads_per_block, 0, starpu_cuda_get_local_stream()>>>
(n, val, *factor);
cudaStreamSynchronize(starpu_cuda_get_local_stream());
}

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.

__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;
}
}

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 Partitioning Data.

#include <starpu.h>
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 */
err = starpu_opencl_load_kernel(&kernel, &queue,
"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);
}
{ /* OpenCL specific code */
size_t global=n;
size_t local;
size_t s;
cl_device_id device;
starpu_opencl_get_device(devid, &device);
err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE,
sizeof(local), &local, &s);
if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
if (local > global) local=global;
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0,
NULL, &event);
if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
}
{ /* OpenCL specific code */
clFinish(queue);
clReleaseEvent(event);
}
}

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.

/*
* 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 <starpu.h>
#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 = {
/* CPU implementation of the codelet */
.cpu_funcs = { 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
#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
"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: 0 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, 0, (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 does not need to manipulate the array anymore so we can stop
* monitoring it */
starpu_data_unregister(vector_handle);
#ifdef STARPU_USE_OPENCL
#endif
/* terminate StarPU, no task can be submitted after */
fprintf(stderr, "AFTER First element is %f\n", vector[0]);
return 0;
}

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().

CFLAGS  += $(shell pkg-config --cflags starpu-1.1)
LDFLAGS += $(shell pkg-config --libs starpu-1.1)
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
$ make

and to execute it, with the default configuration:

$ ./vector_scal
0.000000 3.000000 6.000000 9.000000 12.000000

or for example, by disabling CPU devices:

$ STARPU_NCPU=0 ./vector_scal
0.000000 3.000000 6.000000 9.000000 12.000000

or by disabling CUDA devices (which may permit to enable the use of OpenCL, see Enabling OpenCL) :

$ STARPU_NCUDA=0 ./vector_scal
0.000000 3.000000 6.000000 9.000000 12.000000
starpu-1.1.5/doc/doxygen/html/sync_on.png0000644000373600000000000000151512571536757015336 00000000000000PNG  IHDRw=IDATx_HTY8i4-g6&kQ)!0URKڅ/PE>K-+K.YdEPaAZSܝ;3wgfsWK.Da'q_k DQCg 0Y:qZ)~L0HV z-C%g68%wUϿ }? ?3 K@h aaUe s~2&&B*Alji*˨,oƣT,d[3-*> LɟfkҠw#*AEjKUy>&{8m5Ki jjD*Nigw7DmzK۾M!k?o_lX#~XӑR*EՂדE;6e"Q(=Ezæ5Kؼָ_ 1zBJ X96jL^7{J1i@%8'7M_\Q#Uy Wo x8sv|Sn q_m >b[JX,4[T{Ratjjzz'ȶiIws KC^Y%6ꈺ]vhiWvh'̂|[^YrD= StarPU Handbook: starpu_driver.h File Reference
starpu_driver.h File Reference
#include <starpu_config.h>
#include <starpu_opencl.h>

Go to the source code of this file.

Data Structures

struct  starpu_driver
union  starpu_driver.id

Functions

int starpu_driver_run (struct starpu_driver *d)
void starpu_drivers_request_termination (void)
int starpu_driver_init (struct starpu_driver *d)
int starpu_driver_run_once (struct starpu_driver *d)
int starpu_driver_deinit (struct starpu_driver *d)

Detailed Description

starpu-1.1.5/doc/doxygen/html/functions_0x63.html0000644000373600000000000003160312571536763016634 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- c -

starpu-1.1.5/doc/doxygen/html/group__API__MPI__Support.html0000644000373600000000000020453312571536763020573 00000000000000 StarPU Handbook: MPI Support
StarPU Handbook
MPI Support

Initialisation

#define STARPU_USE_MPI
int starpu_mpi_init (int *argc, char ***argv, int initialize_mpi)
int starpu_mpi_initialize (void)
int starpu_mpi_initialize_extended (int *rank, int *world_size)
int starpu_mpi_shutdown (void)
void starpu_mpi_comm_amounts_retrieve (size_t *comm_amounts)

Communication

int starpu_mpi_send (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm)
int starpu_mpi_recv (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status)
int starpu_mpi_isend (starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm)
int starpu_mpi_irecv (starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm)
int starpu_mpi_isend_detached (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void(*callback)(void *), void *arg)
int starpu_mpi_irecv_detached (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void(*callback)(void *), void *arg)
int starpu_mpi_issend (starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm)
int starpu_mpi_wait (starpu_mpi_req *req, MPI_Status *status)
int starpu_mpi_test (starpu_mpi_req *req, int *flag, MPI_Status *status)
int starpu_mpi_barrier (MPI_Comm comm)
int starpu_mpi_isend_detached_unlock_tag (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag)
int starpu_mpi_irecv_detached_unlock_tag (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag)
int starpu_mpi_isend_array_detached_unlock_tag (unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag)
int starpu_mpi_irecv_array_detached_unlock_tag (unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag)

Communication Cache

int starpu_mpi_cache_is_enabled ()
int starpu_mpi_cache_set (int enabled)
void starpu_mpi_cache_flush (MPI_Comm comm, starpu_data_handle_t data_handle)
void starpu_mpi_cache_flush_all_data (MPI_Comm comm)

MPI Insert Task

#define STARPU_EXECUTE_ON_NODE
#define STARPU_EXECUTE_ON_DATA
void starpu_mpi_data_register_comm (starpu_data_handle_t data_handle, int tag, int rank, MPI_Comm comm)
int starpu_mpi_data_get_rank (starpu_data_handle_t handle)
int starpu_mpi_data_get_tag (starpu_data_handle_t handle)
int starpu_mpi_insert_task (MPI_Comm comm, struct starpu_codelet *codelet,...)
void starpu_mpi_get_data_on_node (MPI_Comm comm, starpu_data_handle_t data_handle, int node)
void starpu_mpi_get_data_on_node_detached (MPI_Comm comm, starpu_data_handle_t data_handle, int node, void(*callback)(void *), void *arg)

Collective Operations

void starpu_mpi_redux_data (MPI_Comm comm, starpu_data_handle_t data_handle)
int starpu_mpi_scatter_detached (starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void(*scallback)(void *), void *sarg, void(*rcallback)(void *), void *rarg)
int starpu_mpi_gather_detached (starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void(*scallback)(void *), void *sarg, void(*rcallback)(void *), void *rarg)

Detailed Description

Macro Definition Documentation

#define STARPU_USE_MPI

This macro is defined when StarPU has been installed with MPI support. It should be used in your code to detect the availability of MPI.

#define STARPU_EXECUTE_ON_NODE

this macro is used when calling starpu_mpi_insert_task(), and must be followed by a integer value which specified the node on which to execute the codelet.

#define STARPU_EXECUTE_ON_DATA

this macro is used when calling starpu_mpi_insert_task(), and must be followed by a data handle to specify that the node owning the given data will execute the codelet.

Function Documentation

int starpu_mpi_init ( int *  argc,
char ***  argv,
int  initialize_mpi 
)

Initializes the starpumpi library. initialize_mpi indicates if MPI should be initialized or not by StarPU. If the value is not 0, MPI will be initialized by calling MPI_Init_Thread(argc, argv, MPI_THREAD_SERIALIZED, ...).

int starpu_mpi_initialize ( void  )
Deprecated:
This function has been made deprecated. One should use instead the function starpu_mpi_init(). This function does not call MPI_Init(), it should be called beforehand.
int starpu_mpi_initialize_extended ( int *  rank,
int *  world_size 
)
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_shutdown ( void  )

Cleans the starpumpi library. This must be called between calling starpu_mpi functions and starpu_shutdown(). MPI_Finalize() will be called if StarPU-MPI has been initialized by starpu_mpi_init().

void starpu_mpi_comm_amounts_retrieve ( size_t *  comm_amounts)

Retrieve the current amount of communications from the current node in the array comm_amounts which must have a size greater or equal to the world size. Communications statistics must be enabled (see STARPU_COMM_STATS).

int starpu_mpi_send ( starpu_data_handle_t  data_handle,
int  dest,
int  mpi_tag,
MPI_Comm  comm 
)

Performs a standard-mode, blocking send of data_handle to the node dest using the message tag mpi_tag within the communicator comm.

int starpu_mpi_recv ( starpu_data_handle_t  data_handle,
int  source,
int  mpi_tag,
MPI_Comm  comm,
MPI_Status *  status 
)

Performs a standard-mode, blocking receive in data_handle from the node source using the message tag mpi_tag within the communicator comm.

int starpu_mpi_isend ( starpu_data_handle_t  data_handle,
starpu_mpi_req *  req,
int  dest,
int  mpi_tag,
MPI_Comm  comm 
)

Posts a standard-mode, non blocking send of data_handle to the node dest using the message tag mpi_tag within the communicator comm. After the call, the pointer to the request 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,
int  mpi_tag,
MPI_Comm  comm 
)

Posts a nonblocking receive in data_handle from the node source using the message tag mpi_tag within the communicator comm. After the call, the pointer to the request req can be used to test or to wait for the completion of the communication.

int starpu_mpi_isend_detached ( starpu_data_handle_t  data_handle,
int  dest,
int  mpi_tag,
MPI_Comm  comm,
void(*)(void *)  callback,
void *  arg 
)

Posts a standard-mode, non blocking send of data_handle to the node dest using the message tag mpi_tag within the communicator comm. On completion, the callback function is called with the argument 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,
int  mpi_tag,
MPI_Comm  comm,
void(*)(void *)  callback,
void *  arg 
)

Posts a nonblocking receive in data_handle from the node source using the message tag mpi_tag within the communicator comm. On completion, the callback function is called with the argument 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 ( starpu_data_handle_t  data_handle,
starpu_mpi_req *  req,
int  dest,
int  mpi_tag,
MPI_Comm  comm 
)

Performs a synchronous-mode, non-blocking send of data_handle to the node dest using the message tag mpi_tag within the communicator comm.

int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg)

Performs a synchronous-mode, non-blocking send of data_handle to the node dest using the message tag mpi_tag within the communicator comm. On completion, the callback function is called with the argument 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_wait ( starpu_mpi_req *  req,
MPI_Status *  status 
)

Returns when the operation identified by request req is complete.

int starpu_mpi_test ( starpu_mpi_req *  req,
int *  flag,
MPI_Status *  status 
)

If the operation identified by req is complete, set flag to 1. The status object is set to contain information on the completed operation.

int starpu_mpi_barrier ( MPI_Comm  comm)

Blocks the caller until all group members of the communicator comm have called it.

int starpu_mpi_isend_detached_unlock_tag ( starpu_data_handle_t  data_handle,
int  dest,
int  mpi_tag,
MPI_Comm  comm,
starpu_tag_t  tag 
)

Posts a standard-mode, non blocking send of data_handle to the node dest using the message tag mpi_tag within the communicator comm. On completion, tag is unlocked.

int starpu_mpi_irecv_detached_unlock_tag ( starpu_data_handle_t  data_handle,
int  source,
int  mpi_tag,
MPI_Comm  comm,
starpu_tag_t  tag 
)

Posts a nonblocking receive in data_handle from the node source using the message tag mpi_tag within the communicator comm. On completion, tag is unlocked.

int starpu_mpi_isend_array_detached_unlock_tag ( unsigned  array_size,
starpu_data_handle_t data_handle,
int *  dest,
int *  mpi_tag,
MPI_Comm *  comm,
starpu_tag_t  tag 
)

Posts array_size standard-mode, non blocking send. Each post sends the n-th data of the array data_handle to the n-th node of the array dest using the n-th message tag of the array mpi_tag within the n-th communicator of the array comm. On completion of the all the requests, tag is unlocked.

int starpu_mpi_irecv_array_detached_unlock_tag ( unsigned  array_size,
starpu_data_handle_t data_handle,
int *  source,
int *  mpi_tag,
MPI_Comm *  comm,
starpu_tag_t  tag 
)

Posts array_size nonblocking receive. Each post receives in the n-th data of the array data_handle from the n-th node of the array source using the n-th message tag of the array mpi_tag within the n-th communicator of the array comm. On completion of the all the requests, tag is unlocked.

int starpu_mpi_cache_is_enabled ( )

Return 1 if the communication cache is enabled, 0 otherwise

int starpu_mpi_cache_set ( int  enabled)

If enabled is 1, enable the communication cache. Otherwise, clean the cache if it was enabled and disable it.

void starpu_mpi_cache_flush ( MPI_Comm  comm,
starpu_data_handle_t  data_handle 
)

Clear the send and receive communication cache for the data data_handle and invalidate the value. The function has to be called synchronously by all the MPI nodes. The function does nothing if the cache mechanism is disabled (see STARPU_MPI_CACHE).

void starpu_mpi_cache_flush_all_data ( MPI_Comm  comm)

Clear the send and receive communication cache for all data and invalidate their values. The function has to be called synchronously by all the MPI nodes. The function does nothing if the cache mechanism is disabled (see STARPU_MPI_CACHE).

int starpu_mpi_data_register_comm ( starpu_data_handle_t  handle,
int  tag,
int  rank,
MPI_Comm  comm 
)

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.

int starpu_mpi_data_get_rank ( starpu_data_handle_t  handle)

Return the rank of the given data.

int starpu_mpi_data_get_tag ( starpu_data_handle_t  handle)

Return the tag of the given data.

int starpu_mpi_insert_task ( MPI_Comm  comm,
struct starpu_codelet codelet,
  ... 
)

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_insert_task(). 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 node, the one selected will be the one having the least data in R mode so as to minimize the amount of data to be transfered;
    • 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 STARPU_MPI_CACHE).

void starpu_mpi_get_data_on_node ( MPI_Comm  comm,
starpu_data_handle_t  data_handle,
int  node 
)

Transfer data data_handle to MPI node 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_detached ( MPI_Comm  comm,
starpu_data_handle_t  data_handle,
int  node,
void(*)(void *)  callback,
void *  arg 
)

Transfer data data_handle to MPI node node, sending it from its owner if needed. At least the target node and the owner have to call the function. On reception, the callback function is called with the argument arg.

void starpu_mpi_redux_data ( MPI_Comm  comm,
starpu_data_handle_t  data_handle 
)

Perform a reduction on the given data. All nodes send the data to its owner node which will perform a reduction.

int starpu_mpi_scatter_detached ( starpu_data_handle_t data_handles,
int  count,
int  root,
MPI_Comm  comm,
void(*)(void *)  scallback,
void *  sarg,
void(*)(void *)  rcallback,
void *  rarg 
)

Scatter data among processes of the communicator based on the ownership of the data. For each data of the array data_handles, the process 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 scallback function is called with the argument sarg on the process root, the rcallback function is called with the argument rarg on any other process.

int starpu_mpi_gather_detached ( starpu_data_handle_t data_handles,
int  count,
int  root,
MPI_Comm  comm,
void(*)(void *)  scallback,
void *  sarg,
void(*)(void *)  rcallback,
void *  rarg 
)

Gather data from the different processes of the communicator onto the process root. Each process owning data handle in the array data_handles will send them to the process root. The process root must have valid data handles to receive the data. On completion of the collective communication, the rcallback function is called with the argument rarg on the process root, the scallback function is called with the argument sarg on any other process.

starpu-1.1.5/doc/doxygen/html/functions_0x67.html0000644000373600000000000001731212571536763016641 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- g -

starpu-1.1.5/doc/doxygen/html/functions_0x76.html0000644000373600000000000001643512571536763016646 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- v -

starpu-1.1.5/doc/doxygen/html/ftv2folderopen.png0000644000373600000000000000112512571536757016622 00000000000000PNG  IHDR}\IDATx]?oP9i4i;iiZ7`b٬,HU'$*T]TDP6w};C; aӝߟjAInS}9Hӎ|? =_Ɗue*;YEsYBėsٌ ɫYq !Gǿv̇خ F}qb]70)d-}PfY{4@}2ԗNIǃc%UImcƝ>xt9$ OVE*Û#׈r@l$PrHaa dZrqIoT\,tj2FAxv-Lp׌p TI/ \sf; jViTo^cpb]€<a՜y9:+,E f6NEKU}^;nZuUS4 ѬbN.kjT% iV )GJ@TxIENDB`starpu-1.1.5/doc/doxygen/html/globals_type.html0000644000373600000000000001430112571536763016524 00000000000000 StarPU Handbook: Globals
StarPU Handbook
 
starpu-1.1.5/doc/doxygen/html/starpu__cuda_8h.html0000644000373600000000000002106612571536757017121 00000000000000 StarPU Handbook: starpu_cuda.h File Reference
starpu_cuda.h File Reference
#include <starpu_config.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cuda_runtime_api.h>

Go to the source code of this file.

Macros

#define STARPU_CUBLAS_REPORT_ERROR(status)
#define STARPU_CUDA_REPORT_ERROR(status)

Functions

void starpu_cublas_report_error (const char *func, const char *file, int line, int status)
void starpu_cuda_report_error (const char *func, const char *file, int line, cudaError_t status)
cudaStream_t starpu_cuda_get_local_stream (void)
struct cudaDeviceProp * starpu_cuda_get_device_properties (unsigned workerid)
int starpu_cuda_copy_async_sync (void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t ssize, cudaStream_t stream, enum cudaMemcpyKind kind)
void starpu_cuda_set_device (unsigned devid)

Detailed Description

starpu-1.1.5/doc/doxygen/html/functions_vars_0x6d.html0000644000373600000000000002216612571536763017754 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/ftv2doc.png0000644000373600000000000000135212571536757015234 00000000000000PNG  IHDR}\IDATxMOS[sa?-XZ(PD4 AWbu`b 77wHFCԁ/`voAPqP@ 980 +y^Z9SW\83g3'Nçl_bpV"ֆXd]3xM[1W *PGz/Eg{ aoV:这1$RW,@56-,m/蹖 r5T*S(Vf89u գwa=<{ҡUr+dDF$`zNܮ0Q3~_^N=vpTLT}kqm<?ZhX_ݥ[) `ga_*2`'=F2EP l=8Wv%THqɿ<"GxH{#֫aJmKsVءM^ T ݛr߽m_?Wİ#uIENDB`starpu-1.1.5/doc/doxygen/html/group__API__Explicit__Dependencies.html0000644000373600000000000005416712571536763022647 00000000000000 StarPU Handbook: Explicit Dependencies
StarPU Handbook
Explicit Dependencies

Typedefs

typedef uint64_t starpu_tag_t

Functions

void starpu_task_declare_deps_array (struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[])
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)
int starpu_tag_wait (starpu_tag_t id)
int starpu_tag_wait_array (unsigned ntags, starpu_tag_t *id)
void starpu_tag_restart (starpu_tag_t id)
void starpu_tag_remove (starpu_tag_t id)
void starpu_tag_notify_from_apps (starpu_tag_t id)

Detailed Description

Typedef Documentation

This type defines a task logical identifer. It is possible to associate a task with a unique tag chosen by the application, and to express dependencies between tasks by the means of those tags. To do so, fill the field starpu_task::tag_id with a tag number (can be arbitrary) and set the field starpu_task::use_tag to 1. If starpu_tag_declare_deps() is called with this tag number, the task will not be started until the tasks which holds the declared dependency tags are completed.

Function Documentation

void starpu_task_declare_deps_array ( struct starpu_task task,
unsigned  ndeps,
struct starpu_task task_array[] 
)

Declare task dependencies between a task and an array of tasks of length 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 task_array that is no longer a valid task results in an undefined behaviour. If 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_tag_declare_deps ( starpu_tag_t  id,
unsigned  ndeps,
  ... 
)

Specify the dependencies of the task identified by tag id. The first argument specifies the tag which is configured, the second argument gives the number of tag(s) on which 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.

/* Tag 0x1 depends on tags 0x32 and 0x52 */
void starpu_tag_declare_deps_array ( starpu_tag_t  id,
unsigned  ndeps,
starpu_tag_t array 
)

This function is similar to starpu_tag_declare_deps(), except that its does not take a variable number of arguments but an array of tags of size ndeps.

/* Tag 0x1 depends on tags 0x32 and 0x52 */
starpu_tag_t tag_array[2] = {0x32, 0x52};
int starpu_tag_wait ( starpu_tag_t  id)

This function blocks until the task associated to tag 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_array ( unsigned  ntags,
starpu_tag_t id 
)

This function is similar to starpu_tag_wait() except that it blocks until all the ntags tags contained in the array id are terminated.

void starpu_tag_restart ( starpu_tag_t  id)

This function can be used to clear the already notified status of a tag which is not associated with a task. Before that, calling starpu_tag_notify_from_apps() again will not notify the successors. After that, the next call to starpu_tag_notify_from_apps() will notify the successors.

void starpu_tag_remove ( starpu_tag_t  id)

This function releases the resources associated to tag 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_notify_from_apps ( starpu_tag_t  id)

This function explicitly unlocks tag id. It may be useful in the case of applications which execute part of their computation outside StarPU tasks (e.g. third-party libraries). It is also provided as a convenient tool for the programmer, for instance to entirely construct the task DAG before actually giving StarPU the opportunity to execute the tasks. When called several times on the same tag, notification will be done only on first call, thus implementing "OR" dependencies, until the tag is restarted using starpu_tag_restart().

starpu-1.1.5/doc/doxygen/html/starpu__expert_8h_source.html0000644000373600000000000002545512571536757021102 00000000000000 StarPU Handbook: starpu_expert.h Source File
starpu_expert.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010, 2011 Centre National de la Recherche Scientifique
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef __STARPU_EXPERT_H__
18 #define __STARPU_EXPERT_H__
19 
20 #include <starpu.h>
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
28 
29 int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg);
30 void starpu_progression_hook_deregister(int hook_id);
31 
32 #ifdef __cplusplus
33 }
34 #endif
35 
36 #endif /* __STARPU_H__ */
starpu-1.1.5/doc/doxygen/html/distrib_data_histo.png0000644000373600000000000002301712571536762017522 00000000000000PNG  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.1.5/doc/doxygen/html/functions_0x6c.html0000644000373600000000000001662712571536763016725 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- l -

starpu-1.1.5/doc/doxygen/html/ftv2blank.png0000644000373600000000000000012612571536757015554 00000000000000PNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`starpu-1.1.5/doc/doxygen/html/starpu__sched__ctx_8h_source.html0000644000373600000000000006755612571536757021706 00000000000000 StarPU Handbook: starpu_sched_ctx.h Source File
starpu_sched_ctx.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010 - 2012 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef __STARPU_SCHED_CTX_H__
18 #define __STARPU_SCHED_CTX_H__
19 
20 #include <starpu.h>
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
27 #define STARPU_SCHED_CTX_POLICY_NAME (1<<16)
28 #define STARPU_SCHED_CTX_POLICY_STRUCT (2<<16)
29 #define STARPU_SCHED_CTX_POLICY_MIN_PRIO (3<<16)
30 #define STARPU_SCHED_CTX_POLICY_MAX_PRIO (4<<16)
31 
32 unsigned starpu_sched_ctx_create(int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name, ...);
33 
34 unsigned starpu_sched_ctx_create_inside_interval(const char *policy_name, const char *sched_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap);
35 
36 void starpu_sched_ctx_register_close_callback(unsigned sched_ctx_id, void (*close_callback)(unsigned sched_ctx_id, void* args), void *args);
37 
38 void starpu_sched_ctx_add_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id);
39 
40 void starpu_sched_ctx_remove_workers(int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id);
41 
42 void starpu_sched_ctx_delete(unsigned sched_ctx_id);
43 
44 void starpu_sched_ctx_set_inheritor(unsigned sched_ctx_id, unsigned inheritor);
45 
46 void starpu_sched_ctx_set_context(unsigned *sched_ctx_id);
47 
48 unsigned starpu_sched_ctx_get_context(void);
49 
51 
52 void starpu_sched_ctx_finished_submit(unsigned sched_ctx_id);
53 
54 unsigned starpu_sched_ctx_get_workers_list(unsigned sched_ctx_id, int **workerids);
55 
56 unsigned starpu_sched_ctx_get_nworkers(unsigned sched_ctx_id);
57 
58 unsigned starpu_sched_ctx_get_nshared_workers(unsigned sched_ctx_id, unsigned sched_ctx_id2);
59 
60 unsigned starpu_sched_ctx_contains_worker(int workerid, unsigned sched_ctx_id);
61 
62 unsigned starpu_sched_ctx_contains_type_of_worker(enum starpu_worker_archtype arch, unsigned sched_ctx_id);
63 
64 unsigned starpu_sched_ctx_worker_get_id(unsigned sched_ctx_id);
65 
66 unsigned starpu_sched_ctx_overlapping_ctxs_on_worker(int workerid);
67 
69 
71 
72 int starpu_sched_set_min_priority(int min_prio);
73 
74 int starpu_sched_set_max_priority(int max_prio);
75 
76 int starpu_sched_ctx_get_min_priority(unsigned sched_ctx_id);
77 
78 int starpu_sched_ctx_get_max_priority(unsigned sched_ctx_id);
79 
80 int starpu_sched_ctx_set_min_priority(unsigned sched_ctx_id, int min_prio);
81 
82 int starpu_sched_ctx_set_max_priority(unsigned sched_ctx_id, int max_prio);
83 
84 int starpu_sched_ctx_min_priority_is_set(unsigned sched_ctx_id);
85 
86 int starpu_sched_ctx_max_priority_is_set(unsigned sched_ctx_id);
87 
88 #define STARPU_MIN_PRIO (starpu_sched_get_min_priority())
89 #define STARPU_MAX_PRIO (starpu_sched_get_max_priority())
90 
91 #define STARPU_DEFAULT_PRIO 0
92 
94 
95 void starpu_sched_ctx_delete_worker_collection(unsigned sched_ctx_id);
96 
98 
99 void starpu_sched_ctx_set_policy_data(unsigned sched_ctx_id, void *policy_data);
100 
101 void *starpu_sched_ctx_get_policy_data(unsigned sched_ctx_id);
102 
103 int starpu_sched_ctx_get_nready_tasks(unsigned sched_ctx_id);
104 
105 double starpu_sched_ctx_get_nready_flops(unsigned sched_ctx_id);
106 
107 #ifdef STARPU_USE_SC_HYPERVISOR
108 void starpu_sched_ctx_call_pushed_task_cb(int workerid, unsigned sched_ctx_id);
109 #endif /* STARPU_USE_SC_HYPERVISOR */
110 
111 #ifdef __cplusplus
112 }
113 #endif
114 
115 #endif /* __STARPU_SCHED_CTX_H__ */
starpu-1.1.5/doc/doxygen/html/functions_0x74.html0000644000373600000000000002206312571536763016636 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- t -

starpu-1.1.5/doc/doxygen/html/sc__hypervisor__lp_8h.html0000644000373600000000000002310312571536757020332 00000000000000 StarPU Handbook: sc_hypervisor_lp.h File Reference
sc_hypervisor_lp.h File Reference
#include <sc_hypervisor.h>
#include <starpu_config.h>

Go to the source code of this file.

Functions

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)
double sc_hypervisor_lp_get_tmax (int nw, int *workers)
void sc_hypervisor_lp_round_double_to_int (int ns, int nw, double res[ns][nw], int res_rounded[ns][nw])
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)
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)
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)
void sc_hypervisor_lp_share_remaining_resources (int ns, unsigned *sched_ctxs, int nworkers, int *workers)
double sc_hypervisor_lp_find_tmax (double t1, double t2)
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))

Detailed Description

starpu-1.1.5/doc/doxygen/html/functions_0x72.html0000644000373600000000000002360512571536763016637 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- r -

starpu-1.1.5/doc/doxygen/html/group__API__Parallel__Tasks.html0000644000373600000000000003677612571536763021327 00000000000000 StarPU Handbook: Parallel Tasks
StarPU Handbook
Parallel Tasks

Functions

int starpu_combined_worker_get_size (void)
int starpu_combined_worker_get_rank (void)
unsigned starpu_combined_worker_get_count (void)
int starpu_combined_worker_get_id (void)
int starpu_combined_worker_assign_workerid (int nworkers, int workerid_array[])
int starpu_combined_worker_get_description (int workerid, int *worker_size, int **combined_workerid)
int starpu_combined_worker_can_execute_task (unsigned workerid, struct starpu_task *task, unsigned nimpl)
void starpu_parallel_task_barrier_init (struct starpu_task *task, int workerid)
void starpu_parallel_task_barrier_init_n (struct starpu_task *task, int worker_size)

Detailed Description

Function Documentation

int starpu_combined_worker_get_size ( 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_rank ( void  )

Return the rank of the current thread within the combined worker. Can only be used in STARPU_FORKJOIN parallel tasks, to know which part of the task to work on.

unsigned starpu_combined_worker_get_count ( void  )

Return the number of different combined workers.

int starpu_combined_worker_get_id ( void  )

Return the identifier of the current combined worker.

int starpu_combined_worker_assign_workerid ( int  nworkers,
int  workerid_array[] 
)

Register a new combined worker and get its identifier

int starpu_combined_worker_get_description ( int  workerid,
int *  worker_size,
int **  combined_workerid 
)

Get the description of a combined worker

int starpu_combined_worker_can_execute_task ( unsigned  workerid,
struct starpu_task task,
unsigned  nimpl 
)

Variant of starpu_worker_can_execute_task() compatible with combined workers

void starpu_parallel_task_barrier_init ( struct starpu_task task,
int  workerid 
)

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_n ( struct starpu_task task,
int  worker_size 
)

Initialise the barrier for the parallel task, to be pushed to worker_size workers (without having to explicit a given combined worker).

starpu-1.1.5/doc/doxygen/html/functions_vars_0x75.html0000644000373600000000000001753712571536763017704 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- u -

starpu-1.1.5/doc/doxygen/html/globals_eval.html0000644000373600000000000003765312571536763016511 00000000000000 StarPU Handbook: Globals
StarPU Handbook
 

- s -

- t -

starpu-1.1.5/doc/doxygen/html/functions_vars_0x72.html0000644000373600000000000002355112571536763017672 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- r -

starpu-1.1.5/doc/doxygen/html/starpu_8h_source.html0000644000373600000000000010054412571536757017345 00000000000000 StarPU Handbook: starpu.h Source File
starpu.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009-2014 Université de Bordeaux
4  * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_H__
19 #define __STARPU_H__
20 
21 #include <stdlib.h>
22 
23 #ifndef _MSC_VER
24 #include <stdint.h>
25 #else
26 #include <windows.h>
27 typedef unsigned char uint8_t;
28 typedef unsigned short uint16_t;
29 typedef unsigned int uint32_t;
30 typedef unsigned long long uint64_t;
31 typedef UINT_PTR uintptr_t;
32 #endif
33 
34 #include <starpu_config.h>
35 
36 #ifdef STARPU_HAVE_WINDOWS
37 #include <windows.h>
38 #endif
39 
40 #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__)
41 #include <starpu_opencl.h>
42 #endif
43 
44 #include <starpu_thread.h>
45 #include <starpu_thread_util.h>
46 #include <starpu_util.h>
47 #include <starpu_data.h>
48 #include <starpu_data_interfaces.h>
49 #include <starpu_data_filters.h>
50 #include <starpu_stdlib.h>
51 #include <starpu_perfmodel.h>
52 #include <starpu_worker.h>
53 #include <starpu_task.h>
54 #include <starpu_task_list.h>
55 #include <starpu_task_util.h>
56 #include <starpu_sched_ctx.h>
57 #include <starpu_expert.h>
58 #include <starpu_rand.h>
59 #include <starpu_cuda.h>
60 #include <starpu_cublas.h>
61 #include <starpu_bound.h>
62 #include <starpu_hash.h>
63 #include <starpu_profiling.h>
64 #include <starpu_top.h>
65 #include <starpu_fxt.h>
66 #include <starpu_driver.h>
67 #include <starpu_simgrid_wrap.h>
68 
69 #ifdef __cplusplus
70 extern "C"
71 {
72 #endif
73 
75 {
76  int magic;
77  const char *sched_policy_name;
78 
80 
81  int ncpus;
82  int ncuda;
83  int nopencl;
84 
87 
90 
93 
95  int calibrate;
96 
98 
103  unsigned n_cuda_opengl_interoperability;
104 
107 
109 };
110 
111 int starpu_conf_init(struct starpu_conf *conf);
112 
114 
115 void starpu_pause();
116 void starpu_resume();
117 
118 void starpu_shutdown(void);
119 
120 void starpu_topology_print(FILE *f);
121 
125 
126 void starpu_display_stats();
127 
128 void starpu_get_version(int *major, int *minor, int *release);
129 
130 #ifdef __cplusplus
131 }
132 #endif
133 
134 #include "starpu_deprecated_api.h"
135 
136 #endif /* __STARPU_H__ */
starpu-1.1.5/doc/doxygen/html/sc__hypervisor__monitoring_8h_source.html0000644000373600000000000010716712571536757023501 00000000000000 StarPU Handbook: sc_hypervisor_monitoring.h Source File
sc_hypervisor_monitoring.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2011 - 2013 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef SC_HYPERVISOR_MONITORING_H
18 #define SC_HYPERVISOR_MONITORING_H
19 
20 #include <sc_hypervisor.h>
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
27 /* structure to indicate when the moving of workers was actually done
28  (moved workers can be seen in the new ctx ) */
30 {
31  /* receiver context */
33  /* list of workers required to be moved */
35  /* number of workers required to be moved */
37  /* list of workers that actually got in the receiver ctx */
39 };
40 
41 /* wrapper attached to a sched_ctx storing monitoring information */
43 {
44  /* the sched_ctx it monitors */
45  unsigned sched_ctx;
46 
47  /* user configuration meant to limit resizing */
49 
50 
51  /* the start time of the resizing sample of the workers of this context*/
52  double start_time_w[STARPU_NMAXWORKERS];
53 
54  /* idle time of workers in this context */
56 
57  /* idle time from the last resize */
59 
60  /* time when the idle started */
62 
63  /* time during which the worker executed tasks */
64  double exec_time[STARPU_NMAXWORKERS];
65 
66  /* time when the worker started executing a task */
67  double exec_start_time[STARPU_NMAXWORKERS];
68 
69  /* list of workers that will leave this contexts (lazy resizing process) */
71 
72  /* number of tasks pushed on each worker in this ctx */
74 
75  /* number of tasks poped from each worker in this ctx */
77 
78  /* number of flops the context has to execute */
79  double total_flops;
80 
81  /* number of flops executed since the biginning until now */
83 
84  /* number of flops executed since last resizing */
86 
87  /* data quantity executed on each worker in this ctx */
89 
90  /* nr of tasks executed on each worker in this ctx */
92 
93  /* the average speed of the type of workers when they belonged to this context */
94  /* 0 - cuda 1 - cpu */
95  double ref_speed[2];
96 
97  /* number of flops submitted to this ctx */
99 
100  /* number of flops that still have to be executed in this ctx */
102 
103  /* the start time of the resizing sample of this context*/
104  double start_time;
105 
106  /* the first time a task was pushed to this context*/
108 
109  /* the start time for sample in which the hyp is not allowed to react
110  bc too expensive */
111  double hyp_react_start_time;
112 
113  /* the workers don't leave the current ctx until the receiver ctx
114  doesn't ack the receive of these workers */
116 
117  /* mutex to protect the ack of workers */
118  starpu_pthread_mutex_t mutex;
119 
120  /* boolean indicating if the resizing strategy can see the
121  flops of all the execution or not */
123 
124  /* boolean indicating that a context is being sized */
125  unsigned to_be_sized;
126 
127  /* boolean indicating if we add the idle of this worker to
128  the idle of the context */
129  unsigned compute_idle[STARPU_NMAXWORKERS];
130 };
131 
132 /* return the wrapper of context that saves its monitoring information */
134 
135 /* get the list of registered contexts */
136 unsigned *sc_hypervisor_get_sched_ctxs();
137 
138 /* get the number of registered contexts */
140 
141 /* get the number of workers of a certain architecture in a context */
142 int sc_hypervisor_get_nworkers_ctx(unsigned sched_ctx, enum starpu_worker_archtype arch);
143 
144 /* get the number of flops executed by a context since last resizing (reset to 0 when a resizing is done)*/
146 
147 /* get the number of flops executed by a context since the begining */
148 double sc_hypervisor_get_total_elapsed_flops_per_sched_ctx(struct sc_hypervisor_wrapper* sc_w);
149 
150 /* compute an average value of the cpu/cuda speed */
151 double sc_hypervisorsc_hypervisor_get_speed_per_worker_type(struct sc_hypervisor_wrapper* sc_w, enum starpu_worker_archtype arch);
152 
153 /* compte the actual speed of all workers of a specific type of worker */
154 double sc_hypervisor_get_speed(struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch);
155 
156 #ifdef __cplusplus
157 }
158 #endif
159 
160 #endif
starpu-1.1.5/doc/doxygen/html/starpu__stdlib_8h_source.html0000644000373600000000000003420612571536757021046 00000000000000 StarPU Handbook: starpu_stdlib.h Source File
starpu_stdlib.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2015 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_STDLIB_H__
19 #define __STARPU_STDLIB_H__
20 
21 #include <starpu.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
28 #define STARPU_MALLOC_PINNED ((1ULL)<<1)
29 #define STARPU_MALLOC_COUNT ((1ULL)<<3)
30 
31 void starpu_malloc_set_align(size_t align);
32 
33 int starpu_malloc(void **A, size_t dim);
34 int starpu_free(void *A);
35 
36 int starpu_malloc_flags(void **A, size_t dim, int flags);
37 int starpu_free_flags(void *A, size_t dim, int flags);
38 
39 int starpu_memory_pin(void *addr, size_t size);
40 int starpu_memory_unpin(void *addr, size_t size);
41 
42 starpu_ssize_t starpu_memory_get_total(unsigned node);
43 starpu_ssize_t starpu_memory_get_available(unsigned node);
44 void starpu_memory_wait_available(unsigned node, size_t size);
45 
46 #ifdef __cplusplus
47 }
48 #endif
49 
50 #endif /* __STARPU_STDLIB_H__ */
starpu-1.1.5/doc/doxygen/html/functions_0x6e.html0000644000373600000000000003160012571536763016713 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- n -

starpu-1.1.5/doc/doxygen/html/ftv2plastnode.png0000644000373600000000000000034512571536757016461 00000000000000PNG  IHDRɪ|IDATx=QFDk:FPK؃=V@ճ 8SHx0bnrr{򽿾$ TP XOd6"SOB(Q)+YĈ ҪR>Vtsm9(k-@ȧ-$ b [he Kp-l|CApRG'rͭaIENDB`starpu-1.1.5/doc/doxygen/html/functions_0x64.html0000644000373600000000000002373012571536763016637 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- d -

starpu-1.1.5/doc/doxygen/html/starpu__deprecated__api_8h.html0000644000373600000000000001350112571536757021270 00000000000000 StarPU Handbook: starpu_deprecated_api.h File Reference
starpu_deprecated_api.h File Reference

Go to the source code of this file.

Macros

#define starpu_permodel_history_based_expected_perf

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__data_8h.html0000644000373600000000000005520712571536757017122 00000000000000 StarPU Handbook: starpu_data.h File Reference
starpu_data.h File Reference
#include <starpu.h>

Go to the source code of this file.

Data Structures

struct  starpu_data_descr

Macros

#define starpu_data_malloc_pinned_if_possible
#define starpu_data_free_pinned_if_possible

Typedefs

typedef struct _starpu_data_state * starpu_data_handle_t

Enumerations

enum  starpu_data_access_mode {
  STARPU_NONE, STARPU_R, STARPU_W, STARPU_RW,
  STARPU_SCRATCH, STARPU_REDUX, STARPU_SSEND, STARPU_ACCESS_MODE_MAX
}
enum  starpu_node_kind { STARPU_UNUSED, STARPU_CPU_RAM, STARPU_CUDA_RAM, STARPU_OPENCL_RAM }

Functions

int starpu_data_acquire_on_node (starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode)
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)
void starpu_data_release_on_node (starpu_data_handle_t handle, int node)
void starpu_data_display_memory_stats ()
unsigned starpu_worker_get_memory_node (unsigned workerid)
unsigned starpu_memory_nodes_get_count (void)
enum starpu_node_kind starpu_node_get_kind (unsigned node)
void starpu_data_set_sequential_consistency_flag (starpu_data_handle_t handle, unsigned flag)
unsigned starpu_data_get_default_sequential_consistency_flag (void)
void starpu_data_set_default_sequential_consistency_flag (unsigned flag)
unsigned starpu_data_test_if_allocated_on_node (starpu_data_handle_t handle, unsigned memory_node)
Basic Data Management API

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 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).

void starpu_data_unregister (starpu_data_handle_t handle)
void starpu_data_unregister_no_coherency (starpu_data_handle_t handle)
void starpu_data_unregister_submit (starpu_data_handle_t handle)
void starpu_data_invalidate (starpu_data_handle_t handle)
void starpu_data_invalidate_submit (starpu_data_handle_t handle)
void starpu_data_advise_as_important (starpu_data_handle_t handle, unsigned is_important)
int starpu_data_request_allocation (starpu_data_handle_t handle, unsigned node)
int starpu_data_prefetch_on_node (starpu_data_handle_t handle, unsigned node, unsigned async)
void starpu_data_set_wt_mask (starpu_data_handle_t handle, uint32_t wt_mask)
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)

Access registered data from the application

#define STARPU_DATA_ACQUIRE_CB(handle, mode, code)
int starpu_data_acquire (starpu_data_handle_t handle, 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)
void starpu_data_release (starpu_data_handle_t handle)

Detailed Description

starpu-1.1.5/doc/doxygen/html/index.html0000644000373600000000000003614112571536763015155 00000000000000 StarPU Handbook: Introduction
StarPU Handbook
Introduction

Foreword

This manual documents the usage of StarPU version 1.1.5. Its contents was last updated on 02 September 2015.

Copyright © 2009–2013 Université de Bordeaux
Copyright © 2010-2013 Centre National de la Recherche Scientifique
Copyright © 2011, 2012 Institut National de Recherche en Informatique et Automatique


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”.

Motivation

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.

StarPU in a Nutshell

StarPU is a software tool aiming to allow programmers to exploit the computing power of the available CPUs and GPUs, while relieving them from the need to specially adapt their programs to the target machine and processing units.

At the core of StarPU is its run-time support library, which is responsible for scheduling application-provided tasks on heterogeneous CPU/GPU machines. In addition, StarPU comes with programming language support, in the form of extensions to languages of the C family (C Extensions), as well as an OpenCL front-end (SOCL OpenCL Extensions).

StarPU's run-time and programming language extensions support a task-based programming model. Applications submit computational tasks, with CPU and/or GPU implementations, and StarPU schedules these tasks and associated data transfers on available CPUs and GPUs. The data that a task manipulates are automatically transferred among accelerators and the main memory, so that programmers are freed from the scheduling issues and technical details associated with these transfers.

StarPU takes particular care of scheduling tasks efficiently, using well-known algorithms from the literature (Task Scheduling Policy). In addition, it allows scheduling experts, such as compiler or computational library developers, to implement custom scheduling policies in a portable fashion (Defining A New Scheduling Policy).

The remainder of this section describes the main concepts used in StarPU.

Codelet and Tasks

One of the StarPU primary data structures is the 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.

Another important data structure is the 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 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 coherence) by StarPU. The application can however disable sequential coherency for some data, and dependencies be expressed by hand. A task may be identified by a unique 64-bit number chosen by the application which we refer as a tag. Task dependencies can be enforced by hand 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 been submitted yet).

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 the application programmer 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.

Application Taskification

TODO

Glossary

A codelet records pointers to various implementations of the same theoretical function.

A memory node can be either the main RAM or GPU-embedded memory.

A bus is a link between memory nodes.

A data handle keeps track of replicates of the same data (registered by the application) over various memory nodes. The data management library manages keeping them coherent.

The home memory node of a data handle is the memory node from which the data was registered (usually the main memory node).

A task represents a scheduled execution of a codelet on some data handles.

A 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 worker execute tasks. There is typically one per CPU computation core and one per accelerator (for which a whole CPU core is dedicated).

A 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 power consumption performance models.

A data 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.

Partitioning data means dividing the data of a given data handle (called father) into a series of children data handles which designate various portions of the former.

A 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.)

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.

Research Papers

Research papers about StarPU can be found at http://runtime.bordeaux.inria.fr/Publis/Keyword/STARPU.html.

A good overview is available in the research report at http://hal.archives-ouvertes.fr/inria-00467677.

Further Reading

The documentation chapters include

  1. Part: Using StarPU
  2. Part: Inside StarPU
  3. Part: Appendix

Make sure to have had a look at those too!

starpu-1.1.5/doc/doxygen/html/TipsAndTricksToKnowAbout.html0000644000373600000000000004171012571536762020722 00000000000000 StarPU Handbook: Tips and Tricks To Know About
Tips and Tricks To Know About

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:

fftw_plan plan_cpu[STARPU_NMAXWORKERS];

At initialisation time of libstarpu, the objects are initialized:

int workerid;
for (workerid = 0; workerid < starpu_worker_get_count(); workerid++) {
switch (starpu_worker_get_type(workerid)) {
plan_cpu[workerid] = fftw_plan(...);
break;
}
}

And in the codelet body, they are used:

static void fft(void *descr[], void *_args)
{
int workerid = starpu_worker_get_id();
fftw_plan plan = plan_cpu[workerid];
...
fftw_execute(plan, ...);
}

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.

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)
{
}

How to limit memory per node

TODO

Talk about STARPU_LIMIT_CUDA_devid_MEM, STARPU_LIMIT_CUDA_MEM, STARPU_LIMIT_OPENCL_devid_MEM, STARPU_LIMIT_OPENCL_MEM and STARPU_LIMIT_CPU_MEM

starpu_memory_get_available()

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:

$ sysctl -w security.models.extensions.user_set_cpu_affinity=1

Or add the following line in the file /etc/sysctl.conf

security.models.extensions.user_set_cpu_affinity=1

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 uses only 1 core, no matter the value of 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).

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, ie you need to match the number of calls to these functions to clear their effect.

One way to use these functions could be:

starpu_pause(); // To submit all the tasks without a single one executing
submit_some_tasks();
starpu_resume(); // The tasks start executing
starpu_pause(); // Stop the workers from polling
// Non-StarPU code
// ...

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 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 where field set to STARPU_NOWHERE, for instance this:

.nbuffers = 1,
.modes = { STARPU_R },
}
task->handles[0] = handle;

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.1.5/doc/doxygen/html/group__API__OpenCL__Extensions.html0000644000373600000000000015047212571536763021753 00000000000000 StarPU Handbook: OpenCL Extensions
StarPU Handbook
OpenCL Extensions

Data Structures

struct  starpu_opencl_program

Macros

#define STARPU_USE_OPENCL
#define STARPU_MAXOPENCLDEVS
#define STARPU_OPENCL_DATADIR

Writing OpenCL kernels

void starpu_opencl_get_context (int devid, cl_context *context)
void starpu_opencl_get_device (int devid, cl_device_id *device)
void starpu_opencl_get_queue (int devid, cl_command_queue *queue)
void starpu_opencl_get_current_context (cl_context *context)
void starpu_opencl_get_current_queue (cl_command_queue *queue)
int starpu_opencl_set_kernel_args (cl_int *err, cl_kernel *kernel,...)

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).

int starpu_opencl_load_opencl_from_file (const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options)
int starpu_opencl_load_opencl_from_string (const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options)
int starpu_opencl_unload_opencl (struct starpu_opencl_program *opencl_programs)
void starpu_opencl_load_program_source (const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source)
int starpu_opencl_compile_opencl_from_file (const char *source_file_name, const char *build_options)
int starpu_opencl_compile_opencl_from_string (const char *opencl_program_source, const char *file_name, const char *build_options)
int starpu_opencl_load_binary_opencl (const char *kernel_id, struct starpu_opencl_program *opencl_programs)

Loading OpenCL kernels

int starpu_opencl_load_kernel (cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid)
int starpu_opencl_release_kernel (cl_kernel kernel)

OpenCL statistics

int starpu_opencl_collect_stats (cl_event event)

OpenCL utilities

#define STARPU_OPENCL_DISPLAY_ERROR(status)
#define STARPU_OPENCL_REPORT_ERROR(status)
#define STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status)
const char * starpu_opencl_error_string (cl_int status)
void starpu_opencl_display_error (const char *func, const char *file, int line, const char *msg, cl_int status)
static __starpu_inline void starpu_opencl_report_error (const char *func, const char *file, int line, const char *msg, cl_int status)
cl_int starpu_opencl_copy_ram_to_opencl (void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret)
cl_int starpu_opencl_copy_opencl_to_ram (cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret)
cl_int starpu_opencl_copy_opencl_to_opencl (cl_mem src, unsigned src_node, size_t src_offset, cl_mem dst, unsigned dst_node, size_t dst_offset, size_t size, cl_event *event, int *ret)
cl_int starpu_opencl_copy_async_sync (uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event)

Detailed Description


Data Structure Documentation

struct starpu_opencl_program

Stores the OpenCL programs as compiled for the different OpenCL devices.

Data Fields
cl_program programs Stores each program for each OpenCL device.

Macro Definition Documentation

#define STARPU_USE_OPENCL

This macro is defined when StarPU has been installed with OpenCL support. It should be used in your code to detect the availability of OpenCL as shown in Full source code for the ’Scaling a Vector’ example.

#define STARPU_MAXOPENCLDEVS

This macro defines the maximum number of OpenCL devices that are supported by StarPU.

#define STARPU_OPENCL_DATADIR

This macro defines the directory in which the OpenCL codelets of the applications provided with StarPU have been installed.

#define STARPU_OPENCL_DISPLAY_ERROR (   status)

Call the function starpu_opencl_display_error() with the given error status, the current function name, current file and line number, and a empty message.

#define STARPU_OPENCL_REPORT_ERROR (   status)

Call the function starpu_opencl_report_error() with the given error status, with the current function name, current file and line number, and a empty message.

#define STARPU_OPENCL_REPORT_ERROR_WITH_MSG (   msg,
  status 
)

Call the function starpu_opencl_report_error() with the given msg and the given error status, with the current function name, current file and line number.

Function Documentation

void starpu_opencl_get_context ( int  devid,
cl_context *  context 
)

Places the OpenCL context of the device designated by devid into context.

void starpu_opencl_get_device ( int  devid,
cl_device_id *  device 
)

Places the cl_device_id corresponding to devid in device.

void starpu_opencl_get_queue ( int  devid,
cl_command_queue *  queue 
)

Places the command queue of the device designated by devid into queue.

void starpu_opencl_get_current_context ( cl_context *  context)

Return the context of the current worker.

void starpu_opencl_get_current_queue ( cl_command_queue *  queue)

Return the computation kernel command queue of the current worker.

int starpu_opencl_set_kernel_args ( cl_int *  err,
cl_kernel *  kernel,
  ... 
)

Sets the arguments of a given kernel. The list of arguments must be given as (size_t size_of_the_argument, cl_mem * pointer_to_the_argument). The last argument must be 0. Returns the number of arguments that were successfully set. In case of failure, returns the id of the argument that could not be set and err is set to the error returned by OpenCL. Otherwise, returns the number of arguments that were set.

Here an example:

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);
int starpu_opencl_load_opencl_from_file ( const char *  source_file_name,
struct starpu_opencl_program opencl_programs,
const char *  build_options 
)

This function compiles an OpenCL source code stored in a file.

int starpu_opencl_load_opencl_from_string ( const char *  opencl_program_source,
struct starpu_opencl_program opencl_programs,
const char *  build_options 
)

This function compiles an OpenCL source code stored in a string.

int starpu_opencl_unload_opencl ( struct starpu_opencl_program opencl_programs)

This function unloads an OpenCL compiled code.

void starpu_opencl_load_program_source ( const char *  source_file_name,
char *  located_file_name,
char *  located_dir_name,
char *  opencl_program_source 
)

Store the contents of the file source_file_name in the buffer opencl_program_source. The file source_file_name can be located in the current directory, or in the directory specified by the environment variable 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, located_file_name is the full name of the file as it has been located on the system, located_dir_name the directory where it has been located. Otherwise, they are both set to the empty string.

int starpu_opencl_compile_opencl_from_file ( const char *  source_file_name,
const char *  build_options 
)

Compile the OpenCL kernel stored in the file source_file_name with the given options build_options and stores the result in the directory $STARPU_HOME/.starpu/opencl with the same filename as 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_string ( const char *  opencl_program_source,
const char *  file_name,
const char *  build_options 
)

Compile the OpenCL kernel in the string opencl_program_source with the given options build_options and stores the result in the directory $STARPU_HOME/.starpu/opencl with the filename 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_load_binary_opencl ( const char *  kernel_id,
struct starpu_opencl_program opencl_programs 
)

Compile the binary OpenCL kernel identified with kernel_id. For every OpenCL device, the binary OpenCL kernel will be loaded from the file $STARPU_HOME/.starpu/opencl/<kernel_id>.<device_type>.vendor_id_<vendor_id>_device_id_<device_id>.

int starpu_opencl_load_kernel ( cl_kernel *  kernel,
cl_command_queue *  queue,
struct starpu_opencl_program opencl_programs,
const char *  kernel_name,
int  devid 
)

Create a kernel kernel for device devid, on its computation command queue returned in queue, using program opencl_programs and name kernel_name.

int starpu_opencl_release_kernel ( cl_kernel  kernel)

Release the given kernel, to be called after kernel execution.

int starpu_opencl_collect_stats ( cl_event  event)

This function allows to collect statistics on a kernel execution. After termination of the kernels, the OpenCL codelet should call this function to pass it the even returned by clEnqueueNDRangeKernel, to let StarPU collect statistics about the kernel execution (used cycles, consumed power).

const char * starpu_opencl_error_string ( cl_int  status)

Return the error message in English corresponding to status, an OpenCL error code.

void starpu_opencl_display_error ( const char *  func,
const char *  file,
int  line,
const char *  msg,
cl_int  status 
)

Given a valid error status, prints the corresponding error message on stdout, along with the given function name func, the given filename file, the given line number line and the given message msg.

void starpu_opencl_report_error ( const char *  func,
const char *  file,
int  line,
const char *  msg,
cl_int  status 
)
static

Call the function starpu_opencl_display_error() and abort.

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 size bytes from the given ptr on RAM src_node to the given buffer on OpenCL dst_node. offset is the offset, in bytes, in buffer. if event is NULL, the copy is synchronous, i.e the queue is synchronised before returning. If not NULL, 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 ret is set to -EAGAIN if the asynchronous launch was successful, or to 0 if 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 size bytes asynchronously from the given buffer on OpenCL src_node to the given ptr on RAM dst_node. offset is the offset, in bytes, in buffer. if event is NULL, the copy is synchronous, i.e the queue is synchronised before returning. If not NULL, 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 ret is set to -EAGAIN if the asynchronous launch was successful, or to 0 if 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 size bytes asynchronously from byte offset src_offset of src on OpenCL src_node to byte offset dst_offset of dst on OpenCL dst_node. if event is NULL, the copy is synchronous, i.e. the queue is synchronised before returning. If not NULL, 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 ret is set to -EAGAIN if the asynchronous launch was successful, or to 0 if event was NULL.

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 
)

Copy size bytes from byte offset src_offset of src on src_node to byte offset dst_offset of dst on dst_node. if event is NULL, the copy is synchronous, i.e. the queue is synchronised before returning. If not NULL, event can be used after the call to wait for this particular copy to complete. The function returns -EAGAIN if the asynchronous launch was successfull. It returns 0 if the synchronous copy was successful, or fails otherwise.

starpu-1.1.5/doc/doxygen/html/functions_0x73.html0000644000373600000000000002636512571536763016646 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- s -

starpu-1.1.5/doc/doxygen/html/starpu__worker_8h.html0000644000373600000000000003367512571536757017527 00000000000000 StarPU Handbook: starpu_worker.h File Reference
starpu_worker.h File Reference
#include <stdlib.h>
#include <starpu_config.h>

Go to the source code of this file.

Data Structures

struct  starpu_sched_ctx_iterator
struct  starpu_worker_collection

Enumerations

enum  starpu_worker_archtype { STARPU_ANY_WORKER, STARPU_CPU_WORKER, STARPU_CUDA_WORKER, STARPU_OPENCL_WORKER }
enum  starpu_worker_collection_type { STARPU_WORKER_LIST }

Functions

unsigned starpu_worker_get_count (void)
unsigned starpu_combined_worker_get_count (void)
unsigned starpu_worker_is_combined_worker (int id)
unsigned starpu_cpu_worker_get_count (void)
unsigned starpu_cuda_worker_get_count (void)
unsigned starpu_opencl_worker_get_count (void)
int starpu_worker_get_id (void)
int starpu_combined_worker_get_id (void)
int starpu_combined_worker_get_size (void)
int starpu_combined_worker_get_rank (void)
enum starpu_worker_archtype starpu_worker_get_type (int id)
int starpu_worker_get_count_by_type (enum starpu_worker_archtype type)
int starpu_worker_get_ids_by_type (enum starpu_worker_archtype type, int *workerids, int maxsize)
int starpu_worker_get_by_type (enum starpu_worker_archtype type, int num)
int starpu_worker_get_by_devid (enum starpu_worker_archtype type, int devid)
void starpu_worker_get_name (int id, char *dst, size_t maxlen)
int starpu_worker_get_devid (int id)
int starpu_worker_get_nsched_ctxs (int workerid)

Detailed Description

starpu-1.1.5/doc/doxygen/html/group__API__Initialization__and__Termination.html0000644000373600000000000010162412571536763024730 00000000000000 StarPU Handbook: Initialization and Termination
StarPU Handbook
Initialization and Termination

Data Structures

struct  starpu_driver
union  starpu_driver.id
struct  starpu_vector_interface
struct  starpu_conf

Functions

int starpu_init (struct starpu_conf *conf) STARPU_WARN_UNUSED_RESULT
int starpu_conf_init (struct starpu_conf *conf)
void starpu_shutdown (void)
void starpu_pause ()
void starpu_resume ()
int starpu_asynchronous_copy_disabled (void)
int starpu_asynchronous_cuda_copy_disabled (void)
int starpu_asynchronous_opencl_copy_disabled (void)
void starpu_topology_print (FILE *f)

Detailed Description


Data Structure Documentation

struct starpu_driver

structure for a driver

Data Fields
enum starpu_worker_archtype type The type of the driver. Only STARPU_CPU_WORKER, STARPU_CUDA_WORKER and STARPU_OPENCL_WORKER are currently supported.
union starpu_driver id The identifier of the driver.
union starpu_driver.id
Data Fields
unsigned cpu_id
unsigned cuda_id
cl_device_id opencl_id
struct starpu_vector_interface

Vector interface

vector interface for contiguous (non-strided) buffers

Data Fields
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
struct starpu_conf

This structure is passed to the starpu_init() function in order to configure StarPU. It has to be initialized with starpu_conf_init(). When the default value is used, StarPU automatically selects the number of processing units and takes the default scheduling policy. The environment variables overwrite the equivalent parameters.

Data Fields
int magic Will be initialized by starpu_conf_init(). Should not be set by hand.
const char * sched_policy_name This is the name of the scheduling policy. This can also be specified with the environment variable STARPU_SCHED. (default = NULL).
struct starpu_sched_policy * sched_policy This is the definition of the scheduling policy. This field is ignored if starpu_conf::sched_policy_name is set. (default = NULL)
int ncpus This is the number of CPU cores that StarPU can use. This can also be specified with the environment variable STARPU_NCPU . (default = -1)
int ncuda This is the number of CUDA devices that StarPU can use. This can also be specified with the environment variable STARPU_NCUDA. (default = -1)
int nopencl This is the number of OpenCL devices that StarPU can use. This can also be specified with the environment variable STARPU_NOPENCL. (default = -1)
unsigned use_explicit_workers_bindid If this flag is set, the starpu_conf::workers_bindid array indicates where the different workers are bound, otherwise StarPU automatically selects where to bind the different workers. This can also be specified with the environment variable STARPU_WORKERS_CPUID. (default = 0)
unsigned 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 use_explicit_workers_cuda_gpuid If this flag is set, the CUDA workers will be attached to the CUDA devices specified in the starpu_conf::workers_cuda_gpuid array. Otherwise, StarPU affects the CUDA devices in a round-robin fashion. This can also be specified with the environment variable STARPU_WORKERS_CUDAID. (default = 0)
unsigned 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 cudaGetDevice()).
unsigned use_explicit_workers_opencl_gpuid If this flag is set, the OpenCL workers will be attached to the OpenCL devices specified in the starpu_conf::workers_opencl_gpuid array. Otherwise, StarPU affects the OpenCL devices in a round-robin fashion. This can also be specified with the environment variable STARPU_WORKERS_OPENCLID. (default = 0)
unsigned 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.
int bus_calibrate If this flag is set, StarPU will recalibrate the bus. If this value is equal to -1, the default value is used. This can also be specified with the environment variable STARPU_BUS_CALIBRATE. (default = 0)
int 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 STARPU_CALIBRATE. (default = 0)
int single_combined_worker By default, StarPU executes parallel tasks concurrently. Some parallel libraries (e.g. most OpenMP implementations) however do not support concurrent calls to parallel code. In such case, setting this flag makes StarPU only start one parallel task at a time (but other CPU and GPU tasks are not affected and can be run concurrently). The parallel task scheduler will however still however still try varying combined worker sizes to look for the most efficient ones. This can also be specified with the environment variable STARPU_SINGLE_COMBINED_WORKER. (default = 0)
int disable_asynchronous_copy This flag should be set to 1 to disable asynchronous copies between CPUs and all accelerators. This can also be specified with the environment variable STARPU_DISABLE_ASYNCHRONOUS_COPY. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers. This can also be specified at compilation time by giving to the configure script the option --disable-asynchronous-copy. (default = 0)
int disable_asynchronous_cuda_copy This flag should be set to 1 to disable asynchronous copies between CPUs and CUDA accelerators. This can also be specified with the environment variable STARPU_DISABLE_ASYNCHRONOUS_CUDA_COPY. This can also be specified at compilation time by giving to the configure script the option --disable-asynchronous-cuda-copy. (default = 0)
int disable_asynchronous_opencl_copy This flag should be set to 1 to disable asynchronous copies between CPUs and OpenCL accelerators. This can also be specified with the environment variable STARPU_DISABLE_ASYNCHRONOUS_OPENCL_COPY. The AMD implementation of OpenCL is known to fail when copying data asynchronously. When using this implementation, it is therefore necessary to disable asynchronous data transfers. This can also be specified at compilation time by giving to the configure script the option --disable-asynchronous-opencl-copy. (default = 0)
unsigned * cuda_opengl_interoperability Enable CUDA/OpenGL interoperation on these CUDA devices. This can be set to an array of CUDA device identifiers for which cudaGLSetGLDevice() should be called instead of cudaSetDevice(). Its size is specified by the starpu_conf::n_cuda_opengl_interoperability field below (default = NULL)
unsigned n_cuda_opengl_interoperability
struct starpu_driver * not_launched_drivers Array of drivers that should not be launched by StarPU. The application will run in one of its own threads. (default = NULL)
unsigned n_not_launched_drivers The number of StarPU drivers that should not be launched by StarPU. (default = 0)
unsigned trace_buffer_size Specifies the buffer size used for FxT tracing. Starting from FxT version 0.2.12, the buffer will automatically be flushed when it fills in, but it may still be interesting to specify a bigger value to avoid any flushing (which would disturb the trace).

Function Documentation

int starpu_init ( struct starpu_conf conf)

This is StarPU initialization method, which must be called prior to any other StarPU call. It is possible to specify StarPU’s configuration (e.g. scheduling policy, number of cores, ...) by passing a non-null argument. Default configuration is used if the passed argument is NULL. Upon successful completion, this function returns 0. Otherwise, -ENODEV indicates that no worker was available (so that StarPU was not initialized).

int starpu_conf_init ( struct starpu_conf conf)

This function initializes the conf structure passed as argument with the default values. In case some configuration parameters are already specified through environment variables, starpu_conf_init() initializes the fields of the structure according to the environment variables. For instance if STARPU_CALIBRATE is set, its value is put in the field starpu_conf::calibrate of the structure passed as argument. Upon successful completion, this function returns 0. Otherwise, -EINVAL indicates that the argument was NULL.

void starpu_shutdown ( void  )

This is StarPU termination method. It must be called at the end of the application: statistics and other post-mortem debugging information are not guaranteed to be available until this method has been called.

void starpu_pause ( void  )

This call is used to suspend the processing of new tasks by workers. It can be used in a program where StarPU is used during only a part of the execution. Without this call, the workers continue to poll for new tasks in a tight loop, wasting CPU time. The symmetric call to starpu_resume() should be used to unfreeze the workers.

void starpu_resume ( void  )

This is the symmetrical call to starpu_pause(), used to resume the workers polling for new tasks.

int starpu_asynchronous_copy_disabled ( void  )

Return 1 if asynchronous data transfers between CPU and accelerators are disabled.

int starpu_asynchronous_cuda_copy_disabled ( void  )

Return 1 if asynchronous data transfers between CPU and CUDA accelerators are disabled.

int starpu_asynchronous_opencl_copy_disabled ( void  )

Return 1 if asynchronous data transfers between CPU and OpenCL accelerators are disabled.

void starpu_topology_print ( FILE *  f)

Prints a description of the topology on f.

starpu-1.1.5/doc/doxygen/html/group__API__Toolbox.html0000644000373600000000000006065412571536763017705 00000000000000 StarPU Handbook: Toolbox
StarPU Handbook
Toolbox

The following macros allow to make GCC extensions portable, and to have a code which can be compiled with any C compiler. More...

Macros

#define STARPU_GNUC_PREREQ(maj, min)
#define STARPU_UNLIKELY(expr)
#define STARPU_LIKELY(expr)
#define STARPU_ATTRIBUTE_UNUSED
#define STARPU_ATTRIBUTE_INTERNAL
#define STARPU_ATTRIBUTE_MALLOC
#define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT
#define STARPU_ATTRIBUTE_PURE
#define STARPU_ATTRIBUTE_ALIGNED(size)
#define STARPU_WARN_UNUSED_RESULT
#define STARPU_POISON_PTR
#define STARPU_MIN(a, b)
#define STARPU_MAX(a, b)
#define STARPU_ASSERT(x)
#define STARPU_ASSERT_MSG(x, msg,...)
#define STARPU_ABORT()
#define STARPU_ABORT_MSG(msg,...)
#define STARPU_CHECK_RETURN_VALUE(err, message,...)
#define STARPU_CHECK_RETURN_VALUE_IS(err, value, message,...)
#define STARPU_RMB()
#define STARPU_WMB()

Functions

static __starpu_inline int starpu_get_env_number (const char *str)

Detailed Description

The following macros allow to make GCC extensions portable, and to have a code which can be compiled with any C compiler.

Macro Definition Documentation

#define STARPU_GNUC_PREREQ (   maj,
  min 
)

Return true (non-zero) if GCC version MAJ.MIN or later is being used (macro taken from glibc.)

#define STARPU_UNLIKELY (   expr)

When building with a GNU C Compiler, this macro allows programmers to mark an expression as unlikely.

#define STARPU_LIKELY (   expr)

When building with a GNU C Compiler, this macro allows programmers to mark an expression as likely.

#define STARPU_ATTRIBUTE_UNUSED

When building with a GNU C Compiler, this macro is defined to __attribute__((unused))

#define STARPU_ATTRIBUTE_INTERNAL

When building with a GNU C Compiler, this macro is defined to __attribute__((visibility ("internal")))

#define STARPU_ATTRIBUTE_MALLOC

When building with a GNU C Compiler, this macro is defined to __attribute__((malloc))

#define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT

When building with a GNU C Compiler, this macro is defined to __attribute__((warn_unused_result))

#define STARPU_ATTRIBUTE_PURE

When building with a GNU C Compiler, this macro is defined to __attribute__((pure))

#define STARPU_ATTRIBUTE_ALIGNED (   size)

When building with a GNU C Compiler, this macro is defined to__attribute__((aligned(size)))

#define STARPU_WARN_UNUSED_RESULT

When building with a GNU C Compiler, this macro is defined to__attribute__((__warn_unused_result__))

#define STARPU_POISON_PTR

This macro defines a value which can be used to mark pointers as invalid values.

#define STARPU_MIN (   a,
 
)

This macro returns the min of the two parameters.

#define STARPU_MAX (   a,
 
)

This macro returns the max of the two parameters.

#define STARPU_ASSERT (   x)

Unless StarPU has been configured with the option --enable-fast, this macro will abort if the expression is false.

#define STARPU_ASSERT_MSG (   x,
  msg,
  ... 
)

Unless StarPU has been configured with the option --enable-fast, this macro will abort if the expression is false. The given message will be displayed.

#define STARPU_ABORT ( )

This macro aborts the program.

#define STARPU_ABORT_MSG (   msg,
  ... 
)

This macro aborts the program, and displays the given message.

#define STARPU_CHECK_RETURN_VALUE (   err,
  message,
  ... 
)

If err has a value which is not 0, the given message is displayed before aborting.

#define STARPU_CHECK_RETURN_VALUE_IS (   err,
  value,
  message,
  ... 
)

If err has a value which is not value, the given message is displayed before aborting.

#define STARPU_RMB ( )

This macro can be used to do a synchronization.

#define STARPU_WMB ( )

This macro can be used to do a synchronization.

Function Documentation

int starpu_get_env_number ( const char *  str)
static

If str is the name of a existing environment variable which is defined to an integer, the function returns the value of the integer. It returns 0 otherwise.

starpu-1.1.5/doc/doxygen/html/paje_draw_histogram.png0000644000373600000000000010764712571536762017710 00000000000000PNG  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

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.1.5/doc/doxygen/html/globals.html0000644000373600000000000032610012571536763015466 00000000000000 StarPU Handbook: Globals

StarPU Handbook
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:

- s -

starpu-1.1.5/doc/doxygen/html/tab_h.png0000644000373600000000000000030012571536757014732 00000000000000PNG  IHDR$[IDATx @E 7X AADjG Ze؈ 8WxUK.%0mɤ&+4i$džt׿zWf5AZ'w"2Wg%d)R15Fd БOC"@g=IENDB`starpu-1.1.5/doc/doxygen/html/functions.html0000644000373600000000000002042712571536763016056 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- a -

starpu-1.1.5/doc/doxygen/html/functions_vars_0x69.html0000644000373600000000000002256312571536763017702 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- i -

starpu-1.1.5/doc/doxygen/html/starpu__data__filters_8h.html0000644000373600000000000004735012571536757021011 00000000000000 StarPU Handbook: starpu_data_filters.h File Reference
starpu_data_filters.h File Reference
#include <starpu.h>
#include <stdarg.h>

Go to the source code of this file.

Data Structures

struct  starpu_data_filter

Functions

Basic API
void starpu_data_partition (starpu_data_handle_t initial_handle, struct starpu_data_filter *f)
void starpu_data_unpartition (starpu_data_handle_t root_data, unsigned gathering_node)
int starpu_data_get_nb_children (starpu_data_handle_t handle)
starpu_data_handle_t starpu_data_get_child (starpu_data_handle_t handle, unsigned i)
starpu_data_handle_t starpu_data_get_sub_data (starpu_data_handle_t root_data, unsigned depth,...)
starpu_data_handle_t starpu_data_vget_sub_data (starpu_data_handle_t root_data, unsigned depth, va_list pa)
void starpu_data_map_filters (starpu_data_handle_t root_data, unsigned nfilters,...)
void starpu_data_vmap_filters (starpu_data_handle_t root_data, unsigned nfilters, va_list pa)
Predefined BCSR Filter Functions

This section gives a partial list of the predefined partitioning functions for BCSR data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h.

void starpu_bcsr_filter_canonical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_csr_filter_vertical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
Predefined Matrix Filter Functions

This section gives a partial list of the predefined partitioning functions for matrix data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h.

void starpu_matrix_filter_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_matrix_filter_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_matrix_filter_vertical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_matrix_filter_vertical_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
Predefined Vector Filter Functions

This section gives a partial list of the predefined partitioning functions for vector data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h.

void starpu_vector_filter_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_vector_filter_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_vector_filter_list (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_vector_filter_divide_in_2 (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
Predefined Block Filter Functions

This section gives a partial list of the predefined partitioning functions for block data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h. A usage example is available in examples/filters/shadow3d.c

void starpu_block_filter_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_vertical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_vertical_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_depth_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_depth_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__worker_8h_source.html0000644000373600000000000006447312571536757021107 00000000000000 StarPU Handbook: starpu_worker.h Source File
starpu_worker.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009-2013 Université de Bordeaux
4  * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_WORKER_H__
19 #define __STARPU_WORKER_H__
20 
21 #include <stdlib.h>
22 #include <starpu_config.h>
23 
24 #ifdef __cplusplus
25 extern "C"
26 {
27 #endif
28 
30 {
35 };
36 
38 {
39  int cursor;
40 };
41 
43 {
45 };
46 
48 {
49  void *workerids;
50  unsigned nworkers;
52  unsigned (*has_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it);
53  int (*get_next)(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it);
54  int (*add)(struct starpu_worker_collection *workers, int worker);
55  int (*remove)(struct starpu_worker_collection *workers, int worker);
56  void (*init)(struct starpu_worker_collection *workers);
57  void (*deinit)(struct starpu_worker_collection *workers);
59 };
60 
61 unsigned starpu_worker_get_count(void);
63 unsigned starpu_worker_is_combined_worker(int id);
64 
65 unsigned starpu_cpu_worker_get_count(void);
66 unsigned starpu_cuda_worker_get_count(void);
67 unsigned starpu_opencl_worker_get_count(void);
68 
69 int starpu_worker_get_id(void);
70 
74 
76 
78 
79 int starpu_worker_get_ids_by_type(enum starpu_worker_archtype type, int *workerids, int maxsize);
80 
82 
83 int starpu_worker_get_by_devid(enum starpu_worker_archtype type, int devid);
84 
85 void starpu_worker_get_name(int id, char *dst, size_t maxlen);
86 
87 int starpu_worker_get_devid(int id);
88 
89 int starpu_worker_get_nsched_ctxs(int workerid);
90 
91 #ifdef __cplusplus
92 }
93 #endif
94 
95 #endif /* __STARPU_WORKER_H__ */
96 
starpu-1.1.5/doc/doxygen/html/starpu__cublas_8h_source.html0000644000373600000000000002434712571536757021043 00000000000000 StarPU Handbook: starpu_cublas.h Source File
starpu_cublas.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2012 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_CUBLAS_H__
19 #define __STARPU_CUBLAS_H__
20 
21 #ifdef __cplusplus
22 extern "C"
23 {
24 #endif
25 
26 void starpu_cublas_init(void);
27 void starpu_cublas_shutdown(void);
28 
29 #ifdef __cplusplus
30 }
31 #endif
32 
33 #endif /* __STARPU_CUBLAS_H__ */
starpu-1.1.5/doc/doxygen/html/starpu__task__list_8h_source.html0000644000373600000000000010355412571536757021724 00000000000000 StarPU Handbook: starpu_task_list.h Source File
starpu_task_list.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2012 Université de Bordeaux
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef __STARPU_TASK_LIST_H__
18 #define __STARPU_TASK_LIST_H__
19 
20 #include <starpu_task.h>
21 #include <starpu_util.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
29 {
30  struct starpu_task *head;
31  struct starpu_task *tail;
32 };
33 
34 static STARPU_INLINE
36 {
37  list->head = NULL;
38  list->tail = NULL;
39 }
40 
41 static STARPU_INLINE
43  struct starpu_task *task)
44 {
45  if (list->tail == NULL)
46  {
47  list->tail = task;
48  }
49  else
50  {
51  list->head->prev = task;
52  }
53 
54  task->prev = NULL;
55  task->next = list->head;
56  list->head = task;
57 }
58 
59 static STARPU_INLINE
61  struct starpu_task *task)
62 {
63  if (list->head == NULL)
64  {
65  list->head = task;
66  }
67  else
68  {
69  list->tail->next = task;
70  }
71 
72  task->next = NULL;
73  task->prev = list->tail;
74  list->tail = task;
75 }
76 
77 static STARPU_INLINE
79 {
80  return list->head;
81 }
82 
83 static STARPU_INLINE
85 {
86  return list->tail;
87 }
88 
89 static STARPU_INLINE
91 {
92  return (list->head == NULL);
93 }
94 
95 static STARPU_INLINE
97  struct starpu_task *task)
98 {
99  struct starpu_task *p = task->prev;
100 
101  if (p)
102  {
103  p->next = task->next;
104  }
105  else
106  {
107  list->head = task->next;
108  }
109 
110  if (task->next)
111  {
112  task->next->prev = p;
113  }
114  else
115  {
116  list->tail = p;
117  }
118 
119  task->prev = NULL;
120  task->next = NULL;
121 }
122 
123 static STARPU_INLINE
125 {
126  struct starpu_task *task = list->head;
127 
128  if (task)
129  starpu_task_list_erase(list, task);
130 
131  return task;
132 }
133 
134 static STARPU_INLINE
136 {
137  struct starpu_task *task = list->tail;
138 
139  if (task)
140  starpu_task_list_erase(list, task);
141 
142  return task;
143 }
144 
145 static STARPU_INLINE
147 {
148  return list->head;
149 }
150 
151 static STARPU_INLINE
152 struct starpu_task *starpu_task_list_end(struct starpu_task_list *list STARPU_ATTRIBUTE_UNUSED)
153 {
154  return NULL;
155 }
156 
157 static STARPU_INLINE
159 {
160  return task->next;
161 }
162 
163 #ifdef __cplusplus
164 }
165 #endif
166 
167 #endif /* __STARPU_TASK_LIST_H__ */
starpu-1.1.5/doc/doxygen/html/globals_0x74.html0000644000373600000000000001570712571536763016260 00000000000000 StarPU Handbook: Globals
StarPU Handbook
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:

- t -

starpu-1.1.5/doc/doxygen/html/ftv2folderclosed.png0000644000373600000000000000115012571536757017130 00000000000000PNG  IHDR}\/IDATx]MO@~uؐlp]#]PYEC\9y`xC &=qvZv3m؃vLN}}ޝZA@n ONp xKxj8s _[D'yye+ 7#rNlk* 0Ь_d_(Öz=xvhzP-䍒̪u$\DJcB4.:Ϗ-}LE #gN;B6䬜@p&h>p9EEάʑ"un$R"?{<%PNt$߶+^<"2Dqq\ҙaA"ԵP}#Ez{.8i p(ADwDE߂z;Kק8t q:uvvݛvEn{MFXgfZ֝*ߩ:jYq#3SWr'  IENDB`starpu-1.1.5/doc/doxygen/html/globals_func.html0000644000373600000000000021436612571536763016513 00000000000000 StarPU Handbook: Globals
StarPU Handbook
 

- s -

starpu-1.1.5/doc/doxygen/html/group__API__Insert__Task.html0000644000373600000000000005440012571536763020634 00000000000000 StarPU Handbook: Insert_Task
StarPU Handbook
Insert_Task

Macros

#define STARPU_VALUE
#define STARPU_CALLBACK
#define STARPU_CALLBACK_WITH_ARG
#define STARPU_CALLBACK_ARG
#define STARPU_PRIORITY
#define STARPU_DATA_ARRAY
#define STARPU_EXECUTE_ON_WORKER
#define STARPU_TAG
#define STARPU_FLOPS
#define STARPU_SCHED_CTX

Functions

int starpu_insert_task (struct starpu_codelet *cl,...)
void starpu_codelet_pack_args (void **arg_buffer, size_t *arg_buffer_size,...)
void starpu_codelet_unpack_args (void *cl_arg,...)
struct starpu_taskstarpu_task_build (struct starpu_codelet *cl,...)

Detailed Description

Macro Definition Documentation

#define STARPU_VALUE

this macro is used when calling starpu_insert_task(), and must be followed by a pointer to a constant value and the size of the constant

#define STARPU_CALLBACK

this macro is used when calling starpu_insert_task(), and must be followed by a pointer to a callback function

#define STARPU_CALLBACK_WITH_ARG

this macro is used when calling starpu_insert_task(), and must be followed by two pointers: one to a callback function, and the other to be given as an argument to the callback function; this is equivalent to using both STARPU_CALLBACK and STARPU_CALLBACK_WITH_ARG.

#define STARPU_CALLBACK_ARG

this macro is used when calling starpu_insert_task(), and must be followed by a pointer to be given as an argument to the callback function

#define STARPU_PRIORITY

this macro is used when calling starpu_insert_task(), and must be followed by a integer defining a priority level

#define STARPU_DATA_ARRAY

TODO

#define STARPU_EXECUTE_ON_WORKER

this macro is used when calling starpu_task_insert(), and must be followed by an integer value specifying the worker on which to execute the task (as specified by starpu_task::execute_on_a_specific_worker)

#define STARPU_TAG

this macro is used when calling starpu_insert_task(), and must be followed by a tag.

#define STARPU_FLOPS

this macro is used when calling starpu_insert_task(), and must be followed by an amount of floating point operations, as a double. Users MUST explicitly cast into double, otherwise parameter passing will not work.

#define STARPU_SCHED_CTX

this macro is used when calling starpu_insert_task(), and must be followed by the id of the scheduling context to which we want to submit the task.

Function Documentation

int starpu_insert_task ( struct starpu_codelet cl,
  ... 
)

Create and submit a task corresponding to cl with the following arguments. The argument list must be zero-terminated.

The arguments following the codelet can be of the following types:

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.

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.

void starpu_codelet_pack_args ( void **  arg_buffer,
size_t *  arg_buffer_size,
  ... 
)

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().

void starpu_codelet_unpack_args ( void *  cl_arg,
  ... 
)

Retrieve the arguments of type STARPU_VALUE associated to a task automatically created using the function starpu_insert_task().

struct starpu_task * starpu_task_build ( struct starpu_codelet cl,
  ... 
)
read

Create a task corresponding to cl with the following arguments. The argument list must be zero-terminated. The arguments following the codelet are the same as the ones for the function starpu_insert_task().

starpu-1.1.5/doc/doxygen/html/ftv2pnode.png0000644000373600000000000000034512571536757015575 00000000000000PNG  IHDRɪ|IDATx=QFDk:FPK؃=V@ճ 8SHx0bnrr{򽿾$ TP XOd6"SOB(Q)+YĈ ҪR>Vtsm9(k-@ȧ-$ b [he Kp-l|CApRG'rͭaIENDB`starpu-1.1.5/doc/doxygen/html/search/0000755000373600000000000000000012571536757014503 500000000000000starpu-1.1.5/doc/doxygen/html/search/all_67.html0000644000373600000000000000170412571536757016377 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_76.html0000644000373600000000000000170712571536757017151 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_69.html0000644000373600000000000000170412571536757016401 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_62.js0000644000373600000000000000033212571536757016365 00000000000000var searchData= [ ['basic_20examples',['Basic Examples',['../BasicExamples.html',1,'']]], ['building_20and_20installing_20starpu',['Building and Installing StarPU',['../BuildingAndInstallingStarPU.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_65.js0000644000373600000000000000431412571536757017245 00000000000000var searchData= [ ['elapsed_5fdata',['elapsed_data',['../group__API__SC__Hypervisor.html#a5256359f2725c36c087725384a89a9f9',1,'sc_hypervisor_wrapper']]], ['elapsed_5fflops',['elapsed_flops',['../group__API__SC__Hypervisor.html#a88b5959a57bf1498f4316cc6172a0b96',1,'sc_hypervisor_wrapper']]], ['elapsed_5ftasks',['elapsed_tasks',['../group__API__SC__Hypervisor.html#af976911e407e1e13fe4db83213116d55',1,'sc_hypervisor_wrapper']]], ['elemsize',['elemsize',['../group__API__Data__Interfaces.html#aa196ddab667c28d961cf47112f3236dd',1,'starpu_matrix_interface::elemsize()'],['../group__API__Data__Interfaces.html#abe0835442903808437444ff657cc5349',1,'starpu_coo_interface::elemsize()'],['../group__API__Data__Interfaces.html#a38eeb2ae168fa27137ca41c281063c2a',1,'starpu_block_interface::elemsize()'],['../group__API__Data__Interfaces.html#a64973b87e807aee1ae82bf046c557c16',1,'starpu_vector_interface::elemsize()'],['../group__API__Data__Interfaces.html#a524a7f857ea2e939bbe37200f069fe45',1,'starpu_variable_interface::elemsize()'],['../group__API__Data__Interfaces.html#ac2d8fe3b84f8984adc48e16b52ec0afa',1,'starpu_csr_interface::elemsize()'],['../group__API__Data__Interfaces.html#a3f38b6d2cf10c91231547d992fa07e48',1,'starpu_bcsr_interface::elemsize()']]], ['end_5fctx',['end_ctx',['../group__API__SC__Hypervisor.html#aff6339dc221097287b29cf0fdb78e8f8',1,'sc_hypervisor_policy']]], ['end_5ftime',['end_time',['../group__API__Profiling.html#a3c2d97753fad1f7e500bd976d56cf24c',1,'starpu_profiling_task_info']]], ['entry',['entry',['../group__API__Performance__Model.html#a2c2d9b5577b3f1b105edff39761a6071',1,'starpu_perfmodel_history_list']]], ['enum_5fvalues',['enum_values',['../group__API__StarPUTop__Interface.html#a54299f64b8652c2bfffc1bdb696d3005',1,'starpu_top_param']]], ['execute_5fon_5fa_5fspecific_5fworker',['execute_on_a_specific_worker',['../group__API__Codelet__And__Tasks.html#a81573ad6c21f6262564174f542984854',1,'starpu_task']]], ['executed_5ftasks',['executed_tasks',['../group__API__Profiling.html#aa75cdfac133df437f7091ec1464e9391',1,'starpu_profiling_worker_info']]], ['executing_5ftime',['executing_time',['../group__API__Profiling.html#a4c9156962f0c7fb7c309e37990677729',1,'starpu_profiling_worker_info']]] ]; starpu-1.1.5/doc/doxygen/html/search/typedefs_73.html0000644000373600000000000000171112571536757017445 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/classes_73.js0000644000373600000000000001352012571536757016730 00000000000000var searchData= [ ['sc_5fhypervisor_5fpolicy',['sc_hypervisor_policy',['../group__API__SC__Hypervisor.html#structsc__hypervisor__policy',1,'']]], ['sc_5fhypervisor_5fpolicy_5fconfig',['sc_hypervisor_policy_config',['../group__API__SC__Hypervisor.html#structsc__hypervisor__policy__config',1,'']]], ['sc_5fhypervisor_5fpolicy_5ftask_5fpool',['sc_hypervisor_policy_task_pool',['../group__API__SC__Hypervisor.html#structsc__hypervisor__policy__task__pool',1,'']]], ['sc_5fhypervisor_5fresize_5fack',['sc_hypervisor_resize_ack',['../group__API__SC__Hypervisor.html#structsc__hypervisor__resize__ack',1,'']]], ['sc_5fhypervisor_5fwrapper',['sc_hypervisor_wrapper',['../group__API__SC__Hypervisor.html#structsc__hypervisor__wrapper',1,'']]], ['starpu_5fbcsr_5finterface',['starpu_bcsr_interface',['../group__API__Data__Interfaces.html#structstarpu__bcsr__interface',1,'']]], ['starpu_5fblock_5finterface',['starpu_block_interface',['../group__API__Data__Interfaces.html#structstarpu__block__interface',1,'']]], ['starpu_5fcodelet',['starpu_codelet',['../group__API__Codelet__And__Tasks.html#structstarpu__codelet',1,'']]], ['starpu_5fconf',['starpu_conf',['../group__API__Initialization__and__Termination.html#structstarpu__conf',1,'']]], ['starpu_5fcoo_5finterface',['starpu_coo_interface',['../group__API__Data__Interfaces.html#structstarpu__coo__interface',1,'']]], ['starpu_5fcsr_5finterface',['starpu_csr_interface',['../group__API__Data__Interfaces.html#structstarpu__csr__interface',1,'']]], ['starpu_5fdata_5fcopy_5fmethods',['starpu_data_copy_methods',['../group__API__Data__Interfaces.html#structstarpu__data__copy__methods',1,'']]], ['starpu_5fdata_5fdescr',['starpu_data_descr',['../group__API__Codelet__And__Tasks.html#structstarpu__data__descr',1,'']]], ['starpu_5fdata_5ffilter',['starpu_data_filter',['../group__API__Data__Partition.html#structstarpu__data__filter',1,'']]], ['starpu_5fdata_5finterface_5fops',['starpu_data_interface_ops',['../group__API__Data__Interfaces.html#structstarpu__data__interface__ops',1,'']]], ['starpu_5fdriver',['starpu_driver',['../group__API__Initialization__and__Termination.html#structstarpu__driver',1,'']]], ['starpu_5fdriver_2eid',['starpu_driver.id',['../group__API__Initialization__and__Termination.html#unionstarpu__driver_8id',1,'']]], ['starpu_5ffxt_5fcodelet_5fevent',['starpu_fxt_codelet_event',['../group__API__FxT__Support.html#structstarpu__fxt__codelet__event',1,'']]], ['starpu_5ffxt_5foptions',['starpu_fxt_options',['../group__API__FxT__Support.html#structstarpu__fxt__options',1,'']]], ['starpu_5fmatrix_5finterface',['starpu_matrix_interface',['../group__API__Data__Interfaces.html#structstarpu__matrix__interface',1,'']]], ['starpu_5fmultiformat_5fdata_5finterface_5fops',['starpu_multiformat_data_interface_ops',['../group__API__Multiformat__Data__Interface.html#structstarpu__multiformat__data__interface__ops',1,'']]], ['starpu_5fmultiformat_5finterface',['starpu_multiformat_interface',['../group__API__Multiformat__Data__Interface.html#structstarpu__multiformat__interface',1,'']]], ['starpu_5fopencl_5fprogram',['starpu_opencl_program',['../group__API__OpenCL__Extensions.html#structstarpu__opencl__program',1,'']]], ['starpu_5fperfmodel',['starpu_perfmodel',['../group__API__Performance__Model.html#structstarpu__perfmodel',1,'']]], ['starpu_5fperfmodel_5fhistory_5fentry',['starpu_perfmodel_history_entry',['../group__API__Performance__Model.html#structstarpu__perfmodel__history__entry',1,'']]], ['starpu_5fperfmodel_5fhistory_5flist',['starpu_perfmodel_history_list',['../group__API__Performance__Model.html#structstarpu__perfmodel__history__list',1,'']]], ['starpu_5fperfmodel_5fper_5farch',['starpu_perfmodel_per_arch',['../group__API__Performance__Model.html#structstarpu__perfmodel__per__arch',1,'']]], ['starpu_5fperfmodel_5fregression_5fmodel',['starpu_perfmodel_regression_model',['../group__API__Performance__Model.html#structstarpu__perfmodel__regression__model',1,'']]], ['starpu_5fprofiling_5fbus_5finfo',['starpu_profiling_bus_info',['../group__API__Profiling.html#structstarpu__profiling__bus__info',1,'']]], ['starpu_5fprofiling_5ftask_5finfo',['starpu_profiling_task_info',['../group__API__Profiling.html#structstarpu__profiling__task__info',1,'']]], ['starpu_5fprofiling_5fworker_5finfo',['starpu_profiling_worker_info',['../group__API__Profiling.html#structstarpu__profiling__worker__info',1,'']]], ['starpu_5fpthread_5fbarrier_5ft',['starpu_pthread_barrier_t',['../starpu__thread_8h.html#structstarpu__pthread__barrier__t',1,'']]], ['starpu_5fsched_5fctx_5fiterator',['starpu_sched_ctx_iterator',['../group__API__Workers__Properties.html#structstarpu__sched__ctx__iterator',1,'']]], ['starpu_5fsched_5fctx_5fperformance_5fcounters',['starpu_sched_ctx_performance_counters',['../group__API__Scheduling__Contexts.html#structstarpu__sched__ctx__performance__counters',1,'']]], ['starpu_5fsched_5fpolicy',['starpu_sched_policy',['../group__API__Scheduling__Policy.html#structstarpu__sched__policy',1,'']]], ['starpu_5ftask',['starpu_task',['../group__API__Codelet__And__Tasks.html#structstarpu__task',1,'']]], ['starpu_5ftask_5flist',['starpu_task_list',['../group__API__Task__Lists.html#structstarpu__task__list',1,'']]], ['starpu_5ftop_5fdata',['starpu_top_data',['../group__API__StarPUTop__Interface.html#structstarpu__top__data',1,'']]], ['starpu_5ftop_5fparam',['starpu_top_param',['../group__API__StarPUTop__Interface.html#structstarpu__top__param',1,'']]], ['starpu_5fvariable_5finterface',['starpu_variable_interface',['../group__API__Data__Interfaces.html#structstarpu__variable__interface',1,'']]], ['starpu_5fvector_5finterface',['starpu_vector_interface',['../group__API__Data__Interfaces.html#structstarpu__vector__interface',1,'']]], ['starpu_5fworker_5fcollection',['starpu_worker_collection',['../group__API__Workers__Properties.html#structstarpu__worker__collection',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_62.js0000644000373600000000000000175712571536757016052 00000000000000var searchData= [ ['b',['b',['../group__API__Performance__Model.html#a8f295e115b5aa963a5ceadaa9914a5b1',1,'starpu_perfmodel_regression_model']]], ['basic_20examples',['Basic Examples',['../BasicExamples.html',1,'']]], ['benchmarking',['benchmarking',['../group__API__Performance__Model.html#ae422818443d7dd3a83b44cee31d5b319',1,'starpu_perfmodel']]], ['beta',['beta',['../group__API__Performance__Model.html#a987642ec52d30357ff2fa05044f9dd60',1,'starpu_perfmodel_regression_model']]], ['buffers',['buffers',['../group__API__Codelet__And__Tasks.html#a46d6f70c2999e09ad55c7c26eb25d830',1,'starpu_task']]], ['building_20and_20installing_20starpu',['Building and Installing StarPU',['../BuildingAndInstallingStarPU.html',1,'']]], ['bundle',['bundle',['../group__API__Codelet__And__Tasks.html#a8312a98be5bd9e11bc40f820a65fbc51',1,'starpu_task']]], ['bus_5fcalibrate',['bus_calibrate',['../group__API__Initialization__and__Termination.html#ae3635b9acce7a279cae7f645bcd9fffb',1,'starpu_conf']]] ]; starpu-1.1.5/doc/doxygen/html/search/search.js0000644000373600000000000006015212571536757016232 00000000000000// Search script generated by doxygen // Copyright (C) 2009 by Dimitri van Heesch. // The code in this file is loosly based on main.js, part of Natural Docs, // which is Copyright (C) 2003-2008 Greg Valure // Natural Docs is licensed under the GPL. var indexSectionsWithContent = { 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111001111101111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111001111101111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 7: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 8: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111001000101101110110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 9: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111011000100100110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" }; var indexSectionNames = { 0: "all", 1: "classes", 2: "files", 3: "functions", 4: "variables", 5: "typedefs", 6: "enums", 7: "enumvalues", 8: "groups", 9: "pages" }; function convertToId(search) { var result = ''; for (i=0;i do a search { this.Search(); } } this.OnSearchSelectKey = function(evt) { var e = (evt) ? evt : window.event; // for IE if (e.keyCode==40 && this.searchIndex0) // Up { this.searchIndex--; this.OnSelectItem(this.searchIndex); } else if (e.keyCode==13 || e.keyCode==27) { this.OnSelectItem(this.searchIndex); this.CloseSelectionWindow(); this.DOMSearchField().focus(); } return false; } // --------- Actions // Closes the results window. this.CloseResultsWindow = function() { this.DOMPopupSearchResultsWindow().style.display = 'none'; this.DOMSearchClose().style.display = 'none'; this.Activate(false); } this.CloseSelectionWindow = function() { this.DOMSearchSelectWindow().style.display = 'none'; } // Performs a search. this.Search = function() { this.keyTimeout = 0; // strip leading whitespace var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); var code = searchValue.toLowerCase().charCodeAt(0); var hexCode; if (code<16) { hexCode="0"+code.toString(16); } else { hexCode=code.toString(16); } var resultsPage; var resultsPageWithSearch; var hasResultsPage; if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') { resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; resultsPageWithSearch = resultsPage+'?'+escape(searchValue); hasResultsPage = true; } else // nothing available for this search term { resultsPage = this.resultsPath + '/nomatches.html'; resultsPageWithSearch = resultsPage; hasResultsPage = false; } window.frames.MSearchResults.location = resultsPageWithSearch; var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); if (domPopupSearchResultsWindow.style.display!='block') { var domSearchBox = this.DOMSearchBox(); this.DOMSearchClose().style.display = 'inline'; if (this.insideFrame) { var domPopupSearchResults = this.DOMPopupSearchResults(); domPopupSearchResultsWindow.style.position = 'relative'; domPopupSearchResultsWindow.style.display = 'block'; var width = document.body.clientWidth - 8; // the -8 is for IE :-( domPopupSearchResultsWindow.style.width = width + 'px'; domPopupSearchResults.style.width = width + 'px'; } else { var domPopupSearchResults = this.DOMPopupSearchResults(); var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; domPopupSearchResultsWindow.style.display = 'block'; left -= domPopupSearchResults.offsetWidth; domPopupSearchResultsWindow.style.top = top + 'px'; domPopupSearchResultsWindow.style.left = left + 'px'; } } this.lastSearchValue = searchValue; this.lastResultsPage = resultsPage; } // -------- Activation Functions // Activates or deactivates the search panel, resetting things to // their default values if necessary. this.Activate = function(isActive) { if (isActive || // open it this.DOMPopupSearchResultsWindow().style.display == 'block' ) { this.DOMSearchBox().className = 'MSearchBoxActive'; var searchField = this.DOMSearchField(); if (searchField.value == this.searchLabel) // clear "Search" term upon entry { searchField.value = ''; this.searchActive = true; } } else if (!isActive) // directly remove the panel { this.DOMSearchBox().className = 'MSearchBoxInactive'; this.DOMSearchField().value = this.searchLabel; this.searchActive = false; this.lastSearchValue = '' this.lastResultsPage = ''; } } } // ----------------------------------------------------------------------- // The class that handles everything on the search results page. function SearchResults(name) { // The number of matches from the last run of . this.lastMatchCount = 0; this.lastKey = 0; this.repeatOn = false; // Toggles the visibility of the passed element ID. this.FindChildElement = function(id) { var parentElement = document.getElementById(id); var element = parentElement.firstChild; while (element && element!=parentElement) { if (element.nodeName == 'DIV' && element.className == 'SRChildren') { return element; } if (element.nodeName == 'DIV' && element.hasChildNodes()) { element = element.firstChild; } else if (element.nextSibling) { element = element.nextSibling; } else { do { element = element.parentNode; } while (element && element!=parentElement && !element.nextSibling); if (element && element!=parentElement) { element = element.nextSibling; } } } } this.Toggle = function(id) { var element = this.FindChildElement(id); if (element) { if (element.style.display == 'block') { element.style.display = 'none'; } else { element.style.display = 'block'; } } } // Searches for the passed string. If there is no parameter, // it takes it from the URL query. // // Always returns true, since other documents may try to call it // and that may or may not be possible. this.Search = function(search) { if (!search) // get search word from URL { search = window.location.search; search = search.substring(1); // Remove the leading '?' search = unescape(search); } search = search.replace(/^ +/, ""); // strip leading spaces search = search.replace(/ +$/, ""); // strip trailing spaces search = search.toLowerCase(); search = convertToId(search); var resultRows = document.getElementsByTagName("div"); var matches = 0; var i = 0; while (i < resultRows.length) { var row = resultRows.item(i); if (row.className == "SRResult") { var rowMatchName = row.id.toLowerCase(); rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' if (search.length<=rowMatchName.length && rowMatchName.substr(0, search.length)==search) { row.style.display = 'block'; matches++; } else { row.style.display = 'none'; } } i++; } document.getElementById("Searching").style.display='none'; if (matches == 0) // no results { document.getElementById("NoMatches").style.display='block'; } else // at least one result { document.getElementById("NoMatches").style.display='none'; } this.lastMatchCount = matches; return true; } // return the first item with index index or higher that is visible this.NavNext = function(index) { var focusItem; while (1) { var focusName = 'Item'+index; focusItem = document.getElementById(focusName); if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { break; } else if (!focusItem) // last element { break; } focusItem=null; index++; } return focusItem; } this.NavPrev = function(index) { var focusItem; while (1) { var focusName = 'Item'+index; focusItem = document.getElementById(focusName); if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { break; } else if (!focusItem) // last element { break; } focusItem=null; index--; } return focusItem; } this.ProcessKeys = function(e) { if (e.type == "keydown") { this.repeatOn = false; this.lastKey = e.keyCode; } else if (e.type == "keypress") { if (!this.repeatOn) { if (this.lastKey) this.repeatOn = true; return false; // ignore first keypress after keydown } } else if (e.type == "keyup") { this.lastKey = 0; this.repeatOn = false; } return this.lastKey!=0; } this.Nav = function(evt,itemIndex) { var e = (evt) ? evt : window.event; // for IE if (e.keyCode==13) return true; if (!this.ProcessKeys(e)) return false; if (this.lastKey==38) // Up { var newIndex = itemIndex-1; var focusItem = this.NavPrev(newIndex); if (focusItem) { var child = this.FindChildElement(focusItem.parentNode.parentNode.id); if (child && child.style.display == 'block') // children visible { var n=0; var tmpElem; while (1) // search for last child { tmpElem = document.getElementById('Item'+newIndex+'_c'+n); if (tmpElem) { focusItem = tmpElem; } else // found it! { break; } n++; } } } if (focusItem) { focusItem.focus(); } else // return focus to search field { parent.document.getElementById("MSearchField").focus(); } } else if (this.lastKey==40) // Down { var newIndex = itemIndex+1; var focusItem; var item = document.getElementById('Item'+itemIndex); var elem = this.FindChildElement(item.parentNode.parentNode.id); if (elem && elem.style.display == 'block') // children visible { focusItem = document.getElementById('Item'+itemIndex+'_c0'); } if (!focusItem) focusItem = this.NavNext(newIndex); if (focusItem) focusItem.focus(); } else if (this.lastKey==39) // Right { var item = document.getElementById('Item'+itemIndex); var elem = this.FindChildElement(item.parentNode.parentNode.id); if (elem) elem.style.display = 'block'; } else if (this.lastKey==37) // Left { var item = document.getElementById('Item'+itemIndex); var elem = this.FindChildElement(item.parentNode.parentNode.id); if (elem) elem.style.display = 'none'; } else if (this.lastKey==27) // Escape { parent.searchBox.CloseResultsWindow(); parent.document.getElementById("MSearchField").focus(); } else if (this.lastKey==13) // Enter { return true; } return false; } this.NavChild = function(evt,itemIndex,childIndex) { var e = (evt) ? evt : window.event; // for IE if (e.keyCode==13) return true; if (!this.ProcessKeys(e)) return false; if (this.lastKey==38) // Up { if (childIndex>0) { var newIndex = childIndex-1; document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); } else // already at first child, jump to parent { document.getElementById('Item'+itemIndex).focus(); } } else if (this.lastKey==40) // Down { var newIndex = childIndex+1; var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); if (!elem) // last child, jump to parent next parent { elem = this.NavNext(itemIndex+1); } if (elem) { elem.focus(); } } else if (this.lastKey==27) // Escape { parent.searchBox.CloseResultsWindow(); parent.document.getElementById("MSearchField").focus(); } else if (this.lastKey==13) // Enter { return true; } return false; } } function setKeyActions(elem,action) { elem.setAttribute('onkeydown',action); elem.setAttribute('onkeypress',action); elem.setAttribute('onkeyup',action); } function setClassAttr(elem,attr) { elem.setAttribute('class',attr); elem.setAttribute('className',attr); } function createResults() { var results = document.getElementById("SRResults"); for (var e=0; e
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_70.js0000644000373600000000000000042312571536757016605 00000000000000var searchData= [ ['parallel_20tasks',['Parallel Tasks',['../group__API__Parallel__Tasks.html',1,'']]], ['performance_20model',['Performance Model',['../group__API__Performance__Model.html',1,'']]], ['profiling',['Profiling',['../group__API__Profiling.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_65.js0000644000373600000000000000032612571536757016373 00000000000000var searchData= [ ['execution_20configuration_20through_20environment_20variables',['Execution Configuration Through Environment Variables',['../ExecutionConfigurationThroughEnvironmentVariables.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_6c.js0000644000373600000000000000077612571536757016133 00000000000000var searchData= [ ['ld',['ld',['../group__API__Data__Interfaces.html#a1e315fb776eaa20155d75dcc236a149c',1,'starpu_matrix_interface']]], ['ldy',['ldy',['../group__API__Data__Interfaces.html#a2701c20e02876292211a75a7f24b4d5b',1,'starpu_block_interface']]], ['ldz',['ldz',['../group__API__Data__Interfaces.html#ae2599da457da73787af7813d665d9824',1,'starpu_block_interface']]], ['list',['list',['../group__API__Performance__Model.html#ae1c6fea4c92c0220712f0b02430a5ae0',1,'starpu_perfmodel_per_arch']]] ]; starpu-1.1.5/doc/doxygen/html/search/classes_73.html0000644000373600000000000000171012571536757017256 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_63.html0000644000373600000000000000170412571536757016373 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_73.js0000644000373600000000000001060012571536757017237 00000000000000var searchData= [ ['sched_5fctx',['sched_ctx',['../group__API__Codelet__And__Tasks.html#ac67b9ea06d1326bc0debd23f8f8ff524',1,'starpu_task::sched_ctx()'],['../group__API__SC__Hypervisor.html#ab56be8402f4a8e45938a7f688dc0e304',1,'sc_hypervisor_wrapper::sched_ctx()']]], ['sched_5fctx_5fid',['sched_ctx_id',['../group__API__SC__Hypervisor.html#a8c2e8240be080f6aa6f0ad02c9918a95',1,'sc_hypervisor_policy_task_pool']]], ['sched_5fpolicy',['sched_policy',['../group__API__Initialization__and__Termination.html#a77ddecd7ac4db8c0d91d7f92b17c97d8',1,'starpu_conf']]], ['sched_5fpolicy_5fname',['sched_policy_name',['../group__API__Initialization__and__Termination.html#a931fd8421de4a9f1a7eacdb3c2c428d5',1,'starpu_conf']]], ['scheduled',['scheduled',['../group__API__Codelet__And__Tasks.html#a76d331fb3a03f446206b2a0ce1fe290c',1,'starpu_task']]], ['sequential_5fconsistency',['sequential_consistency',['../group__API__Codelet__And__Tasks.html#a1a38ca4084e0dcb222e67d1cbb7410a4',1,'starpu_task']]], ['single_5fcombined_5fworker',['single_combined_worker',['../group__API__Initialization__and__Termination.html#a0f74f54454b6d1051c02930be1870bf9',1,'starpu_conf']]], ['size',['size',['../group__API__Performance__Model.html#a31c30a57f076a4f12f7149c764763482',1,'starpu_perfmodel_history_entry']]], ['size_5fbase',['size_base',['../group__API__Performance__Model.html#a58f5d0179fb4ada4aab502ab01ae694c',1,'starpu_perfmodel_per_arch::size_base()'],['../group__API__Performance__Model.html#a5b94a978660fd6232a7ffc0d29c346d8',1,'starpu_perfmodel::size_base()']]], ['size_5fctxs',['size_ctxs',['../group__API__SC__Hypervisor.html#a81431b76980a77c424c38772968102e5',1,'sc_hypervisor_policy']]], ['sleeping_5ftime',['sleeping_time',['../group__API__Profiling.html#aa047efa28eaf40c2c9f3ed3c5dd1a1a2',1,'starpu_profiling_worker_info']]], ['specific_5fnodes',['specific_nodes',['../group__API__Codelet__And__Tasks.html#a2355e594fff14f8ddd683d6b3e84102b',1,'starpu_codelet']]], ['stall_5fcycles',['stall_cycles',['../group__API__Profiling.html#ae10a681f6b9fac560c2d8ae5f359dbd8',1,'starpu_profiling_task_info::stall_cycles()'],['../group__API__Profiling.html#a2492ed12922fab27cf8c09679f70c175',1,'starpu_profiling_worker_info::stall_cycles()']]], ['starpu_5fprivate',['starpu_private',['../group__API__Codelet__And__Tasks.html#a1761e7b7ea4196aef43891bb9ba5c81d',1,'starpu_task']]], ['start_5ftime',['start_time',['../group__API__Profiling.html#a2f772c59446f844a1eb4fd4c275d7da6',1,'starpu_profiling_task_info::start_time()'],['../group__API__Profiling.html#ab33462e0d10f7aa57c7dc73f70f986f4',1,'starpu_profiling_worker_info::start_time()'],['../group__API__Profiling.html#a47f093211da62496652bfa5073a01f3f',1,'starpu_profiling_bus_info::start_time()'],['../group__API__SC__Hypervisor.html#adc95fd3044241fb7a37334c55c90e597',1,'sc_hypervisor_wrapper::start_time()']]], ['status',['status',['../group__API__Codelet__And__Tasks.html#a8e95db453ef9883d8218bb1d0ee5d9ec',1,'starpu_task']]], ['submit_5ftime',['submit_time',['../group__API__Profiling.html#a085522d0ec2100f68a257012fa61d4ad',1,'starpu_profiling_task_info']]], ['submitted_5fflops',['submitted_flops',['../group__API__SC__Hypervisor.html#a874e7f62575f017b1956e7ec4035514a',1,'sc_hypervisor_wrapper']]], ['sum',['sum',['../group__API__Performance__Model.html#af56989786ce5bcc6b492c8b66667ceb0',1,'starpu_perfmodel_history_entry']]], ['sum2',['sum2',['../group__API__Performance__Model.html#ac91475eb15f733e7609a061467e3a64f',1,'starpu_perfmodel_history_entry']]], ['sumlnx',['sumlnx',['../group__API__Performance__Model.html#adf0699424245c4c15edf7c2ebe94f256',1,'starpu_perfmodel_regression_model']]], ['sumlnx2',['sumlnx2',['../group__API__Performance__Model.html#a70b8ac0b07255f2d6376915f2b5b3241',1,'starpu_perfmodel_regression_model']]], ['sumlnxlny',['sumlnxlny',['../group__API__Performance__Model.html#a37e26dbc03d50d09a18bad125c88988b',1,'starpu_perfmodel_regression_model']]], ['sumlny',['sumlny',['../group__API__Performance__Model.html#ab44cbe4ca7a554b450ef405bf02ca34b',1,'starpu_perfmodel_regression_model']]], ['symbol',['symbol',['../group__API__FxT__Support.html#a746d053a2f7640f00b7e7821f7d69f8f',1,'starpu_fxt_codelet_event::symbol()'],['../group__API__Performance__Model.html#a1bccd05fa3169b783bfd0d7dfbf95d6c',1,'starpu_perfmodel::symbol()']]], ['synchronous',['synchronous',['../group__API__Codelet__And__Tasks.html#abd0c5c3a9df1ac0c30de2b1468cd5993',1,'starpu_task']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_62.html0000644000373600000000000000170412571536757016372 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_72.js0000644000373600000000000000622212571536757016043 00000000000000var searchData= [ ['running_20drivers',['Running Drivers',['../group__API__Running__Drivers.html',1,'']]], ['r',['r',['../group__API__Data__Interfaces.html#abb0c58bc42c9f81e6373d5e953a90de5',1,'starpu_bcsr_interface']]], ['ram_5fto_5fcuda',['ram_to_cuda',['../group__API__Data__Interfaces.html#a591563e1f3a6b3d4c7a302ace052b799',1,'starpu_data_copy_methods']]], ['ram_5fto_5fcuda_5fasync',['ram_to_cuda_async',['../group__API__Data__Interfaces.html#acc3e384af8664453e291dbfb69457906',1,'starpu_data_copy_methods']]], ['ram_5fto_5fopencl',['ram_to_opencl',['../group__API__Data__Interfaces.html#a2641c532eb119e22e9e59884dda01674',1,'starpu_data_copy_methods']]], ['ram_5fto_5fopencl_5fasync',['ram_to_opencl_async',['../group__API__Data__Interfaces.html#a1d62c0f83abb9cb01c75a119ed9503b1',1,'starpu_data_copy_methods']]], ['ram_5fto_5fram',['ram_to_ram',['../group__API__Data__Interfaces.html#afd6038b7d5d018247b3215e141ba1ced',1,'starpu_data_copy_methods']]], ['real_5fstart_5ftime',['real_start_time',['../group__API__SC__Hypervisor.html#a38be8cb0907ba69c715cbbfa0a078e65',1,'sc_hypervisor_wrapper']]], ['receiver_5fsched_5fctx',['receiver_sched_ctx',['../group__API__SC__Hypervisor.html#ac24cdb1fe5c0efc413267a980a8976bb',1,'sc_hypervisor_resize_ack']]], ['ref_5fspeed',['ref_speed',['../group__API__SC__Hypervisor.html#a9e05a2c227901a17b2cd15107b9d4640',1,'sc_hypervisor_wrapper']]], ['regenerate',['regenerate',['../group__API__Codelet__And__Tasks.html#a7a924cb59478069efa57ab39eea5ff2a',1,'starpu_task']]], ['register_5fdata_5fhandle',['register_data_handle',['../group__API__Data__Interfaces.html#a1644a9f37ca217507ab5192a7d2f1e60',1,'starpu_data_interface_ops']]], ['regression',['regression',['../group__API__Performance__Model.html#a90e85ec3240051bec9124d5dc677cf46',1,'starpu_perfmodel_per_arch']]], ['release_5fdata_5fend_5ftime',['release_data_end_time',['../group__API__Profiling.html#abe6ac21a8e41f8d145f46075a0af89a4',1,'starpu_profiling_task_info']]], ['release_5fdata_5fstart_5ftime',['release_data_start_time',['../group__API__Profiling.html#a448a1d08cb4f1a23433a31a8cff2f604',1,'starpu_profiling_task_info']]], ['remaining_5fflops',['remaining_flops',['../group__API__SC__Hypervisor.html#aa89295f0dbed47350995451736d4d1a3',1,'sc_hypervisor_wrapper']]], ['remove',['remove',['../group__API__Workers__Properties.html#a03bfc24432357cc128363fe22cbd12a3',1,'starpu_worker_collection']]], ['remove_5fworkers',['remove_workers',['../group__API__Scheduling__Policy.html#acc8c1fc122f9752aba6ecb70cd3a15fe',1,'starpu_sched_policy']]], ['resize_5fack',['resize_ack',['../group__API__SC__Hypervisor.html#a701a3bd29f67cdcc71a2507bac866553',1,'sc_hypervisor_wrapper']]], ['resize_5fctxs',['resize_ctxs',['../group__API__SC__Hypervisor.html#a323600b52a95f2be31f1f72f59c613b3',1,'sc_hypervisor_policy']]], ['rowptr',['rowptr',['../group__API__Data__Interfaces.html#ad134162547199f87e2db3ff0bad3c54d',1,'starpu_csr_interface::rowptr()'],['../group__API__Data__Interfaces.html#ab0abbed006274d4f8244767254e1bd04',1,'starpu_bcsr_interface::rowptr()']]], ['rows',['rows',['../group__API__Data__Interfaces.html#a9f4e98142b08b50a5034a44c8740f985',1,'starpu_coo_interface']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_73.html0000644000373600000000000000170412571536757016374 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_66.js0000644000373600000000000000026212571536757016613 00000000000000var searchData= [ ['fft_20support',['FFT Support',['../group__API__FFT__Support.html',1,'']]], ['fxt_20support',['FxT Support',['../group__API__FxT__Support.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_63.js0000644000373600000000000001404612571536757017246 00000000000000var searchData= [ ['c',['c',['../group__API__Data__Interfaces.html#a622f3221a388eecda2fc452e2fafcbb2',1,'starpu_bcsr_interface::c()'],['../group__API__Performance__Model.html#a4df8c2989505143f07fb7afc98764f5d',1,'starpu_perfmodel_regression_model::c()']]], ['calibrate',['calibrate',['../group__API__Initialization__and__Termination.html#a7ee147999f32aaaff9fe468492a24661',1,'starpu_conf']]], ['callback',['callback',['../group__API__StarPUTop__Interface.html#ab208164723f8bd9560ccc5ce32ce4baf',1,'starpu_top_param']]], ['callback_5farg',['callback_arg',['../group__API__Codelet__And__Tasks.html#a96aace28d89ee531fc49c9f4f76bd73f',1,'starpu_task']]], ['callback_5farg_5ffree',['callback_arg_free',['../group__API__Codelet__And__Tasks.html#aead0063a37eb83b9ec862cfbe372ab40',1,'starpu_task']]], ['callback_5fend_5ftime',['callback_end_time',['../group__API__Profiling.html#ac8c627983ee00a19fcc596cb5e31b267',1,'starpu_profiling_task_info']]], ['callback_5ffunc',['callback_func',['../group__API__Codelet__And__Tasks.html#ade9326506a2c15a12d0c06770fa58167',1,'starpu_task']]], ['callback_5fstart_5ftime',['callback_start_time',['../group__API__Profiling.html#a616566b574c302570b05891c8a535e8b',1,'starpu_profiling_task_info']]], ['can_5fcopy',['can_copy',['../group__API__Data__Interfaces.html#a9156d059ec58222bb9f46f4c391f5ab6',1,'starpu_data_copy_methods']]], ['can_5fexecute',['can_execute',['../group__API__Codelet__And__Tasks.html#a3d9d4c5f2578cd6f134de80ccf97594d',1,'starpu_codelet']]], ['cl',['cl',['../group__API__Codelet__And__Tasks.html#a2359625ed69b519c04aecdfff3b9f85e',1,'starpu_task::cl()'],['../group__API__SC__Hypervisor.html#a2b5d9d991c03d651ec0b5353d6772696',1,'sc_hypervisor_policy_task_pool::cl()']]], ['cl_5farg',['cl_arg',['../group__API__Codelet__And__Tasks.html#a2706921b9c761ba640a6655609a3ecfe',1,'starpu_task']]], ['cl_5farg_5ffree',['cl_arg_free',['../group__API__Codelet__And__Tasks.html#a571c7e127eab4bcdd4d52224199920ee',1,'starpu_task']]], ['cl_5farg_5fsize',['cl_arg_size',['../group__API__Codelet__And__Tasks.html#a58e6d16df78f9ba6adf5b9849f3b49ef',1,'starpu_task']]], ['colind',['colind',['../group__API__Data__Interfaces.html#ac82dd88dea4232a25a0ac5cdbf33984f',1,'starpu_csr_interface::colind()'],['../group__API__Data__Interfaces.html#ae92cac03830be5b7ff51e3e3d1c4b76b',1,'starpu_bcsr_interface::colind()']]], ['columns',['columns',['../group__API__Data__Interfaces.html#abf9c037a82b3fdf2efc2127f4760e769',1,'starpu_coo_interface']]], ['compare',['compare',['../group__API__Data__Interfaces.html#abf7ac324c9a9b039ac4dce95f040c6da',1,'starpu_data_interface_ops']]], ['config',['config',['../group__API__SC__Hypervisor.html#a9a2aa297cdeafdd703b84bd380b41a9b',1,'sc_hypervisor_wrapper']]], ['copy_5fmethods',['copy_methods',['../group__API__Data__Interfaces.html#a44f44da5a3984bdefc1514c68aa2a7dd',1,'starpu_data_interface_ops']]], ['cost_5ffunction',['cost_function',['../group__API__Performance__Model.html#a3c8a1a27cd5f58be3303bff86f212233',1,'starpu_perfmodel_per_arch::cost_function()'],['../group__API__Performance__Model.html#a2c4cb6b1ea067722d2b0da3cd35dee62',1,'starpu_perfmodel::cost_function()']]], ['cost_5fmodel',['cost_model',['../group__API__Performance__Model.html#a84007cadc3600f5cac931c7a08cd28f2',1,'starpu_perfmodel_per_arch::cost_model()'],['../group__API__Performance__Model.html#af481763835aad51a2dfed6b0f93869bd',1,'starpu_perfmodel::cost_model()']]], ['cpu_5felemsize',['cpu_elemsize',['../group__API__Multiformat__Data__Interface.html#a790874c06f3253b0cb27d4de543b8acd',1,'starpu_multiformat_data_interface_ops']]], ['cpu_5ffunc',['cpu_func',['../group__API__Codelet__And__Tasks.html#adb0822ae9096f694951828e966ebc30a',1,'starpu_codelet']]], ['cpu_5ffuncs',['cpu_funcs',['../group__API__Codelet__And__Tasks.html#a644e609934cc0fb047e81330a67e88c7',1,'starpu_codelet']]], ['cpu_5fto_5fcuda_5fcl',['cpu_to_cuda_cl',['../group__API__Multiformat__Data__Interface.html#a205e165c6f22a371861da0d59b449049',1,'starpu_multiformat_data_interface_ops']]], ['cpu_5fto_5fopencl_5fcl',['cpu_to_opencl_cl',['../group__API__Multiformat__Data__Interface.html#ad24cb87b72b46f94ec5e37802f0bc816',1,'starpu_multiformat_data_interface_ops']]], ['cuda_5felemsize',['cuda_elemsize',['../group__API__Multiformat__Data__Interface.html#a5221c2e4f1162ea79959a01f2b7b9cf0',1,'starpu_multiformat_data_interface_ops']]], ['cuda_5ffunc',['cuda_func',['../group__API__Codelet__And__Tasks.html#a594cafb9fea78edbab024860c7789281',1,'starpu_codelet']]], ['cuda_5ffuncs',['cuda_funcs',['../group__API__Codelet__And__Tasks.html#a2b8dc6662e11ede5f008666f468fdc0c',1,'starpu_codelet']]], ['cuda_5fopengl_5finteroperability',['cuda_opengl_interoperability',['../group__API__Initialization__and__Termination.html#a9a69a3b4015e3f95750e4906d984aa0b',1,'starpu_conf']]], ['cuda_5fto_5fcpu_5fcl',['cuda_to_cpu_cl',['../group__API__Multiformat__Data__Interface.html#ae947d771eedbf74e5709f358832dce68',1,'starpu_multiformat_data_interface_ops']]], ['cuda_5fto_5fcuda',['cuda_to_cuda',['../group__API__Data__Interfaces.html#a24d51587cdcbeae35f3d93665a4a41e9',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fcuda_5fasync',['cuda_to_cuda_async',['../group__API__Data__Interfaces.html#a0fd5368746ad8e8f093b9a8c01897a5d',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fopencl',['cuda_to_opencl',['../group__API__Data__Interfaces.html#a2b82c72676079d50f8b20f9e498ba0c0',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fram',['cuda_to_ram',['../group__API__Data__Interfaces.html#aa3c6abc514493d97bef5ea134223b351',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fram_5fasync',['cuda_to_ram_async',['../group__API__Data__Interfaces.html#a7db89784dc42811f8805f3950a9ad723',1,'starpu_data_copy_methods']]], ['current_5fidle_5ftime',['current_idle_time',['../group__API__SC__Hypervisor.html#aab7f7cf4560defaa76962057fbdc79ef',1,'sc_hypervisor_wrapper']]], ['cursor',['cursor',['../group__API__Workers__Properties.html#a6bdb4f4653db053cf6a372a19f4ca925',1,'starpu_sched_ctx_iterator']]], ['custom',['custom',['../group__API__SC__Hypervisor.html#a975a6241c01771b6ebedc56da6e3a933',1,'sc_hypervisor_policy']]] ]; starpu-1.1.5/doc/doxygen/html/search/files_73.html0000644000373600000000000000170612571536757016730 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_65.html0000644000373600000000000000170412571536757016375 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_67.js0000644000373600000000000000152612571536757016051 00000000000000var searchData= [ ['get_5fchild_5fops',['get_child_ops',['../group__API__Data__Partition.html#ac6ce9ddd9d874b574d5fa408ffcf5d0f',1,'starpu_data_filter']]], ['get_5fmf_5fops',['get_mf_ops',['../group__API__Data__Interfaces.html#a38e9e1cc6fc43a8cea38cb0d5547fe97',1,'starpu_data_interface_ops']]], ['get_5fnchildren',['get_nchildren',['../group__API__Data__Partition.html#a0abadff12ac4de557c9f7a650e5499b6',1,'starpu_data_filter']]], ['get_5fnext',['get_next',['../group__API__Workers__Properties.html#a9bf130150d2efc5f14c7703f8ce81bc5',1,'starpu_worker_collection']]], ['get_5fsize',['get_size',['../group__API__Data__Interfaces.html#a00fc59e147cc76ba7c75251513cb4fe4',1,'starpu_data_interface_ops']]], ['granularity',['granularity',['../group__API__SC__Hypervisor.html#afe75ee5e11144af39796d8adefa1c1dd',1,'sc_hypervisor_policy_config']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_6e.html0000644000373600000000000000171212571536757017654 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_6d.html0000644000373600000000000000170612571536757017005 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_63.js0000644000373600000000000001462412571536757016050 00000000000000var searchData= [ ['codelet_20and_20tasks',['Codelet And Tasks',['../group__API__Codelet__And__Tasks.html',1,'']]], ['cuda_20extensions',['CUDA Extensions',['../group__API__CUDA__Extensions.html',1,'']]], ['c',['c',['../group__API__Data__Interfaces.html#a622f3221a388eecda2fc452e2fafcbb2',1,'starpu_bcsr_interface::c()'],['../group__API__Performance__Model.html#a4df8c2989505143f07fb7afc98764f5d',1,'starpu_perfmodel_regression_model::c()']]], ['calibrate',['calibrate',['../group__API__Initialization__and__Termination.html#a7ee147999f32aaaff9fe468492a24661',1,'starpu_conf']]], ['callback',['callback',['../group__API__StarPUTop__Interface.html#ab208164723f8bd9560ccc5ce32ce4baf',1,'starpu_top_param']]], ['callback_5farg',['callback_arg',['../group__API__Codelet__And__Tasks.html#a96aace28d89ee531fc49c9f4f76bd73f',1,'starpu_task']]], ['callback_5farg_5ffree',['callback_arg_free',['../group__API__Codelet__And__Tasks.html#aead0063a37eb83b9ec862cfbe372ab40',1,'starpu_task']]], ['callback_5fend_5ftime',['callback_end_time',['../group__API__Profiling.html#ac8c627983ee00a19fcc596cb5e31b267',1,'starpu_profiling_task_info']]], ['callback_5ffunc',['callback_func',['../group__API__Codelet__And__Tasks.html#ade9326506a2c15a12d0c06770fa58167',1,'starpu_task']]], ['callback_5fstart_5ftime',['callback_start_time',['../group__API__Profiling.html#a616566b574c302570b05891c8a535e8b',1,'starpu_profiling_task_info']]], ['can_5fcopy',['can_copy',['../group__API__Data__Interfaces.html#a9156d059ec58222bb9f46f4c391f5ab6',1,'starpu_data_copy_methods']]], ['can_5fexecute',['can_execute',['../group__API__Codelet__And__Tasks.html#a3d9d4c5f2578cd6f134de80ccf97594d',1,'starpu_codelet']]], ['c_20extensions',['C Extensions',['../cExtensions.html',1,'']]], ['cl',['cl',['../group__API__Codelet__And__Tasks.html#a2359625ed69b519c04aecdfff3b9f85e',1,'starpu_task::cl()'],['../group__API__SC__Hypervisor.html#a2b5d9d991c03d651ec0b5353d6772696',1,'sc_hypervisor_policy_task_pool::cl()']]], ['cl_5farg',['cl_arg',['../group__API__Codelet__And__Tasks.html#a2706921b9c761ba640a6655609a3ecfe',1,'starpu_task']]], ['cl_5farg_5ffree',['cl_arg_free',['../group__API__Codelet__And__Tasks.html#a571c7e127eab4bcdd4d52224199920ee',1,'starpu_task']]], ['cl_5farg_5fsize',['cl_arg_size',['../group__API__Codelet__And__Tasks.html#a58e6d16df78f9ba6adf5b9849f3b49ef',1,'starpu_task']]], ['colind',['colind',['../group__API__Data__Interfaces.html#ac82dd88dea4232a25a0ac5cdbf33984f',1,'starpu_csr_interface::colind()'],['../group__API__Data__Interfaces.html#ae92cac03830be5b7ff51e3e3d1c4b76b',1,'starpu_bcsr_interface::colind()']]], ['columns',['columns',['../group__API__Data__Interfaces.html#abf9c037a82b3fdf2efc2127f4760e769',1,'starpu_coo_interface']]], ['compare',['compare',['../group__API__Data__Interfaces.html#abf7ac324c9a9b039ac4dce95f040c6da',1,'starpu_data_interface_ops']]], ['compilation_20configuration',['Compilation Configuration',['../CompilationConfiguration.html',1,'']]], ['config',['config',['../group__API__SC__Hypervisor.html#a9a2aa297cdeafdd703b84bd380b41a9b',1,'sc_hypervisor_wrapper']]], ['copy_5fmethods',['copy_methods',['../group__API__Data__Interfaces.html#a44f44da5a3984bdefc1514c68aa2a7dd',1,'starpu_data_interface_ops']]], ['cost_5ffunction',['cost_function',['../group__API__Performance__Model.html#a3c8a1a27cd5f58be3303bff86f212233',1,'starpu_perfmodel_per_arch::cost_function()'],['../group__API__Performance__Model.html#a2c4cb6b1ea067722d2b0da3cd35dee62',1,'starpu_perfmodel::cost_function()']]], ['cost_5fmodel',['cost_model',['../group__API__Performance__Model.html#a84007cadc3600f5cac931c7a08cd28f2',1,'starpu_perfmodel_per_arch::cost_model()'],['../group__API__Performance__Model.html#af481763835aad51a2dfed6b0f93869bd',1,'starpu_perfmodel::cost_model()']]], ['cpu_5felemsize',['cpu_elemsize',['../group__API__Multiformat__Data__Interface.html#a790874c06f3253b0cb27d4de543b8acd',1,'starpu_multiformat_data_interface_ops']]], ['cpu_5ffunc',['cpu_func',['../group__API__Codelet__And__Tasks.html#adb0822ae9096f694951828e966ebc30a',1,'starpu_codelet']]], ['cpu_5ffuncs',['cpu_funcs',['../group__API__Codelet__And__Tasks.html#a644e609934cc0fb047e81330a67e88c7',1,'starpu_codelet']]], ['cpu_5fto_5fcuda_5fcl',['cpu_to_cuda_cl',['../group__API__Multiformat__Data__Interface.html#a205e165c6f22a371861da0d59b449049',1,'starpu_multiformat_data_interface_ops']]], ['cpu_5fto_5fopencl_5fcl',['cpu_to_opencl_cl',['../group__API__Multiformat__Data__Interface.html#ad24cb87b72b46f94ec5e37802f0bc816',1,'starpu_multiformat_data_interface_ops']]], ['cuda_5felemsize',['cuda_elemsize',['../group__API__Multiformat__Data__Interface.html#a5221c2e4f1162ea79959a01f2b7b9cf0',1,'starpu_multiformat_data_interface_ops']]], ['cuda_5ffunc',['cuda_func',['../group__API__Codelet__And__Tasks.html#a594cafb9fea78edbab024860c7789281',1,'starpu_codelet']]], ['cuda_5ffuncs',['cuda_funcs',['../group__API__Codelet__And__Tasks.html#a2b8dc6662e11ede5f008666f468fdc0c',1,'starpu_codelet']]], ['cuda_5fopengl_5finteroperability',['cuda_opengl_interoperability',['../group__API__Initialization__and__Termination.html#a9a69a3b4015e3f95750e4906d984aa0b',1,'starpu_conf']]], ['cuda_5fto_5fcpu_5fcl',['cuda_to_cpu_cl',['../group__API__Multiformat__Data__Interface.html#ae947d771eedbf74e5709f358832dce68',1,'starpu_multiformat_data_interface_ops']]], ['cuda_5fto_5fcuda',['cuda_to_cuda',['../group__API__Data__Interfaces.html#a24d51587cdcbeae35f3d93665a4a41e9',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fcuda_5fasync',['cuda_to_cuda_async',['../group__API__Data__Interfaces.html#a0fd5368746ad8e8f093b9a8c01897a5d',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fopencl',['cuda_to_opencl',['../group__API__Data__Interfaces.html#a2b82c72676079d50f8b20f9e498ba0c0',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fram',['cuda_to_ram',['../group__API__Data__Interfaces.html#aa3c6abc514493d97bef5ea134223b351',1,'starpu_data_copy_methods']]], ['cuda_5fto_5fram_5fasync',['cuda_to_ram_async',['../group__API__Data__Interfaces.html#a7db89784dc42811f8805f3950a9ad723',1,'starpu_data_copy_methods']]], ['current_5fidle_5ftime',['current_idle_time',['../group__API__SC__Hypervisor.html#aab7f7cf4560defaa76962057fbdc79ef',1,'sc_hypervisor_wrapper']]], ['cursor',['cursor',['../group__API__Workers__Properties.html#a6bdb4f4653db053cf6a372a19f4ca925',1,'starpu_sched_ctx_iterator']]], ['custom',['custom',['../group__API__SC__Hypervisor.html#a975a6241c01771b6ebedc56da6e3a933',1,'sc_hypervisor_policy']]] ]; starpu-1.1.5/doc/doxygen/html/search/functions_73.js0000644000373600000000000022270012571536757017305 00000000000000var searchData= [ ['sc_5fhypervisor_5fadd_5fworkers_5fto_5fsched_5fctx',['sc_hypervisor_add_workers_to_sched_ctx',['../group__API__SC__Hypervisor__usage.html#ga886533650f0dbbef618c7fdfa75f9f0e',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fcan_5fresize',['sc_hypervisor_can_resize',['../group__API__SC__Hypervisor.html#gadf5585c656c7db3ee8f7b630b86e25e3',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fctl',['sc_hypervisor_ctl',['../group__API__SC__Hypervisor__usage.html#ga0a4b27500994ca2c56047a7da18c6216',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5ffree_5fsize_5freq',['sc_hypervisor_free_size_req',['../group__API__SC__Hypervisor.html#ga5f34faa17f98f25bd874950ba1a15578',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fget_5fconfig',['sc_hypervisor_get_config',['../group__API__SC__Hypervisor.html#gaf3e884b4995e3dd608120e7fe0e48fae',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fget_5felapsed_5fflops_5fper_5fsched_5fctx',['sc_hypervisor_get_elapsed_flops_per_sched_ctx',['../group__API__SC__Hypervisor.html#ga32444b31927fbc49dc721ecbb66eae28',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fget_5fnsched_5fctxs',['sc_hypervisor_get_nsched_ctxs',['../group__API__SC__Hypervisor.html#ga7136151247abc7aab59ec8e0fe6e5224',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fget_5fpolicy',['sc_hypervisor_get_policy',['../group__API__SC__Hypervisor__usage.html#ga57103c5a62477b730b8d6d9a8f3514c7',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fget_5fsched_5fctxs',['sc_hypervisor_get_sched_ctxs',['../group__API__SC__Hypervisor.html#ga5450aa9edc6b19accef60539bbbd2e08',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fget_5fsize_5freq',['sc_hypervisor_get_size_req',['../group__API__SC__Hypervisor.html#ga1366fc9bb28170e9012dcad441696e52',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fget_5fwrapper',['sc_hypervisor_get_wrapper',['../group__API__SC__Hypervisor.html#gab02cf89fff4e322e47bc96fb3b60b1ac',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5finit',['sc_hypervisor_init',['../group__API__SC__Hypervisor__usage.html#ga15d008933c3c89906f613b3a24fff3cc',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fmove_5fworkers',['sc_hypervisor_move_workers',['../group__API__SC__Hypervisor__usage.html#gaccfcc47b137572f79916bff5d12414d0',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fpost_5fresize_5frequest',['sc_hypervisor_post_resize_request',['../group__API__SC__Hypervisor.html#ga5f2b33a41a697759ee2a222e623f723c',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fregister_5fctx',['sc_hypervisor_register_ctx',['../group__API__SC__Hypervisor__usage.html#ga4c83e2984867267ea8c7da9fbaf23858',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fremove_5fworkers_5ffrom_5fsched_5fctx',['sc_hypervisor_remove_workers_from_sched_ctx',['../group__API__SC__Hypervisor__usage.html#ga37713b9ab6d282f2b705240e630f1a4c',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fsave_5fsize_5freq',['sc_hypervisor_save_size_req',['../group__API__SC__Hypervisor.html#ga960ae31e317c65bfa9cc6a4e539a0c84',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fset_5fconfig',['sc_hypervisor_set_config',['../group__API__SC__Hypervisor.html#ga838703a5d26ea31f7415155ecbf1e490',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fset_5ftype_5fof_5ftask',['sc_hypervisor_set_type_of_task',['../group__API__SC__Hypervisor__usage.html#ga6398be50d801f0fc5ad73506e392d476',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fshutdown',['sc_hypervisor_shutdown',['../group__API__SC__Hypervisor__usage.html#ga07b07d1fe5d41055f451fc92c60361e1',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fsize_5fctxs',['sc_hypervisor_size_ctxs',['../group__API__SC__Hypervisor__usage.html#gadd6bc55408b1f618edb44da49300bb5c',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fstart_5fresize',['sc_hypervisor_start_resize',['../group__API__SC__Hypervisor__usage.html#gae3ad958a1d841587df13c814ce966477',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fstop_5fresize',['sc_hypervisor_stop_resize',['../group__API__SC__Hypervisor__usage.html#gaa1e2878a06847489a4de2f33f62fa1af',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5funregister_5fctx',['sc_hypervisor_unregister_ctx',['../group__API__SC__Hypervisor__usage.html#ga0a20609c85fa479c3fd5892399099416',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fupdate_5fdiff_5felapsed_5fflops',['sc_hypervisor_update_diff_elapsed_flops',['../group__API__SC__Hypervisor__usage.html#gac89f5d5eba3f79151ef6b2a0e895f144',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fupdate_5fdiff_5ftotal_5fflops',['sc_hypervisor_update_diff_total_flops',['../group__API__SC__Hypervisor__usage.html#ga4dfbeda855bb8963c5332fdd796c0dcf',1,'sc_hypervisor.h']]], ['starpu_5fasynchronous_5fcopy_5fdisabled',['starpu_asynchronous_copy_disabled',['../group__API__Initialization__and__Termination.html#ga2cf027abaf6581c7baf98f9caeb9e4e5',1,'starpu.h']]], ['starpu_5fasynchronous_5fcuda_5fcopy_5fdisabled',['starpu_asynchronous_cuda_copy_disabled',['../group__API__Initialization__and__Termination.html#ga994d261c0ac05522b02ed3ab72dce2bd',1,'starpu.h']]], ['starpu_5fasynchronous_5fopencl_5fcopy_5fdisabled',['starpu_asynchronous_opencl_copy_disabled',['../group__API__Initialization__and__Termination.html#ga8a817e603dd7ce77a7712f7c981da081',1,'starpu.h']]], ['starpu_5fbcsr_5fdata_5fregister',['starpu_bcsr_data_register',['../group__API__Data__Interfaces.html#ga336c1bc150930da84a2abc7d146839c3',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5ffilter_5fcanonical_5fblock',['starpu_bcsr_filter_canonical_block',['../group__API__Data__Partition.html#ga0e1bee4821237529d554605d333e9109',1,'starpu_data_filters.h']]], ['starpu_5fbcsr_5fget_5fc',['starpu_bcsr_get_c',['../group__API__Data__Interfaces.html#ga6d0c09ee7cd90ac23454ef2040a4bc25',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5felemsize',['starpu_bcsr_get_elemsize',['../group__API__Data__Interfaces.html#ga40f5b44c5d9bfd39f2f305aa32a25787',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5ffirstentry',['starpu_bcsr_get_firstentry',['../group__API__Data__Interfaces.html#ga8c04948b40dc3902e9b3de7a84383381',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5flocal_5fcolind',['starpu_bcsr_get_local_colind',['../group__API__Data__Interfaces.html#ga54dca826f319369d94c4cd6be0eb4828',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5flocal_5fnzval',['starpu_bcsr_get_local_nzval',['../group__API__Data__Interfaces.html#gae48e867d81c554b199b127cf9bd4f5b2',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5flocal_5frowptr',['starpu_bcsr_get_local_rowptr',['../group__API__Data__Interfaces.html#ga97859bcb7bc60911362087eefc9249ed',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fnnz',['starpu_bcsr_get_nnz',['../group__API__Data__Interfaces.html#ga8a4c1ddb71e09437717e298c3e2c39f9',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fnrow',['starpu_bcsr_get_nrow',['../group__API__Data__Interfaces.html#gab59c3b606776bdc54f6ccf3f1db4bf38',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fr',['starpu_bcsr_get_r',['../group__API__Data__Interfaces.html#gadcf7063b1cd8d0feed7054e6e4d9d217',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fdata_5fregister',['starpu_block_data_register',['../group__API__Data__Interfaces.html#gab67a02c78b113f6b3e031735418fd838',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5ffilter_5fblock',['starpu_block_filter_block',['../group__API__Data__Partition.html#ga1a265ffca51fae58701832a4daa53bd9',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fblock_5fshadow',['starpu_block_filter_block_shadow',['../group__API__Data__Partition.html#ga7cc8832e25f2f4049ba5a0053b122dd9',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fdepth_5fblock',['starpu_block_filter_depth_block',['../group__API__Data__Partition.html#gaae4f93ab3326ded72c3a80d337e6f4a1',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fdepth_5fblock_5fshadow',['starpu_block_filter_depth_block_shadow',['../group__API__Data__Partition.html#gac4b9ec529f67e5c300e7eed3e185fbaf',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fvertical_5fblock',['starpu_block_filter_vertical_block',['../group__API__Data__Partition.html#ga73a2c9af1200c68f0403e70e36c020d0',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fvertical_5fblock_5fshadow',['starpu_block_filter_vertical_block_shadow',['../group__API__Data__Partition.html#gafa4818b571e98acd8696a1251b0d4e74',1,'starpu_data_filters.h']]], ['starpu_5fblock_5fget_5felemsize',['starpu_block_get_elemsize',['../group__API__Data__Interfaces.html#ga47cea6fc5b88aaa359066e8192fafe95',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5flocal_5fldy',['starpu_block_get_local_ldy',['../group__API__Data__Interfaces.html#gaf1843d7f93510e6bf53da173eb9dd75e',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5flocal_5fldz',['starpu_block_get_local_ldz',['../group__API__Data__Interfaces.html#ga66508648e621019be00d86832d66f278',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5flocal_5fptr',['starpu_block_get_local_ptr',['../group__API__Data__Interfaces.html#ga66df9aff4ea14be546df745f17365568',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fnx',['starpu_block_get_nx',['../group__API__Data__Interfaces.html#ga8599a8f318fcadbafcc55f9c568678f1',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fny',['starpu_block_get_ny',['../group__API__Data__Interfaces.html#ga81b34820b1a410d218ad08528c0317f6',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fnz',['starpu_block_get_nz',['../group__API__Data__Interfaces.html#gac7b7e5f3d4d9a1468df3b9b92743a9fd',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fptr_5fregister',['starpu_block_ptr_register',['../group__API__Data__Interfaces.html#ga8aa19dcac39f053949c1bb1b4f5fad1d',1,'starpu_data_interfaces.h']]], ['starpu_5fbound_5fcompute',['starpu_bound_compute',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga99f073d0ad7604366ef3a8f805b5f060',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint',['starpu_bound_print',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga834aa7094c173d42985d4d70f1694f57',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint_5fdot',['starpu_bound_print_dot',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga7fc9141929ef926d346431307afb0ff1',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint_5flp',['starpu_bound_print_lp',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga066ce2e396d5b676af7a5209b0079610',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint_5fmps',['starpu_bound_print_mps',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#gad0cf05d0bb9b21964fb911cfebf252df',1,'starpu_bound.h']]], ['starpu_5fbound_5fstart',['starpu_bound_start',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga284f3571becb60b2354cc1ce121e4778',1,'starpu_bound.h']]], ['starpu_5fbound_5fstop',['starpu_bound_stop',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga5f1859599a28105aea4c0f33fd871218',1,'starpu_bound.h']]], ['starpu_5fbus_5fget_5fcount',['starpu_bus_get_count',['../group__API__Profiling.html#ga8dc4665fdbbbf8ce8f1b905aa8411642',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fdst',['starpu_bus_get_dst',['../group__API__Profiling.html#ga8ded3aa2a94ec7a5cd46e2e70a918c65',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fid',['starpu_bus_get_id',['../group__API__Profiling.html#ga7c70803a54aa1e5b463ebb19110c4aa2',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fprofiling_5finfo',['starpu_bus_get_profiling_info',['../group__API__Profiling.html#ga76ad19fc8b99bcd42d505c76aafae6b6',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fsrc',['starpu_bus_get_src',['../group__API__Profiling.html#ga858f465a2dcbcadb6169a7926e38a4d1',1,'starpu_profiling.h']]], ['starpu_5fbus_5fprint_5faffinity',['starpu_bus_print_affinity',['../group__API__Performance__Model.html#ga712a3e3498f113efb81c42c6b7a48335',1,'starpu_perfmodel.h']]], ['starpu_5fbus_5fprint_5fbandwidth',['starpu_bus_print_bandwidth',['../group__API__Performance__Model.html#gac4075eddef3625eccbbc9f1670c69244',1,'starpu_perfmodel.h']]], ['starpu_5fcodelet_5fdisplay_5fstats',['starpu_codelet_display_stats',['../group__API__Codelet__And__Tasks.html#ga0e7db78b32d57db548555c1425808dd0',1,'starpu_task.h']]], ['starpu_5fcodelet_5finit',['starpu_codelet_init',['../group__API__Codelet__And__Tasks.html#ga46b34c28e0b9b2e1726b9d033639dda7',1,'starpu_task.h']]], ['starpu_5fcodelet_5fpack_5fargs',['starpu_codelet_pack_args',['../group__API__Insert__Task.html#ga083f02c3ed2a1ab58058ba17e36e773b',1,'starpu_task_util.h']]], ['starpu_5fcodelet_5funpack_5fargs',['starpu_codelet_unpack_args',['../group__API__Insert__Task.html#gaa2e8c2206e1ea56aec65b09efb82f13a',1,'starpu_task_util.h']]], ['starpu_5fcombined_5fworker_5fassign_5fworkerid',['starpu_combined_worker_assign_workerid',['../group__API__Parallel__Tasks.html#ga176c8b45655615fbd09f0b70ba8b78b5',1,'starpu_scheduler.h']]], ['starpu_5fcombined_5fworker_5fcan_5fexecute_5ftask',['starpu_combined_worker_can_execute_task',['../group__API__Parallel__Tasks.html#gae3fe82c940e36715145baa9fe003e453',1,'starpu_scheduler.h']]], ['starpu_5fcombined_5fworker_5fget_5fcount',['starpu_combined_worker_get_count',['../group__API__Parallel__Tasks.html#ga49a6732f413550652450baa64594bc5e',1,'starpu_worker.h']]], ['starpu_5fcombined_5fworker_5fget_5fdescription',['starpu_combined_worker_get_description',['../group__API__Parallel__Tasks.html#ga720a70f5297ffe3b5ea5cf6eff549c8c',1,'starpu_scheduler.h']]], ['starpu_5fcombined_5fworker_5fget_5fid',['starpu_combined_worker_get_id',['../group__API__Parallel__Tasks.html#gae53499613fb72e9aa1abad6437a926f9',1,'starpu_worker.h']]], ['starpu_5fcombined_5fworker_5fget_5frank',['starpu_combined_worker_get_rank',['../group__API__Parallel__Tasks.html#ga4eb5aaf2f4e0c9a7f07cbc80f3ae9664',1,'starpu_worker.h']]], ['starpu_5fcombined_5fworker_5fget_5fsize',['starpu_combined_worker_get_size',['../group__API__Parallel__Tasks.html#ga573d2513a10cf1d14fee0467eda0884d',1,'starpu_worker.h']]], ['starpu_5fconf_5finit',['starpu_conf_init',['../group__API__Initialization__and__Termination.html#ga7f7f154a1bf9600b8ccd10436412660e',1,'starpu.h']]], ['starpu_5fcoo_5fdata_5fregister',['starpu_coo_data_register',['../group__API__Data__Interfaces.html#gace26ae5c977d1fd0fbea538b582bab43',1,'starpu_data_interfaces.h']]], ['starpu_5fcpu_5fworker_5fget_5fcount',['starpu_cpu_worker_get_count',['../group__API__Workers__Properties.html#ga8c4e370ff327c38a3ec79c9249ab233a',1,'starpu_worker.h']]], ['starpu_5fcreate_5fsync_5ftask',['starpu_create_sync_task',['../group__API__Codelet__And__Tasks.html#ga8b83ae8b1c2015f961e60627d4913549',1,'starpu_task_util.h']]], ['starpu_5fcsr_5fdata_5fregister',['starpu_csr_data_register',['../group__API__Data__Interfaces.html#ga81426fc1860aabaefed1a33946df6f51',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5ffilter_5fvertical_5fblock',['starpu_csr_filter_vertical_block',['../group__API__Data__Partition.html#ga554a2fb14fdee9353364c39f36ee3a6f',1,'starpu_data_filters.h']]], ['starpu_5fcsr_5fget_5felemsize',['starpu_csr_get_elemsize',['../group__API__Data__Interfaces.html#gab328b8e0b234147ebe36ceb8e7a55b0a',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5ffirstentry',['starpu_csr_get_firstentry',['../group__API__Data__Interfaces.html#ga40f2d8762bc1060e939eecae75f9be08',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5flocal_5fcolind',['starpu_csr_get_local_colind',['../group__API__Data__Interfaces.html#gad5ffed03f141096fca4e1e2583c84e22',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5flocal_5fnzval',['starpu_csr_get_local_nzval',['../group__API__Data__Interfaces.html#ga4f137b139435d4cddcd15704fe46cbbd',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5flocal_5frowptr',['starpu_csr_get_local_rowptr',['../group__API__Data__Interfaces.html#ga78a31ef2148b8439a2c0e897d9179b84',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fnnz',['starpu_csr_get_nnz',['../group__API__Data__Interfaces.html#ga66106513707ed71b8849b1c1bbb3df75',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fnrow',['starpu_csr_get_nrow',['../group__API__Data__Interfaces.html#ga72c9db50152ed5bf9f18ad3a355c5376',1,'starpu_data_interfaces.h']]], ['starpu_5fcublas_5finit',['starpu_cublas_init',['../group__API__CUDA__Extensions.html#ga9f70358bd39f2228d7b0558702306d96',1,'starpu_cublas.h']]], ['starpu_5fcublas_5fshutdown',['starpu_cublas_shutdown',['../group__API__CUDA__Extensions.html#ga3cd8378588620422bc6c3246016ffcd8',1,'starpu_cublas.h']]], ['starpu_5fcuda_5fcopy_5fasync_5fsync',['starpu_cuda_copy_async_sync',['../group__API__CUDA__Extensions.html#ga20c5b69812878a57e22f4f3c5cc8f56f',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fget_5fdevice_5fproperties',['starpu_cuda_get_device_properties',['../group__API__CUDA__Extensions.html#ga71b71760c8b71cb6c3f0dc7495c84036',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fget_5flocal_5fstream',['starpu_cuda_get_local_stream',['../group__API__CUDA__Extensions.html#gad7d80d054bd2b9570e1d7e24442e19c0',1,'starpu_cuda.h']]], ['starpu_5fcuda_5freport_5ferror',['starpu_cuda_report_error',['../group__API__CUDA__Extensions.html#ga08ef1dd9623d7adb87cede9e60d3e1dc',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fset_5fdevice',['starpu_cuda_set_device',['../group__API__CUDA__Extensions.html#ga3b170653608d3381b660afba63be39da',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fworker_5fget_5fcount',['starpu_cuda_worker_get_count',['../group__API__Workers__Properties.html#gacb9d262c066c047ae55f691adc876db3',1,'starpu_worker.h']]], ['starpu_5fdata_5facquire',['starpu_data_acquire',['../group__API__Data__Management.html#gae6eb535cf9bf46a7ef9ad2d845c675a2',1,'starpu_data.h']]], ['starpu_5fdata_5facquire_5fcb',['starpu_data_acquire_cb',['../group__API__Data__Management.html#ga358aba7459b7f99a6dbaa189ce57b925',1,'starpu_data.h']]], ['starpu_5fdata_5fadvise_5fas_5fimportant',['starpu_data_advise_as_important',['../group__API__Data__Management.html#gaedc8031c1b437d35232cd1700d83d472',1,'starpu_data.h']]], ['starpu_5fdata_5fcpy',['starpu_data_cpy',['../group__API__Miscellaneous__Helpers.html#gaaff4ecf5818fd6f8d005f6bf57b0eb4b',1,'starpu_util.h']]], ['starpu_5fdata_5fdisplay_5fmemory_5fstats',['starpu_data_display_memory_stats',['../group__API__Profiling.html#ga6b93e19cf6ddd63d7eaee6749a7bdcf1',1,'starpu_data.h']]], ['starpu_5fdata_5fexpected_5ftransfer_5ftime',['starpu_data_expected_transfer_time',['../group__API__Scheduling__Policy.html#ga1e159d56ffa2d7705bdfd1ceb93e0d64',1,'starpu_scheduler.h']]], ['starpu_5fdata_5fget_5fchild',['starpu_data_get_child',['../group__API__Data__Partition.html#ga29e07c2c0604da63e7746a8018d8a62f',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fget_5fdefault_5fsequential_5fconsistency_5fflag',['starpu_data_get_default_sequential_consistency_flag',['../group__API__Implicit__Data__Dependencies.html#gaef7203edaf1725977dffac23296ede4e',1,'starpu_data.h']]], ['starpu_5fdata_5fget_5finterface_5fid',['starpu_data_get_interface_id',['../group__API__Data__Interfaces.html#gad6ca41b04e0265671d4bf899dd433c1e',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5finterface_5fon_5fnode',['starpu_data_get_interface_on_node',['../group__API__Data__Interfaces.html#gab6e12b04b231773f2eff496f57d29ee8',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5flocal_5fptr',['starpu_data_get_local_ptr',['../group__API__Data__Interfaces.html#gabcce7df711e56cafddfd82f8f5ee794b',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5fnb_5fchildren',['starpu_data_get_nb_children',['../group__API__Data__Partition.html#ga6a3f729055f14384e7397d2815a2c9a5',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fget_5fsize',['starpu_data_get_size',['../group__API__Data__Interfaces.html#gac14cfc52c450c81dd4789a7aace79d3b',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5fsub_5fdata',['starpu_data_get_sub_data',['../group__API__Data__Partition.html#gac24101bbe28b1d7d4a0874d349ba8979',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fhandle_5fto_5fpointer',['starpu_data_handle_to_pointer',['../group__API__Data__Interfaces.html#ga011705e0a88798562f7afb2753a6b1ce',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5finterface_5fget_5fnext_5fid',['starpu_data_interface_get_next_id',['../group__API__Data__Interfaces.html#gaf5ea640f2c977e3ae95a6be9b3be3bee',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5finvalidate',['starpu_data_invalidate',['../group__API__Data__Management.html#ga4e82fe020ec010bcacb6aee16021607c',1,'starpu_data.h']]], ['starpu_5fdata_5finvalidate_5fsubmit',['starpu_data_invalidate_submit',['../group__API__Data__Management.html#ga06b01fdf769f8f2eb222ecde42afbc81',1,'starpu_data.h']]], ['starpu_5fdata_5flookup',['starpu_data_lookup',['../group__API__Data__Management.html#ga75907283eef0a058a040ff06de87b4b2',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fmap_5ffilters',['starpu_data_map_filters',['../group__API__Data__Partition.html#ga551d6fa7fead5b9f7c8a85b1f9885e91',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fpack',['starpu_data_pack',['../group__API__Data__Interfaces.html#gad7e204d690945cbe5145bc8950078291',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fpartition',['starpu_data_partition',['../group__API__Data__Partition.html#ga1363109ba0e36c1b6c7f1a40c9608791',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fprefetch_5fon_5fnode',['starpu_data_prefetch_on_node',['../group__API__Data__Management.html#ga57687b811ced00dbfc35af73164a72aa',1,'starpu_data.h']]], ['starpu_5fdata_5fptr_5fregister',['starpu_data_ptr_register',['../group__API__Data__Management.html#ga1d0a0dc4903585e099b2e4b16a22946a',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fquery_5fstatus',['starpu_data_query_status',['../group__API__Data__Management.html#ga9a6122bae224d714383ae775434cdce3',1,'starpu_data.h']]], ['starpu_5fdata_5fregister',['starpu_data_register',['../group__API__Data__Management.html#ga74d62dfa2a733db4bac71caaae751d9d',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fregister_5fsame',['starpu_data_register_same',['../group__API__Data__Management.html#ga1be29ee257e3d9c3321df759b8105cb1',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5frelease',['starpu_data_release',['../group__API__Data__Management.html#gadc145017bafa2948109c624715de77a2',1,'starpu_data.h']]], ['starpu_5fdata_5frequest_5fallocation',['starpu_data_request_allocation',['../group__API__Data__Management.html#gac561fd637be17b74f0456106dc25f5d1',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5fdefault_5fsequential_5fconsistency_5fflag',['starpu_data_set_default_sequential_consistency_flag',['../group__API__Implicit__Data__Dependencies.html#ga26f17239b14354e61eef0710ffadc434',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5freduction_5fmethods',['starpu_data_set_reduction_methods',['../group__API__Data__Management.html#ga1f5ba1c1cfefc1f81a4095cf3c213e54',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5fsequential_5fconsistency_5fflag',['starpu_data_set_sequential_consistency_flag',['../group__API__Implicit__Data__Dependencies.html#ga273df19e4cad1c05ec5df697bcec4444',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5fwt_5fmask',['starpu_data_set_wt_mask',['../group__API__Data__Management.html#gae53e7b21c7426c9845a1046cfe5becce',1,'starpu_data.h']]], ['starpu_5fdata_5funpack',['starpu_data_unpack',['../group__API__Data__Interfaces.html#ga97c7b78c97576eb44741bdd7e2183fa7',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5funpartition',['starpu_data_unpartition',['../group__API__Data__Partition.html#gae80794b9cad7855a3ee54a4361f656ed',1,'starpu_data_filters.h']]], ['starpu_5fdata_5funregister',['starpu_data_unregister',['../group__API__Data__Management.html#ga586146498466b60d6b81145dfaeb8948',1,'starpu_data.h']]], ['starpu_5fdata_5funregister_5fno_5fcoherency',['starpu_data_unregister_no_coherency',['../group__API__Data__Management.html#gaa1f95d17759711f7703bf02820e2e49b',1,'starpu_data.h']]], ['starpu_5fdata_5funregister_5fsubmit',['starpu_data_unregister_submit',['../group__API__Data__Management.html#ga4fa34753bff1d29c20f0a0e361020b4e',1,'starpu_data.h']]], ['starpu_5fdata_5fvget_5fsub_5fdata',['starpu_data_vget_sub_data',['../group__API__Data__Partition.html#ga7904efb86ab3f9d6d682a3a3be3646fe',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fvmap_5ffilters',['starpu_data_vmap_filters',['../group__API__Data__Partition.html#ga15a28291a5045ef7ed3c93afc94ed248',1,'starpu_data_filters.h']]], ['starpu_5fdriver_5fdeinit',['starpu_driver_deinit',['../group__API__Running__Drivers.html#gac8f8848b64980676190d77d265fda841',1,'starpu_driver.h']]], ['starpu_5fdriver_5finit',['starpu_driver_init',['../group__API__Running__Drivers.html#gab274599ec82fe38cb41267b8a1384995',1,'starpu_driver.h']]], ['starpu_5fdriver_5frun',['starpu_driver_run',['../group__API__Running__Drivers.html#ga68b320765b17e5e4a256f156c9932e69',1,'starpu_driver.h']]], ['starpu_5fdriver_5frun_5fonce',['starpu_driver_run_once',['../group__API__Running__Drivers.html#gad6d01b57f2f84df90f554ea205dcf90d',1,'starpu_driver.h']]], ['starpu_5fdrivers_5frequest_5ftermination',['starpu_drivers_request_termination',['../group__API__Running__Drivers.html#ga497d48a24107dfebf6ef3ad40d4a6df8',1,'starpu_driver.h']]], ['starpu_5fexecute_5fon_5feach_5fworker',['starpu_execute_on_each_worker',['../group__API__Miscellaneous__Helpers.html#ga7a97b0699b97b30b4d408c660be46102',1,'starpu_util.h']]], ['starpu_5ffree',['starpu_free',['../group__API__Standard__Memory__Library.html#ga889e8ea2a1becb4eff634e264973b261',1,'starpu_stdlib.h']]], ['starpu_5ffree_5fflags',['starpu_free_flags',['../group__API__Standard__Memory__Library.html#gad60ddd8514e8ed664ecf1f21ad84e6f5',1,'starpu_stdlib.h']]], ['starpu_5ffree_5fon_5fnode',['starpu_free_on_node',['../group__API__Data__Interfaces.html#ga7e3ef9efbc7a65adad27f9ac27493493',1,'starpu_data_interfaces.h']]], ['starpu_5ffxt_5fgenerate_5ftrace',['starpu_fxt_generate_trace',['../group__API__FxT__Support.html#ga9249a38d77ab128f665b4359ac0c4781',1,'starpu_fxt.h']]], ['starpu_5ffxt_5foptions_5finit',['starpu_fxt_options_init',['../group__API__FxT__Support.html#gaf4a2675d7c5f2dc473879ef0a0a2a114',1,'starpu_fxt.h']]], ['starpu_5ffxt_5fstart_5fprofiling',['starpu_fxt_start_profiling',['../group__API__FxT__Support.html#ga5793bf5c8fc0bedf76d18a5fa38593df',1,'starpu_fxt.h']]], ['starpu_5ffxt_5fstop_5fprofiling',['starpu_fxt_stop_profiling',['../group__API__FxT__Support.html#ga52a3e1a95689315f0b789a3325ec2a90',1,'starpu_fxt.h']]], ['starpu_5fget_5fenv_5fnumber',['starpu_get_env_number',['../group__API__Toolbox.html#gac9eef7c5611291831a56af2134d9945c',1,'starpu_util.h']]], ['starpu_5fget_5fprefetch_5fflag',['starpu_get_prefetch_flag',['../group__API__Scheduling__Policy.html#ga94edfd4a02666d8c1b8c506423586426',1,'starpu_scheduler.h']]], ['starpu_5fget_5fversion',['starpu_get_version',['../group__API__Versioning.html#gaa9151820d2ef6a8231b510b4b3c19ca4',1,'starpu.h']]], ['starpu_5fhash_5fcrc32c_5fbe',['starpu_hash_crc32c_be',['../group__API__Data__Interfaces.html#gaa29d5f4bd11fce82cd9a01b0e860bf75',1,'starpu_hash.h']]], ['starpu_5fhash_5fcrc32c_5fbe_5fn',['starpu_hash_crc32c_be_n',['../group__API__Data__Interfaces.html#ga86956bce305447697cb9346bee692b24',1,'starpu_hash.h']]], ['starpu_5fhash_5fcrc32c_5fstring',['starpu_hash_crc32c_string',['../group__API__Data__Interfaces.html#gaec6ca64cc2c52e319b9b73cc4f753658',1,'starpu_hash.h']]], ['starpu_5finit',['starpu_init',['../group__API__Initialization__and__Termination.html#ga9ce171bcbbee2edd169ba2649e6e75e3',1,'starpu.h']]], ['starpu_5finsert_5ftask',['starpu_insert_task',['../group__API__Insert__Task.html#ga2e9916071a4b6d60ae0b3c45854e4c9c',1,'starpu_task_util.h']]], ['starpu_5finterface_5fcopy',['starpu_interface_copy',['../group__API__Data__Interfaces.html#ga7af8e4f90b557fefaa09f40a930efd74',1,'starpu_data_interfaces.h']]], ['starpu_5fmalloc',['starpu_malloc',['../group__API__Standard__Memory__Library.html#ga49603eaea3b05e8ced9ba1bd873070c3',1,'starpu_stdlib.h']]], ['starpu_5fmalloc_5fflags',['starpu_malloc_flags',['../group__API__Standard__Memory__Library.html#gaebaa5a1503be11ba7da92f72a8e601b2',1,'starpu_stdlib.h']]], ['starpu_5fmalloc_5fon_5fnode',['starpu_malloc_on_node',['../group__API__Data__Interfaces.html#gab91cbc596a65e6a4322b657c79934269',1,'starpu_data_interfaces.h']]], ['starpu_5fmalloc_5fset_5falign',['starpu_malloc_set_align',['../group__API__Standard__Memory__Library.html#ga52ec305b6afdd76130a4f6877e23849c',1,'starpu_stdlib.h']]], ['starpu_5fmatrix_5fdata_5fregister',['starpu_matrix_data_register',['../group__API__Data__Interfaces.html#ga7af287b9089acc7cf4b3b7ed19d82abb',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5ffilter_5fblock',['starpu_matrix_filter_block',['../group__API__Data__Partition.html#ga8c86b2af9e0806e631c1cbb5d506506b',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5ffilter_5fblock_5fshadow',['starpu_matrix_filter_block_shadow',['../group__API__Data__Partition.html#ga88fbca61843b76314e39a2c0f8b93d6c',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5ffilter_5fvertical_5fblock',['starpu_matrix_filter_vertical_block',['../group__API__Data__Partition.html#ga2925be576ac7d597ecead381ff32a894',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5ffilter_5fvertical_5fblock_5fshadow',['starpu_matrix_filter_vertical_block_shadow',['../group__API__Data__Partition.html#ga7132923bd901e0e4254cc0b20d49997a',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5fget_5felemsize',['starpu_matrix_get_elemsize',['../group__API__Data__Interfaces.html#gaebeefdd9980c18575924ed9860315bcf',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5flocal_5fld',['starpu_matrix_get_local_ld',['../group__API__Data__Interfaces.html#ga5c4dfa96a4ffa7be08e22a9dc20484e4',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5flocal_5fptr',['starpu_matrix_get_local_ptr',['../group__API__Data__Interfaces.html#ga9f6457e4a7e558101dd6ad64076a6a99',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5fnx',['starpu_matrix_get_nx',['../group__API__Data__Interfaces.html#ga461a1d65e0f4559dacbc1ba77eafbb2b',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5fny',['starpu_matrix_get_ny',['../group__API__Data__Interfaces.html#ga720fcf673578ec23e583b5f674626847',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fptr_5fregister',['starpu_matrix_ptr_register',['../group__API__Data__Interfaces.html#ga22a8126d41b43e71c3c79e210401b12e',1,'starpu_data_interfaces.h']]], ['starpu_5fmemory_5fget_5favailable',['starpu_memory_get_available',['../group__API__Standard__Memory__Library.html#ga13b23ecc431501f8aebcb7b498acd92b',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5fget_5ftotal',['starpu_memory_get_total',['../group__API__Standard__Memory__Library.html#ga552a99a9bb5c02acd10ed744c9c00a9d',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5fpin',['starpu_memory_pin',['../group__API__Standard__Memory__Library.html#ga5a6ea6d03d7b0f4a97a8046b30ecd0bb',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5funpin',['starpu_memory_unpin',['../group__API__Standard__Memory__Library.html#ga3506e4b5ab7a605e25968883ded27d64',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5fwait_5favailable',['starpu_memory_wait_available',['../group__API__Standard__Memory__Library.html#ga71ec84f082fd96f53612e684eda0e178',1,'starpu_stdlib.h']]], ['starpu_5fmpi_5fbarrier',['starpu_mpi_barrier',['../group__API__MPI__Support.html#ga77aa675b91da2a069caeebdb11a3edc9',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fflush',['starpu_mpi_cache_flush',['../group__API__MPI__Support.html#gacb05635d95f946f099a1772c8bd59c8b',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fflush_5fall_5fdata',['starpu_mpi_cache_flush_all_data',['../group__API__MPI__Support.html#gadf1f289d1cf35bd31df930bc347fb9ce',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fis_5fenabled',['starpu_mpi_cache_is_enabled',['../group__API__MPI__Support.html#gac0558236c9fb4cfc333f413c0ca191a9',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fset',['starpu_mpi_cache_set',['../group__API__MPI__Support.html#ga82dceaf1ad42b9a0ab4ed22f9c03b1a8',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcomm_5famounts_5fretrieve',['starpu_mpi_comm_amounts_retrieve',['../group__API__MPI__Support.html#ga3a6dcddd7eaf6cd3265fd837d67800a2',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fdata_5fget_5frank',['starpu_mpi_data_get_rank',['../group__API__MPI__Support.html#ga0a464b972068bac652622d6a1ed0a996',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fdata_5fget_5ftag',['starpu_mpi_data_get_tag',['../group__API__MPI__Support.html#gacf1e74720ea6884fd8d1ded3cb4eaae9',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fdata_5fregister_5fcomm',['starpu_mpi_data_register_comm',['../group__API__MPI__Support.html#ga2b0587b6cb0dce79fb5ef3b29a0fbf6b',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fgather_5fdetached',['starpu_mpi_gather_detached',['../group__API__MPI__Support.html#gaf83405a3154137f00ccf554c5e5684b5',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fget_5fdata_5fon_5fnode',['starpu_mpi_get_data_on_node',['../group__API__MPI__Support.html#ga0ca9fc89dc1315bf32f38cd14caf24a5',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fget_5fdata_5fon_5fnode_5fdetached',['starpu_mpi_get_data_on_node_detached',['../group__API__MPI__Support.html#ga6c581f7133773a98b583e0c51970ecb7',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finit',['starpu_mpi_init',['../group__API__MPI__Support.html#ga008d0df24380455d6b9301ae750ccd4c',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finitialize',['starpu_mpi_initialize',['../group__API__MPI__Support.html#ga0ec1ce958654468b20224c9ae772f98f',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finitialize_5fextended',['starpu_mpi_initialize_extended',['../group__API__MPI__Support.html#ga234e28905c976ed1b03fcdf75812a06d',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finsert_5ftask',['starpu_mpi_insert_task',['../group__API__MPI__Support.html#ga04229edbc905be8eefce8fb58bfccf8f',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv',['starpu_mpi_irecv',['../group__API__MPI__Support.html#gabb6c92b51c1e76408e0816385fde75c5',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv_5farray_5fdetached_5funlock_5ftag',['starpu_mpi_irecv_array_detached_unlock_tag',['../group__API__MPI__Support.html#ga11f71926b324d325d8a6f6b72b58cdf1',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv_5fdetached',['starpu_mpi_irecv_detached',['../group__API__MPI__Support.html#gabdf54ffd31c0b0908d7751e1b2257897',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv_5fdetached_5funlock_5ftag',['starpu_mpi_irecv_detached_unlock_tag',['../group__API__MPI__Support.html#ga6cbbe5e484f38cb5e4e601330f2c5b0d',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend',['starpu_mpi_isend',['../group__API__MPI__Support.html#gafc29de4080f202511f2b558673304b8c',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend_5farray_5fdetached_5funlock_5ftag',['starpu_mpi_isend_array_detached_unlock_tag',['../group__API__MPI__Support.html#ga546dbbe7e9e40817b23bd37fb0eccfe1',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend_5fdetached',['starpu_mpi_isend_detached',['../group__API__MPI__Support.html#gae9506ceb82e72ab1096ac8443dbf13e4',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend_5fdetached_5funlock_5ftag',['starpu_mpi_isend_detached_unlock_tag',['../group__API__MPI__Support.html#gae6957a62f85340484cbcebbf65b573c4',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fissend',['starpu_mpi_issend',['../group__API__MPI__Support.html#ga8374cb42eb85e86e58ccfa8e0c5e8aab',1,'starpu_mpi.h']]], ['starpu_5fmpi_5frecv',['starpu_mpi_recv',['../group__API__MPI__Support.html#gaa92438804968616ed4fee7246ec254aa',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fredux_5fdata',['starpu_mpi_redux_data',['../group__API__MPI__Support.html#ga565996704c6707a55410488f8d569357',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fscatter_5fdetached',['starpu_mpi_scatter_detached',['../group__API__MPI__Support.html#ga39ae075749aef08653ade368b9a95ee0',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fsend',['starpu_mpi_send',['../group__API__MPI__Support.html#gaca01fd4db21aebb91da808a3d03f36dc',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fshutdown',['starpu_mpi_shutdown',['../group__API__MPI__Support.html#ga87b22900dc132a958a0f7bce68d32153',1,'starpu_mpi.h']]], ['starpu_5fmpi_5ftest',['starpu_mpi_test',['../group__API__MPI__Support.html#gae8e8389eb3e916131946028e9ebee670',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fwait',['starpu_mpi_wait',['../group__API__MPI__Support.html#gaad03f0a288bad79078045130b9a83188',1,'starpu_mpi.h']]], ['starpu_5fmultiformat_5fdata_5fregister',['starpu_multiformat_data_register',['../group__API__Multiformat__Data__Interface.html#gae36d714a8bf065925923a35fd6fd4ae5',1,'starpu_data_interfaces.h']]], ['starpu_5fnode_5fget_5fkind',['starpu_node_get_kind',['../group__API__Workers__Properties.html#ga9b2541fc1a20c4c486c499af01a3283c',1,'starpu_data.h']]], ['starpu_5fopencl_5fcollect_5fstats',['starpu_opencl_collect_stats',['../group__API__OpenCL__Extensions.html#gaeaabc8e5d90531a21a8307c06c659984',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcompile_5fopencl_5ffrom_5ffile',['starpu_opencl_compile_opencl_from_file',['../group__API__OpenCL__Extensions.html#ga03f34ac98495afc5d0f268e366f80598',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcompile_5fopencl_5ffrom_5fstring',['starpu_opencl_compile_opencl_from_string',['../group__API__OpenCL__Extensions.html#gac543428352d04b3ff8f735cfc71c3b99',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fasync_5fsync',['starpu_opencl_copy_async_sync',['../group__API__OpenCL__Extensions.html#ga95184b2188d67976e00bcb4637ac1933',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fopencl_5fto_5fopencl',['starpu_opencl_copy_opencl_to_opencl',['../group__API__OpenCL__Extensions.html#ga002e85a0f6bcd087df54287de5ae5e07',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fopencl_5fto_5fram',['starpu_opencl_copy_opencl_to_ram',['../group__API__OpenCL__Extensions.html#ga2bd30ada22e761a6b889f0661b54592f',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fram_5fto_5fopencl',['starpu_opencl_copy_ram_to_opencl',['../group__API__OpenCL__Extensions.html#ga9a1331f26cc54a1f5406770f68b95d29',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fdisplay_5ferror',['starpu_opencl_display_error',['../group__API__OpenCL__Extensions.html#ga9e0073e4c839eec6096f6eeca21d7e36',1,'starpu_opencl.h']]], ['starpu_5fopencl_5ferror_5fstring',['starpu_opencl_error_string',['../group__API__OpenCL__Extensions.html#ga7f8e1507dec24eaa7427923bbacb873f',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fcontext',['starpu_opencl_get_context',['../group__API__OpenCL__Extensions.html#ga7ad0ab374a65417ae3d3a9ceed8f24c4',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fcurrent_5fcontext',['starpu_opencl_get_current_context',['../group__API__OpenCL__Extensions.html#gad18d6a0dfbfadcb0fe0b2be6294aa87d',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fcurrent_5fqueue',['starpu_opencl_get_current_queue',['../group__API__OpenCL__Extensions.html#gab43c1f30361aaa72ca98a9a9fdec792b',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fdevice',['starpu_opencl_get_device',['../group__API__OpenCL__Extensions.html#ga84a524eaac758722f083ee129a19a567',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fqueue',['starpu_opencl_get_queue',['../group__API__OpenCL__Extensions.html#ga8318641373e06a2a635cb3ab377c5994',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fbinary_5fopencl',['starpu_opencl_load_binary_opencl',['../group__API__OpenCL__Extensions.html#ga893f462bfed53eff3a54f341488db7ad',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fkernel',['starpu_opencl_load_kernel',['../group__API__OpenCL__Extensions.html#ga1d06b6c00b15f4fcd8d4c0c998f955ac',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fopencl_5ffrom_5ffile',['starpu_opencl_load_opencl_from_file',['../group__API__OpenCL__Extensions.html#ga3441dd1c6e61717dd81a3a6eb0bf75a8',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fopencl_5ffrom_5fstring',['starpu_opencl_load_opencl_from_string',['../group__API__OpenCL__Extensions.html#ga9768e086b947961c9db5199e676f05db',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fprogram_5fsource',['starpu_opencl_load_program_source',['../group__API__OpenCL__Extensions.html#ga7dd3784262c0be223394bc8c2fe81935',1,'starpu_opencl.h']]], ['starpu_5fopencl_5frelease_5fkernel',['starpu_opencl_release_kernel',['../group__API__OpenCL__Extensions.html#ga68adf424491ec715e891000fa4a6030d',1,'starpu_opencl.h']]], ['starpu_5fopencl_5freport_5ferror',['starpu_opencl_report_error',['../group__API__OpenCL__Extensions.html#ga15f6e4c82407cd3c16e461fc2f129a40',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fset_5fkernel_5fargs',['starpu_opencl_set_kernel_args',['../group__API__OpenCL__Extensions.html#ga80f968f210417eb9fbf2bfe82e1953a9',1,'starpu_opencl.h']]], ['starpu_5fopencl_5funload_5fopencl',['starpu_opencl_unload_opencl',['../group__API__OpenCL__Extensions.html#gaa38e7cb3231ed30303e50f46c8f6e39c',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fworker_5fget_5fcount',['starpu_opencl_worker_get_count',['../group__API__Workers__Properties.html#ga0dd6ff2d77c6a520a6cc4c051eb40bfa',1,'starpu_worker.h']]], ['starpu_5fparallel_5ftask_5fbarrier_5finit',['starpu_parallel_task_barrier_init',['../group__API__Parallel__Tasks.html#ga3d362cb0de1da4e2659f602eff325479',1,'starpu_task.h']]], ['starpu_5fparallel_5ftask_5fbarrier_5finit_5fn',['starpu_parallel_task_barrier_init_n',['../group__API__Parallel__Tasks.html#gaf99bc08bf6f586b658febdd1dc6fef80',1,'starpu_task.h']]], ['starpu_5fpause',['starpu_pause',['../group__API__Initialization__and__Termination.html#ga1796b8121a83d544d146b22daf216387',1,'starpu.h']]], ['starpu_5fperfmodel_5fdebugfilepath',['starpu_perfmodel_debugfilepath',['../group__API__Performance__Model.html#ga7b23c06e84bdacf454e0da8b962023c2',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fdirectory',['starpu_perfmodel_directory',['../group__API__Performance__Model.html#gaf67943252fb8e637d56f0d84f75334eb',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5ffree_5fsampling_5fdirectories',['starpu_perfmodel_free_sampling_directories',['../group__API__Performance__Model.html#ga4da8a63a264195f54ccaa9f49d188897',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fget_5farch_5fname',['starpu_perfmodel_get_arch_name',['../group__API__Performance__Model.html#ga769faede1986dec6f9eed89998e941a4',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5flist',['starpu_perfmodel_list',['../group__API__Performance__Model.html#ga7562bd09e4894eeb15391f2a0f21cf00',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fload_5fsymbol',['starpu_perfmodel_load_symbol',['../group__API__Performance__Model.html#ga5ab7213f5c229c16e783004853fcba4c',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fprint',['starpu_perfmodel_print',['../group__API__Performance__Model.html#ga865fd82e884a5bdf85f99deb83612975',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fprint_5fall',['starpu_perfmodel_print_all',['../group__API__Performance__Model.html#gab70e8b18742e868e5f6505814938bdd1',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5funload_5fmodel',['starpu_perfmodel_unload_model',['../group__API__Performance__Model.html#ga96746e1665eeffec32a82a465325f7dc',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fupdate_5fhistory',['starpu_perfmodel_update_history',['../group__API__Performance__Model.html#ga5b62043c9f7995a83c7972d98e684c6f',1,'starpu_perfmodel.h']]], ['starpu_5fprefetch_5ftask_5finput_5fon_5fnode',['starpu_prefetch_task_input_on_node',['../group__API__Scheduling__Policy.html#ga3bf8df94c9ea3f1370b53fff54e72888',1,'starpu_scheduler.h']]], ['starpu_5fprofiling_5fbus_5fhelper_5fdisplay_5fsummary',['starpu_profiling_bus_helper_display_summary',['../group__API__Profiling.html#ga6511f50290edcabbdf605a1b74746645',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5finit',['starpu_profiling_init',['../group__API__Profiling.html#ga57faec3e3c84069a741b420cecc0efd3',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fset_5fid',['starpu_profiling_set_id',['../group__API__Profiling.html#gad126fc77826a0472b6bd872e7ceb40d4',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fstatus_5fget',['starpu_profiling_status_get',['../group__API__Profiling.html#gaf014e2e050ebd38bc4cffec0081f96bf',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fstatus_5fset',['starpu_profiling_status_set',['../group__API__Profiling.html#gabeb22bbe8062a45507cfc6273aae51ae',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fworker_5fget_5finfo',['starpu_profiling_worker_get_info',['../group__API__Profiling.html#ga8a423df93ec48a7391b2f439357a5544',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fworker_5fhelper_5fdisplay_5fsummary',['starpu_profiling_worker_helper_display_summary',['../group__API__Profiling.html#ga4e4f9fb593d29219a1109062ba9d72ef',1,'starpu_profiling.h']]], ['starpu_5fprogression_5fhook_5fderegister',['starpu_progression_hook_deregister',['../group__API__Expert__Mode.html#ga5d52c35e46e387eed77dd9b7b39507a7',1,'starpu_expert.h']]], ['starpu_5fprogression_5fhook_5fregister',['starpu_progression_hook_register',['../group__API__Expert__Mode.html#ga4e8d1e607b2383f80b232c27ec6a9386',1,'starpu_expert.h']]], ['starpu_5fpthread_5fattr_5fdestroy',['starpu_pthread_attr_destroy',['../group__API__Threads.html#ga0a47c0f221c5d06bd2060be964fbaeb2',1,'starpu_thread.h']]], ['starpu_5fpthread_5fattr_5finit',['starpu_pthread_attr_init',['../group__API__Threads.html#gaffe50be0f786d9a529a9946171469879',1,'starpu_thread.h']]], ['starpu_5fpthread_5fattr_5fsetdetachstate',['starpu_pthread_attr_setdetachstate',['../group__API__Threads.html#ga4b4dc49f4d02c93e9b5364e9fb8f148f',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5fbroadcast',['starpu_pthread_cond_broadcast',['../group__API__Threads.html#ga564bcbc71208d2b7636ebb1cc5738ec6',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5fdestroy',['starpu_pthread_cond_destroy',['../group__API__Threads.html#ga23c628e2ce5d4d461c4f74d5b87f56d7',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5finit',['starpu_pthread_cond_init',['../group__API__Threads.html#gab76ecd1362bef463573d4efb207490fb',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5fsignal',['starpu_pthread_cond_signal',['../group__API__Threads.html#gab118c44d65bf1b0367eae9b02dd65380',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5ftimedwait',['starpu_pthread_cond_timedwait',['../group__API__Threads.html#gaeabcbc8c9aa04f7db8c5486eb4a5b40e',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5fwait',['starpu_pthread_cond_wait',['../group__API__Threads.html#gab4b26829e22eeb9fe23f3f5e15a9e80c',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcreate',['starpu_pthread_create',['../group__API__Threads.html#ga670ae411d7536934d784c88c6d11177c',1,'starpu_thread.h']]], ['starpu_5fpthread_5fgetspecific',['starpu_pthread_getspecific',['../group__API__Threads.html#gac88e8ffb09493e5b07c26be794a39613',1,'starpu_thread.h']]], ['starpu_5fpthread_5fjoin',['starpu_pthread_join',['../group__API__Threads.html#ga9d53e88546b413acd8b1312acd885966',1,'starpu_thread.h']]], ['starpu_5fpthread_5fkey_5fcreate',['starpu_pthread_key_create',['../group__API__Threads.html#ga28942688ecde4a23020c9ad0e2051151',1,'starpu_thread.h']]], ['starpu_5fpthread_5fkey_5fdelete',['starpu_pthread_key_delete',['../group__API__Threads.html#ga1a9e6ff32713348b5aee92bf00717639',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5fdestroy',['starpu_pthread_mutex_destroy',['../group__API__Threads.html#gadecb508e5f50f8cf5c90626bdaca17fa',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5finit',['starpu_pthread_mutex_init',['../group__API__Threads.html#gadda164742adc172cb99860c88363ecd8',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5flock',['starpu_pthread_mutex_lock',['../group__API__Threads.html#ga402f8687fe2f6f7277c692fa6c1d0d29',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5ftrylock',['starpu_pthread_mutex_trylock',['../group__API__Threads.html#ga8fd0aa9fa9c38abbdcb91047eccf34e5',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5funlock',['starpu_pthread_mutex_unlock',['../group__API__Threads.html#gaebaf9c865b4a20d01a6017a11053c223',1,'starpu_thread.h']]], ['starpu_5fpthread_5frwlock_5fdestroy',['starpu_pthread_rwlock_destroy',['../group__API__Threads.html#gac62425c906d4084bcc7a8ae8eabdddc9',1,'starpu_thread.h']]], ['starpu_5fpthread_5frwlock_5finit',['starpu_pthread_rwlock_init',['../group__API__Threads.html#gabf2e8a1cabd3330b1ce9c63c2e322a2c',1,'starpu_thread.h']]], ['starpu_5fpthread_5frwlock_5frdlock',['starpu_pthread_rwlock_rdlock',['../group__API__Threads.html#ga4156ff97b36067a221b521379c3d3c0a',1,'starpu_thread.h']]], ['starpu_5fpthread_5frwlock_5funlock',['starpu_pthread_rwlock_unlock',['../group__API__Threads.html#ga6fba802f0cd437943d79146250d605fc',1,'starpu_thread.h']]], ['starpu_5fpthread_5frwlock_5fwrlock',['starpu_pthread_rwlock_wrlock',['../group__API__Threads.html#ga459977d1a48ff2396b15e3eee1f00b64',1,'starpu_thread.h']]], ['starpu_5fpthread_5fsetspecific',['starpu_pthread_setspecific',['../group__API__Threads.html#gadcaa2002f0cd921e66afca18a63ccb88',1,'starpu_thread.h']]], ['starpu_5fpush_5flocal_5ftask',['starpu_push_local_task',['../group__API__Scheduling__Policy.html#gae0b8a9bb53822f3d92cb2d19c2520e5e',1,'starpu_scheduler.h']]], ['starpu_5fpush_5ftask_5fend',['starpu_push_task_end',['../group__API__Scheduling__Policy.html#ga24154b37920144de18bca59090429d6d',1,'starpu_scheduler.h']]], ['starpu_5fresume',['starpu_resume',['../group__API__Initialization__and__Termination.html#ga713e7882886d755830c02eb7003ae475',1,'starpu.h']]], ['starpu_5fsched_5fctx_5fadd_5fworkers',['starpu_sched_ctx_add_workers',['../group__API__Scheduling__Contexts.html#ga4938f463f59aaea3f0b766c5da770fb9',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcall_5fpushed_5ftask_5fcb',['starpu_sched_ctx_call_pushed_task_cb',['../group__API__Scheduling__Contexts.html#ga62867177a48ccd40ac944602630cd8f0',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcheck_5fif_5fhypervisor_5fexists',['starpu_sched_ctx_check_if_hypervisor_exists',['../group__API__Scheduling__Contexts.html#ga95283c927a7787e2859cb4a42c93bf19',1,'starpu_sched_ctx_hypervisor.h']]], ['starpu_5fsched_5fctx_5fcontains_5fworker',['starpu_sched_ctx_contains_worker',['../group__API__Scheduling__Contexts.html#ga0fe5c1b14fc254c8b2a737402870a149',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcreate',['starpu_sched_ctx_create',['../group__API__Scheduling__Contexts.html#ga517b7cf4bfac60f2faf484584f19d9d3',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcreate_5finside_5finterval',['starpu_sched_ctx_create_inside_interval',['../group__API__Scheduling__Contexts.html#ga067a3f2a63a9697e5df616466dacf658',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcreate_5fworker_5fcollection',['starpu_sched_ctx_create_worker_collection',['../group__API__Scheduling__Contexts.html#gaef6a5f63713254b79eca39743f43ddd9',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fdelete',['starpu_sched_ctx_delete',['../group__API__Scheduling__Contexts.html#ga101c3a13d4adc8d932c46324ae71b93a',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fdelete_5fworker_5fcollection',['starpu_sched_ctx_delete_worker_collection',['../group__API__Scheduling__Contexts.html#ga5de2e1e6295cf1fa5723d1164d0a76e6',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5ffinished_5fsubmit',['starpu_sched_ctx_finished_submit',['../group__API__Scheduling__Contexts.html#ga11e94f2968626d9b46ccf021057ddd90',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fcontext',['starpu_sched_ctx_get_context',['../group__API__Scheduling__Contexts.html#gae6b235a9555a74e5cb4c89ca5117b419',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fmax_5fpriority',['starpu_sched_ctx_get_max_priority',['../group__API__Scheduling__Contexts.html#ga1cfc7b78954e33f2738547cbf05e820e',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fmin_5fpriority',['starpu_sched_ctx_get_min_priority',['../group__API__Scheduling__Contexts.html#ga6ae38faa632f496d81f0cf3b0cec5c77',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fnshared_5fworkers',['starpu_sched_ctx_get_nshared_workers',['../group__API__Scheduling__Contexts.html#gae00f5710446d14161beefdad2e48833d',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fnworkers',['starpu_sched_ctx_get_nworkers',['../group__API__Scheduling__Contexts.html#ga18af575377ee066528081b5aec754ea2',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fpolicy_5fdata',['starpu_sched_ctx_get_policy_data',['../group__API__Scheduling__Contexts.html#gaacd0aff652dc75ac37aa51c9c826e043',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fworker_5fcollection',['starpu_sched_ctx_get_worker_collection',['../group__API__Scheduling__Contexts.html#ga6e559a6889a89ec0b9a3b995a41f5f8f',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fworkers_5flist',['starpu_sched_ctx_get_workers_list',['../group__API__Scheduling__Contexts.html#ga182b6196b075139f611cfd34b42b86e8',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fnotify_5fhypervisor_5fexists',['starpu_sched_ctx_notify_hypervisor_exists',['../group__API__Scheduling__Contexts.html#gae7de365db4b774cdea340f7548e93c9d',1,'starpu_sched_ctx_hypervisor.h']]], ['starpu_5fsched_5fctx_5foverlapping_5fctxs_5fon_5fworker',['starpu_sched_ctx_overlapping_ctxs_on_worker',['../group__API__Scheduling__Contexts.html#ga66d2d4d08df845a40b7d19f12bf791c0',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fregister_5fclose_5fcallback',['starpu_sched_ctx_register_close_callback',['../group__API__Scheduling__Contexts.html#gaadbcaf9118792338aafe480da6fc6d94',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fremove_5fworkers',['starpu_sched_ctx_remove_workers',['../group__API__Scheduling__Contexts.html#ga5fced8ae787486d906b057c20dfe5926',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fcontext',['starpu_sched_ctx_set_context',['../group__API__Scheduling__Contexts.html#ga4e1aaf03ba327f47e5027c6fb7e5ed00',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5finheritor',['starpu_sched_ctx_set_inheritor',['../group__API__Scheduling__Contexts.html#gad6b7f96254526bb145e0df5ed0354a13',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fmax_5fpriority',['starpu_sched_ctx_set_max_priority',['../group__API__Scheduling__Contexts.html#ga1945cfb563891ad94861e5a5f6b01495',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fmin_5fpriority',['starpu_sched_ctx_set_min_priority',['../group__API__Scheduling__Contexts.html#ga6b8a02442fc4b18ae7f1c67a1a4add35',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fperf_5fcounters',['starpu_sched_ctx_set_perf_counters',['../group__API__Scheduling__Contexts.html#gaee24cd7da1cde089e038b93f52d1bf1d',1,'starpu_sched_ctx_hypervisor.h']]], ['starpu_5fsched_5fctx_5fset_5fpolicy_5fdata',['starpu_sched_ctx_set_policy_data',['../group__API__Scheduling__Contexts.html#ga20077926e6cd8264bcbb831a394c381a',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fstop_5ftask_5fsubmission',['starpu_sched_ctx_stop_task_submission',['../group__API__Scheduling__Contexts.html#gafe295aec3c152fe1fc0dd74e17f82961',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fworker_5fget_5fid',['starpu_sched_ctx_worker_get_id',['../group__API__Scheduling__Contexts.html#gaa06e10ab1edfe31d7da2f3359630e6f4',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fworker_5fshares_5ftasks_5flists',['starpu_sched_ctx_worker_shares_tasks_lists',['../group__API__Scheduling__Policy.html#ga315482308105aa57ecc59e88f71823aa',1,'starpu_scheduler.h']]], ['starpu_5fsched_5fget_5fmax_5fpriority',['starpu_sched_get_max_priority',['../group__API__Scheduling__Policy.html#ga6c2233ec86c827981117306f63da7679',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fget_5fmin_5fpriority',['starpu_sched_get_min_priority',['../group__API__Scheduling__Policy.html#ga6d8a3d42b5f2fee81785b3cf650fa6d2',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fget_5fpredefined_5fpolicies',['starpu_sched_get_predefined_policies',['../group__API__Scheduling__Policy.html#gaca9fb71cec7aa99dfd7a7a6dcafefb88',1,'starpu_scheduler.h']]], ['starpu_5fsched_5fset_5fmax_5fpriority',['starpu_sched_set_max_priority',['../group__API__Scheduling__Policy.html#gab8e4a2cd9f4fbad7b20b1086494d842d',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fset_5fmin_5fpriority',['starpu_sched_set_min_priority',['../group__API__Scheduling__Policy.html#gace525e755092440f63acbe5cc0b4d066',1,'starpu_sched_ctx.h']]], ['starpu_5fshutdown',['starpu_shutdown',['../group__API__Initialization__and__Termination.html#ga48edf5e30e71fbb71923e3867ad16c0a',1,'starpu.h']]], ['starpu_5ftag_5fdeclare_5fdeps',['starpu_tag_declare_deps',['../group__API__Explicit__Dependencies.html#ga863d71b775ec517493f81e731a64d134',1,'starpu_task.h']]], ['starpu_5ftag_5fdeclare_5fdeps_5farray',['starpu_tag_declare_deps_array',['../group__API__Explicit__Dependencies.html#gab5c86743355724ee2f9596de1ae221df',1,'starpu_task.h']]], ['starpu_5ftag_5fnotify_5ffrom_5fapps',['starpu_tag_notify_from_apps',['../group__API__Explicit__Dependencies.html#gabdb8d20fca507a93450fe775233dd20c',1,'starpu_task.h']]], ['starpu_5ftag_5fremove',['starpu_tag_remove',['../group__API__Explicit__Dependencies.html#gadbed48d64331463d4f9a9090933e5b9f',1,'starpu_task.h']]], ['starpu_5ftag_5frestart',['starpu_tag_restart',['../group__API__Explicit__Dependencies.html#gaef0b7cee7536d4a5de1b10888ab13add',1,'starpu_task.h']]], ['starpu_5ftag_5fwait',['starpu_tag_wait',['../group__API__Explicit__Dependencies.html#gaf5090c3c45414d693445e79ab7842992',1,'starpu_task.h']]], ['starpu_5ftag_5fwait_5farray',['starpu_tag_wait_array',['../group__API__Explicit__Dependencies.html#gaf5cf68c72a863a6ab0ef8737c92b57ba',1,'starpu_task.h']]], ['starpu_5ftask_5fbuild',['starpu_task_build',['../group__API__Insert__Task.html#ga8f7f5033f2077ebae698741750884ff2',1,'starpu_task_util.h']]], ['starpu_5ftask_5fbundle_5fclose',['starpu_task_bundle_close',['../group__API__Task__Bundles.html#ga7fcf9fedcf2a3f79784425431980a480',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5fcreate',['starpu_task_bundle_create',['../group__API__Task__Bundles.html#gadd37abde6806819967151a64146b19d6',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5fexpected_5fdata_5ftransfer_5ftime',['starpu_task_bundle_expected_data_transfer_time',['../group__API__Task__Bundles.html#gaf589986f5e69b7452ba90857d1931594',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fbundle_5fexpected_5flength',['starpu_task_bundle_expected_length',['../group__API__Task__Bundles.html#ga8b84caba693abab75f2085447ed24354',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fbundle_5fexpected_5fpower',['starpu_task_bundle_expected_power',['../group__API__Task__Bundles.html#ga30367fa33967131fa547364c2cf5f328',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fbundle_5finsert',['starpu_task_bundle_insert',['../group__API__Task__Bundles.html#gae8be4224d241ac2d30d9d573359e3280',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5fremove',['starpu_task_bundle_remove',['../group__API__Task__Bundles.html#gad904bbf27569e421454a2c8b25458eb3',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fclean',['starpu_task_clean',['../group__API__Codelet__And__Tasks.html#gaecb3efa04cb10b049b10c6166dd9c30c',1,'starpu_task.h']]], ['starpu_5ftask_5fcreate',['starpu_task_create',['../group__API__Codelet__And__Tasks.html#ga8720143096f8274be1b6ae75a1abd0ed',1,'starpu_task.h']]], ['starpu_5ftask_5fdeclare_5fdeps_5farray',['starpu_task_declare_deps_array',['../group__API__Explicit__Dependencies.html#gada6692ca393aa820bc105252ca19830f',1,'starpu_task.h']]], ['starpu_5ftask_5fdestroy',['starpu_task_destroy',['../group__API__Codelet__And__Tasks.html#ga8fdfb4c2276013b699f5398a1c528bba',1,'starpu_task.h']]], ['starpu_5ftask_5fdup',['starpu_task_dup',['../group__API__Codelet__And__Tasks.html#gafae324cd8f5a0851d66bffc95bb28d49',1,'starpu_task.h']]], ['starpu_5ftask_5fexpected_5fconversion_5ftime',['starpu_task_expected_conversion_time',['../group__API__Scheduling__Policy.html#gac3b5544dc3748c741fae1f6c10bc2b01',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fexpected_5fdata_5ftransfer_5ftime',['starpu_task_expected_data_transfer_time',['../group__API__Scheduling__Policy.html#ga4faf5df3280a5331bdddd3f878a3024d',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fexpected_5flength',['starpu_task_expected_length',['../group__API__Scheduling__Policy.html#ga10f34ad6d9dc824c63cc075dde87b4c1',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fexpected_5fpower',['starpu_task_expected_power',['../group__API__Scheduling__Policy.html#gaab1a403f861fc72079a4bda1d83a433b',1,'starpu_scheduler.h']]], ['starpu_5ftask_5ffootprint',['starpu_task_footprint',['../group__API__Scheduling__Policy.html#ga4f9b7837908f7a3d07b759debc72ad54',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fget_5fcurrent',['starpu_task_get_current',['../group__API__Codelet__And__Tasks.html#gab0a96cce01be9f4eccad9c783e8e27bb',1,'starpu_task.h']]], ['starpu_5ftask_5fget_5fimplementation',['starpu_task_get_implementation',['../group__API__Codelet__And__Tasks.html#gaac492d7132cc930b8483b571d0dd4333',1,'starpu_task.h']]], ['starpu_5ftask_5finit',['starpu_task_init',['../group__API__Codelet__And__Tasks.html#gadf8b76ef62ba0e68684e07ebf1db1731',1,'starpu_task.h']]], ['starpu_5ftask_5flist_5fback',['starpu_task_list_back',['../group__API__Task__Lists.html#ga871dd2f2bb4429d4edc9777abf3490b3',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fbegin',['starpu_task_list_begin',['../group__API__Task__Lists.html#gac3ea85752262f5281b745b2792af9266',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fempty',['starpu_task_list_empty',['../group__API__Task__Lists.html#ga477ef573c883af23f946ec291801458a',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5ferase',['starpu_task_list_erase',['../group__API__Task__Lists.html#gaedf8ff832aea57abbb8ab94304a85c13',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5ffront',['starpu_task_list_front',['../group__API__Task__Lists.html#gad38d569521bb710afc2299a9150f083f',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5finit',['starpu_task_list_init',['../group__API__Task__Lists.html#ga5618612b0ce2f914ab9032474ddf072f',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fnext',['starpu_task_list_next',['../group__API__Task__Lists.html#ga4630f5b59e347b36b27f025b9c8801a1',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpop_5fback',['starpu_task_list_pop_back',['../group__API__Task__Lists.html#gad88622cd18759da0a9b30ca75c11e22b',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpop_5ffront',['starpu_task_list_pop_front',['../group__API__Task__Lists.html#gad0e3e0684ea77c786b7c5b83894b5e5d',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpush_5fback',['starpu_task_list_push_back',['../group__API__Task__Lists.html#gae29a8aae4e82286c80656a7afdc7a106',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpush_5ffront',['starpu_task_list_push_front',['../group__API__Task__Lists.html#gabf5bb8daf00f9902ea501009720af19d',1,'starpu_task_list.h']]], ['starpu_5ftask_5fnready',['starpu_task_nready',['../group__API__Codelet__And__Tasks.html#ga18bec8430309a613520d6042d701790d',1,'starpu_task.h']]], ['starpu_5ftask_5fnsubmitted',['starpu_task_nsubmitted',['../group__API__Codelet__And__Tasks.html#gae2740e2b2b948a5c48f5424651dfc721',1,'starpu_task.h']]], ['starpu_5ftask_5fset_5fimplementation',['starpu_task_set_implementation',['../group__API__Codelet__And__Tasks.html#gaabb4805df503ece40a5e092d8e99ae52',1,'starpu_task.h']]], ['starpu_5ftask_5fsubmit',['starpu_task_submit',['../group__API__Codelet__And__Tasks.html#gaa32228bf7f452f7d664986668ea46590',1,'starpu_task.h']]], ['starpu_5ftask_5fsubmit_5fto_5fctx',['starpu_task_submit_to_ctx',['../group__API__Codelet__And__Tasks.html#ga3c6c4dd317df02d7021e23ab6b14e3e2',1,'starpu_task.h']]], ['starpu_5ftask_5fwait',['starpu_task_wait',['../group__API__Codelet__And__Tasks.html#gad915868fe3e292657cefc6e1c404c7f4',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fall',['starpu_task_wait_for_all',['../group__API__Codelet__And__Tasks.html#gad0baa8dbfd13e5a7bc3651bcd76022aa',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fall_5fin_5fctx',['starpu_task_wait_for_all_in_ctx',['../group__API__Codelet__And__Tasks.html#gaf963bbf24935bdf137d2eefa7fd06b80',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fn_5fsubmitted',['starpu_task_wait_for_n_submitted',['../group__API__Codelet__And__Tasks.html#ga724cda8b0ffeaa7532a5e573b86bc90b',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fn_5fsubmitted_5fin_5fctx',['starpu_task_wait_for_n_submitted_in_ctx',['../group__API__Codelet__And__Tasks.html#gabba5bab6e4eb84f21f01ba53008a0cd3',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fno_5fready',['starpu_task_wait_for_no_ready',['../group__API__Codelet__And__Tasks.html#ga50ff3cb4b73a5e44e51035166127d40a',1,'starpu_task.h']]], ['starpu_5ftiming_5fnow',['starpu_timing_now',['../group__API__Scheduling__Policy.html#ga34953348991f74a1cbd694fffb27f8b7',1,'starpu_util.h']]], ['starpu_5ftiming_5ftimespec_5fdelay_5fus',['starpu_timing_timespec_delay_us',['../group__API__Profiling.html#gacf0b5499290848f07c97a32c6c2412db',1,'starpu_profiling.h']]], ['starpu_5ftiming_5ftimespec_5fto_5fus',['starpu_timing_timespec_to_us',['../group__API__Profiling.html#ga87639260ff5c89f466e83fcc093e77fe',1,'starpu_profiling.h']]], ['starpu_5ftop_5fadd_5fdata_5fboolean',['starpu_top_add_data_boolean',['../group__API__StarPUTop__Interface.html#ga016dd52f4fb957306fbc0d8dfdf50c71',1,'starpu_top.h']]], ['starpu_5ftop_5fadd_5fdata_5ffloat',['starpu_top_add_data_float',['../group__API__StarPUTop__Interface.html#gae79ecd90078b87ebf97cbb127effde89',1,'starpu_top.h']]], ['starpu_5ftop_5fadd_5fdata_5finteger',['starpu_top_add_data_integer',['../group__API__StarPUTop__Interface.html#gad2d523db513a2e74f8cc417926fe4886',1,'starpu_top.h']]], ['starpu_5ftop_5fdebug_5flock',['starpu_top_debug_lock',['../group__API__StarPUTop__Interface.html#ga414faad453d183d1c026eb04fc59b07f',1,'starpu_top.h']]], ['starpu_5ftop_5fdebug_5flog',['starpu_top_debug_log',['../group__API__StarPUTop__Interface.html#ga07e4329145ef683b44df8f36e5331158',1,'starpu_top.h']]], ['starpu_5ftop_5finit_5fand_5fwait',['starpu_top_init_and_wait',['../group__API__StarPUTop__Interface.html#ga84638ef94fd71d3192c194053e91b4d8',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5fboolean',['starpu_top_register_parameter_boolean',['../group__API__StarPUTop__Interface.html#gadae398d33233f7d7f8860562885c564d',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5fenum',['starpu_top_register_parameter_enum',['../group__API__StarPUTop__Interface.html#ga3406e743f8db81f60c019b1be2bbb46f',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5ffloat',['starpu_top_register_parameter_float',['../group__API__StarPUTop__Interface.html#ga91db3cdf3b86e37066e625e504b33fb0',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5finteger',['starpu_top_register_parameter_integer',['../group__API__StarPUTop__Interface.html#ga97bf62e4f04016e273f364ab99b3d146',1,'starpu_top.h']]], ['starpu_5ftop_5ftask_5fprevision',['starpu_top_task_prevision',['../group__API__StarPUTop__Interface.html#gac361229a1e495768bf5f1653940528de',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fdata_5fboolean',['starpu_top_update_data_boolean',['../group__API__StarPUTop__Interface.html#ga87b6dcc03287a2a19788c984443160c2',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fdata_5ffloat',['starpu_top_update_data_float',['../group__API__StarPUTop__Interface.html#ga373e3fecfd9fccc0ac3e3857f2e5a0e8',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fdata_5finteger',['starpu_top_update_data_integer',['../group__API__StarPUTop__Interface.html#ga68fb3d6362e00a8d32668389e98dca07',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fparameter',['starpu_top_update_parameter',['../group__API__StarPUTop__Interface.html#ga4afdee5376361117e11e8a9ee4a47bad',1,'starpu_top.h']]], ['starpu_5ftopology_5fprint',['starpu_topology_print',['../group__API__Initialization__and__Termination.html#ga0702f607811a2af4f7d2bc271eb434e9',1,'starpu.h']]], ['starpu_5ftransfer_5fbandwidth',['starpu_transfer_bandwidth',['../group__API__Performance__Model.html#ga767f88b087d4b0bf4086ade9bb673826',1,'starpu_perfmodel.h']]], ['starpu_5ftransfer_5flatency',['starpu_transfer_latency',['../group__API__Performance__Model.html#ga77915973bf2f03bd70fb84ee4c9c51a0',1,'starpu_perfmodel.h']]], ['starpu_5ftransfer_5fpredict',['starpu_transfer_predict',['../group__API__Performance__Model.html#ga9a4af8d1b5a3486a5a21c72dd4a6c4c2',1,'starpu_perfmodel.h']]], ['starpu_5fvariable_5fdata_5fregister',['starpu_variable_data_register',['../group__API__Data__Interfaces.html#gadcd1aee7fb7226edebe64dfcc46c1d69',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5felemsize',['starpu_variable_get_elemsize',['../group__API__Data__Interfaces.html#ga988036ae1f9385832c2988064a4f27af',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5flocal_5fptr',['starpu_variable_get_local_ptr',['../group__API__Data__Interfaces.html#ga540f980b1c4bee16c78d84097a8b07f9',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fdata_5fregister',['starpu_vector_data_register',['../group__API__Data__Interfaces.html#ga98ea4083ac39db45b6be75354e66bca1',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5ffilter_5fblock',['starpu_vector_filter_block',['../group__API__Data__Partition.html#ga212189d3b83dfa4e225609b5f2bf8461',1,'starpu_data_filters.h']]], ['starpu_5fvector_5ffilter_5fblock_5fshadow',['starpu_vector_filter_block_shadow',['../group__API__Data__Partition.html#gaab49915dc0462c1b145bfb0a9ce4cf52',1,'starpu_data_filters.h']]], ['starpu_5fvector_5ffilter_5fdivide_5fin_5f2',['starpu_vector_filter_divide_in_2',['../group__API__Data__Partition.html#gab639622ea4929c36df704a0bebfd3fac',1,'starpu_data_filters.h']]], ['starpu_5fvector_5ffilter_5flist',['starpu_vector_filter_list',['../group__API__Data__Partition.html#gab9fa487bfff5ccdd59210bdde65a11db',1,'starpu_data_filters.h']]], ['starpu_5fvector_5fget_5felemsize',['starpu_vector_get_elemsize',['../group__API__Data__Interfaces.html#gacd95c31b537322b1d4000a1248b9c425',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5flocal_5fptr',['starpu_vector_get_local_ptr',['../group__API__Data__Interfaces.html#gacee0a9e166f87b48da1f56e1ae5d988d',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5fnx',['starpu_vector_get_nx',['../group__API__Data__Interfaces.html#ga08bed7d1e9b7cb2b2b76932eb9c33353',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fptr_5fregister',['starpu_vector_ptr_register',['../group__API__Data__Interfaces.html#gacb816db830d6991909a35a8c0e93a843',1,'starpu_data_interfaces.h']]], ['starpu_5fvoid_5fdata_5fregister',['starpu_void_data_register',['../group__API__Data__Interfaces.html#gab7f9484602aeef560cc2e5904e3b2cff',1,'starpu_data_interfaces.h']]], ['starpu_5fwake_5fall_5fblocked_5fworkers',['starpu_wake_all_blocked_workers',['../group__API__Expert__Mode.html#gaf5f4a32a78630fb051a846cbdcd77d8b',1,'starpu_expert.h']]], ['starpu_5fworker_5fcan_5fexecute_5ftask',['starpu_worker_can_execute_task',['../group__API__Scheduling__Policy.html#ga2c45db0c01e86497082c907b9cb0f4cc',1,'starpu_scheduler.h']]], ['starpu_5fworker_5fget_5fby_5fdevid',['starpu_worker_get_by_devid',['../group__API__Workers__Properties.html#gae6166f338640d033b740f5c8008b851b',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fby_5ftype',['starpu_worker_get_by_type',['../group__API__Workers__Properties.html#gab0ffe5622c5980444226f1ed8d6fee71',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fcount',['starpu_worker_get_count',['../group__API__Workers__Properties.html#ga6312aa4b12ce7e06fe391bcafda6796a',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fcount_5fby_5ftype',['starpu_worker_get_count_by_type',['../group__API__Workers__Properties.html#ga60b4a796a3dba40e5159158750805bf2',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fdevid',['starpu_worker_get_devid',['../group__API__Workers__Properties.html#ga0c9b9b7f5195cb8cbc5ee1223ec0f264',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fid',['starpu_worker_get_id',['../group__API__Workers__Properties.html#gac6d06f4e22b63bf50bc8e836cf16f81f',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fids_5fby_5ftype',['starpu_worker_get_ids_by_type',['../group__API__Workers__Properties.html#gaddb73ee5de667ba2e3353eb977d22cde',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fmemory_5fnode',['starpu_worker_get_memory_node',['../group__API__Workers__Properties.html#ga7de6654141ce89ea83c3aba60486396e',1,'starpu_data.h']]], ['starpu_5fworker_5fget_5fname',['starpu_worker_get_name',['../group__API__Workers__Properties.html#gae35a841f996b8758f3d0ce2ac2d066a5',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fperf_5farchtype',['starpu_worker_get_perf_archtype',['../group__API__Performance__Model.html#ga62eb61bbe13515d4b29c8a63b3bf19d0',1,'starpu_perfmodel.h']]], ['starpu_5fworker_5fget_5frelative_5fspeedup',['starpu_worker_get_relative_speedup',['../group__API__Scheduling__Policy.html#gab46e48dff40b77e87abef46517cc58b4',1,'starpu_scheduler.h']]], ['starpu_5fworker_5fget_5fsched_5fcondition',['starpu_worker_get_sched_condition',['../group__API__Scheduling__Policy.html#gadf8e42d41b76117293db5651b0912c78',1,'starpu_scheduler.h']]], ['starpu_5fworker_5fget_5ftype',['starpu_worker_get_type',['../group__API__Workers__Properties.html#ga4998e4e1dfa0d121059c60f790496a03',1,'starpu_worker.h']]], ['starpufft_5fcleanup',['starpufft_cleanup',['../group__API__FFT__Support.html#ga4670f7ac8c6980f78b80b48bbe561299',1,'starpufft.h']]], ['starpufft_5fdestroy_5fplan',['starpufft_destroy_plan',['../group__API__FFT__Support.html#ga2b1a62489b5b48491067bc8dc39f4b16',1,'starpufft.h']]], ['starpufft_5fexecute',['starpufft_execute',['../group__API__FFT__Support.html#gae73ea67d1d7df63938661c7a1105800a',1,'starpufft.h']]], ['starpufft_5fexecute_5fhandle',['starpufft_execute_handle',['../group__API__FFT__Support.html#ga22ad2f1c869305d11132322039d38876',1,'starpufft.h']]], ['starpufft_5ffree',['starpufft_free',['../group__API__FFT__Support.html#ga6809e3bc78ad0d7f9df41e99ddada069',1,'starpufft.h']]], ['starpufft_5fmalloc',['starpufft_malloc',['../group__API__FFT__Support.html#gabf7989748571ab9155a865a19002d1fa',1,'starpufft.h']]], ['starpufft_5fplan_5fdft_5f1d',['starpufft_plan_dft_1d',['../group__API__FFT__Support.html#ga642104c645445688177f1a44afeeefb0',1,'starpufft.h']]], ['starpufft_5fplan_5fdft_5f2d',['starpufft_plan_dft_2d',['../group__API__FFT__Support.html#gaf263d43c43927007819edf069cc8c93b',1,'starpufft.h']]], ['starpufft_5fstart',['starpufft_start',['../group__API__FFT__Support.html#ga8e37e0bd1edc887cf456dcf7d95b86c4',1,'starpufft.h']]], ['starpufft_5fstart_5fhandle',['starpufft_start_handle',['../group__API__FFT__Support.html#gabff378384df24d2c2ea296397b600569',1,'starpufft.h']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_66.html0000644000373600000000000000170712571536757017150 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_73.js0000644000373600000000000000145212571536757016613 00000000000000var searchData= [ ['scheduling_20context_20hypervisor_20_2d_20building_20a_20new_20resizing_20policy',['Scheduling Context Hypervisor - Building a new resizing policy',['../group__API__SC__Hypervisor.html',1,'']]], ['scheduling_20context_20hypervisor_20_2d_20regular_20usage',['Scheduling Context Hypervisor - Regular usage',['../group__API__SC__Hypervisor__usage.html',1,'']]], ['scheduling_20contexts',['Scheduling Contexts',['../group__API__Scheduling__Contexts.html',1,'']]], ['scheduling_20policy',['Scheduling Policy',['../group__API__Scheduling__Policy.html',1,'']]], ['standard_20memory_20library',['Standard Memory Library',['../group__API__Standard__Memory__Library.html',1,'']]], ['starpu_2dtop_20interface',['StarPU-Top Interface',['../group__API__StarPUTop__Interface.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_74.js0000644000373600000000000000426612571536757017253 00000000000000var searchData= [ ['tag_5fid',['tag_id',['../group__API__Codelet__And__Tasks.html#a0a245e062846e2b10de45139ba603cdd',1,'starpu_task']]], ['tail',['tail',['../group__API__Task__Lists.html#a2c7f5ff2c007939a4ba3700bfc40ca02',1,'starpu_task_list']]], ['time_5fsample',['time_sample',['../group__API__SC__Hypervisor.html#a7b31e50d194de4a09929756f320ea1b3',1,'sc_hypervisor_policy_config']]], ['total_5felapsed_5fflops',['total_elapsed_flops',['../group__API__SC__Hypervisor.html#ac49459facb1a0ea95921dcb070e837a0',1,'sc_hypervisor_wrapper']]], ['total_5fflops',['total_flops',['../group__API__SC__Hypervisor.html#adf798abf84171bf99afaffad01b25c21',1,'sc_hypervisor_wrapper']]], ['total_5fflops_5favailable',['total_flops_available',['../group__API__SC__Hypervisor.html#a2d42696426b58a5b899aaf0d8a42cf7c',1,'sc_hypervisor_wrapper']]], ['total_5ftime',['total_time',['../group__API__Profiling.html#aa2ab3e5b91bad635d718926731570e21',1,'starpu_profiling_worker_info::total_time()'],['../group__API__Profiling.html#ae548f710a41854d16401ca09325c7b3e',1,'starpu_profiling_bus_info::total_time()']]], ['trace_5fbuffer_5fsize',['trace_buffer_size',['../group__API__Initialization__and__Termination.html#a198b97daa32f2d7d7e710be6cbae63c2',1,'starpu_conf']]], ['transfer_5fcount',['transfer_count',['../group__API__Profiling.html#a44e02cbfabd6f170677ed8309f1d2a23',1,'starpu_profiling_bus_info']]], ['transferred_5fbytes',['transferred_bytes',['../group__API__Profiling.html#a55fbcc0c4e6105ed182e8791447ca542',1,'starpu_profiling_bus_info']]], ['type',['type',['../group__API__Initialization__and__Termination.html#a582c7a23ef93b1c5ad438ecd4bcc03ad',1,'starpu_driver::type()'],['../group__API__Performance__Model.html#ad10834dc8d17833b16b83662effaf24f',1,'starpu_perfmodel::type()'],['../group__API__Codelet__And__Tasks.html#a8e0e7a14ffcc9929e5d3084e9d68d0f2',1,'starpu_codelet::type()'],['../group__API__StarPUTop__Interface.html#a98c886544e41d83c882281f4840f6e30',1,'starpu_top_data::type()'],['../group__API__StarPUTop__Interface.html#a9844c6515346e12c3ff381688d6fa508',1,'starpu_top_param::type()'],['../group__API__Workers__Properties.html#a9ebf91a61a02c0509d3795f067323f16',1,'starpu_worker_collection::type()']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_64.html0000644000373600000000000000170412571536757016374 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_77.js0000644000373600000000000000262612571536757017254 00000000000000var searchData= [ ['where',['where',['../group__API__Codelet__And__Tasks.html#a251eb3ebfa11a9da85446eec7b80772c',1,'starpu_codelet']]], ['worker_5farchtypes',['worker_archtypes',['../group__API__FxT__Support.html#a9d3191d2649dc2ac99a7e863eac6a65b',1,'starpu_fxt_options']]], ['worker_5fnames',['worker_names',['../group__API__FxT__Support.html#ac7769d24aa0bd3f5277383d5879f1e1b',1,'starpu_fxt_options']]], ['worker_5fto_5fbe_5fremoved',['worker_to_be_removed',['../group__API__SC__Hypervisor.html#a4de5ef755a7476cfac78dcc2290ec8e8',1,'sc_hypervisor_wrapper']]], ['workerid',['workerid',['../group__API__Profiling.html#af4665663048700edd2c9cfd446fd796f',1,'starpu_profiling_task_info::workerid()'],['../group__API__Codelet__And__Tasks.html#a420258e4c87454d78f81087092ef8e6a',1,'starpu_task::workerid()']]], ['workerids',['workerids',['../group__API__Workers__Properties.html#acdae7c420e6da90633296a783d7a3a30',1,'starpu_worker_collection']]], ['workers_5fbindid',['workers_bindid',['../group__API__Initialization__and__Termination.html#a39daa766673e03f793c879b75a17efe4',1,'starpu_conf']]], ['workers_5fcuda_5fgpuid',['workers_cuda_gpuid',['../group__API__Initialization__and__Termination.html#aeaaa87a158d829a3dd94d60e35586aa3',1,'starpu_conf']]], ['workers_5fopencl_5fgpuid',['workers_opencl_gpuid',['../group__API__Initialization__and__Termination.html#a9ba17cabecb4281320182cb713400423',1,'starpu_conf']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_70.js0000644000373600000000000001110112571536757017231 00000000000000var searchData= [ ['pack_5fdata',['pack_data',['../group__API__Data__Interfaces.html#ac0747128bd59d68e272a62aed9712a5d',1,'starpu_data_interface_ops']]], ['per_5farch',['per_arch',['../group__API__Performance__Model.html#a4e2c8fa277de5f8e8a9e20480383be5f',1,'starpu_perfmodel']]], ['per_5fworker_5fstats',['per_worker_stats',['../group__API__Codelet__And__Tasks.html#a56f9d73629bdcdd02b6d6498dce1770d',1,'starpu_codelet']]], ['policy_5fdescription',['policy_description',['../group__API__Scheduling__Policy.html#af6133034b6d7ba8e4424659e485a23b0',1,'starpu_sched_policy']]], ['policy_5fname',['policy_name',['../group__API__Scheduling__Policy.html#a8d617a03c52e74e545bfa609b92f60fc',1,'starpu_sched_policy']]], ['pop_5fend_5ftime',['pop_end_time',['../group__API__Profiling.html#ab6dd82948508b552341be897aa7ceb7c',1,'starpu_profiling_task_info']]], ['pop_5fevery_5ftask',['pop_every_task',['../group__API__Scheduling__Policy.html#aaf958510a708152ea7b4186ce53bf7e7',1,'starpu_sched_policy']]], ['pop_5fstart_5ftime',['pop_start_time',['../group__API__Profiling.html#af86231619c7fe6190480c2ebd9e96cfb',1,'starpu_profiling_task_info']]], ['pop_5ftask',['pop_task',['../group__API__Scheduling__Policy.html#a2bc37d97b0badf9c7e63f4c6d855c806',1,'starpu_sched_policy']]], ['poped_5ftasks',['poped_tasks',['../group__API__SC__Hypervisor.html#a72579a0dddfd47b7908e1b362abb2818',1,'sc_hypervisor_wrapper']]], ['post_5fexec_5fhook',['post_exec_hook',['../group__API__Scheduling__Policy.html#a6cb147fd47ec0cca08c0b42466c6aff8',1,'starpu_sched_policy']]], ['power_5fconsumed',['power_consumed',['../group__API__Profiling.html#aefa78113ca5432c0b106141693b1915e',1,'starpu_profiling_task_info::power_consumed()'],['../group__API__Profiling.html#ae1876be6c7976dbf0f08cfc90ae539d7',1,'starpu_profiling_worker_info::power_consumed()']]], ['power_5fmodel',['power_model',['../group__API__Codelet__And__Tasks.html#ab1c6b049eb1704b0931994e71e676b44',1,'starpu_codelet']]], ['pre_5fexec_5fhook',['pre_exec_hook',['../group__API__Scheduling__Policy.html#a0fea4113de029d040d86aada7ad49900',1,'starpu_sched_policy']]], ['predicted',['predicted',['../group__API__Codelet__And__Tasks.html#aaec036b7926cdf902e95c8e71d8f77f3',1,'starpu_task']]], ['predicted_5ftransfer',['predicted_transfer',['../group__API__Codelet__And__Tasks.html#ac3d08f8846dcb53fc743a5a539840ef4',1,'starpu_task']]], ['prev',['prev',['../group__API__Codelet__And__Tasks.html#a8dc601a11f2dcc9bb62e9318573fa3da',1,'starpu_task']]], ['priority',['priority',['../group__API__Codelet__And__Tasks.html#afb7b183a017a673562a9a0524e3c38f8',1,'starpu_task::priority()'],['../group__API__SC__Hypervisor.html#aa0aa3bf7583a12c3346a3e06236a7d05',1,'sc_hypervisor_policy_config::priority()']]], ['profiling_5finfo',['profiling_info',['../group__API__Codelet__And__Tasks.html#a220ccbd10cf364ebe196015145c40a99',1,'starpu_task']]], ['programs',['programs',['../group__API__OpenCL__Extensions.html#a6f9978b868d57069606bc8c70032c160',1,'starpu_opencl_program']]], ['prologue_5fcallback_5farg',['prologue_callback_arg',['../group__API__Codelet__And__Tasks.html#a3d5eb1f2bb582beb45c0dbd8139d9356',1,'starpu_task']]], ['prologue_5fcallback_5farg_5ffree',['prologue_callback_arg_free',['../group__API__Codelet__And__Tasks.html#af2089cd9c6ffd9ca98c6934d594f7ae3',1,'starpu_task']]], ['prologue_5fcallback_5ffunc',['prologue_callback_func',['../group__API__Codelet__And__Tasks.html#a66da9a644d88e20ebe57e9a4df73b0a0',1,'starpu_task']]], ['ptr',['ptr',['../group__API__Data__Interfaces.html#ac39e5f817013517ae24a9e92270b25de',1,'starpu_matrix_interface::ptr()'],['../group__API__Data__Interfaces.html#a8aa8bc72befe6560d2419e6a93672344',1,'starpu_block_interface::ptr()'],['../group__API__Data__Interfaces.html#a9abd603717a8e189ebfdaa6941690ab1',1,'starpu_vector_interface::ptr()'],['../group__API__Data__Interfaces.html#aa783ee7d584e5aaa83335baa289a13c7',1,'starpu_variable_interface::ptr()']]], ['push_5fend_5ftime',['push_end_time',['../group__API__Profiling.html#a75d3a7821b79a692d3fc9a9f6ea06f4a',1,'starpu_profiling_task_info']]], ['push_5fstart_5ftime',['push_start_time',['../group__API__Profiling.html#a337d767dae00387b840c2bda30b73451',1,'starpu_profiling_task_info']]], ['push_5ftask',['push_task',['../group__API__Scheduling__Policy.html#a7e5b0390e94bb2ab28e1599126093659',1,'starpu_sched_policy']]], ['push_5ftask_5fnotify',['push_task_notify',['../group__API__Scheduling__Policy.html#acc2c85a33c9cd0821739edbbbc6a65c2',1,'starpu_sched_policy']]], ['pushed_5ftasks',['pushed_tasks',['../group__API__SC__Hypervisor.html#a93caf46bb69880d5da0548f056d77148',1,'sc_hypervisor_wrapper']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_61.js0000644000373600000000000000265212571536757017244 00000000000000var searchData= [ ['a',['a',['../group__API__Performance__Model.html#a2f37ce35ec69b03c19b3832c6b922c8e',1,'starpu_perfmodel_regression_model']]], ['acked_5fworkers',['acked_workers',['../group__API__SC__Hypervisor.html#a5ebd37bd5c225c6b354750be598cd90f',1,'sc_hypervisor_resize_ack']]], ['acquire_5fdata_5fend_5ftime',['acquire_data_end_time',['../group__API__Profiling.html#a28f087b9a4605f7cfc37e0511686e6e8',1,'starpu_profiling_task_info']]], ['acquire_5fdata_5fstart_5ftime',['acquire_data_start_time',['../group__API__Profiling.html#a378ede6a6d188f68feda3a041134f351',1,'starpu_profiling_task_info']]], ['active',['active',['../group__API__StarPUTop__Interface.html#adce03726f49ac1f522cd660847dcfec6',1,'starpu_top_data']]], ['add',['add',['../group__API__Workers__Properties.html#acd4bb28e0712cccaae687c4e3cf75a99',1,'starpu_worker_collection']]], ['add_5fworkers',['add_workers',['../group__API__Scheduling__Policy.html#af98c835236665b8e8be259593d65b757',1,'starpu_sched_policy']]], ['allocate_5fdata_5fon_5fnode',['allocate_data_on_node',['../group__API__Data__Interfaces.html#a16f76ee4b4ea9f7322adfc4678ef08f6',1,'starpu_data_interface_ops']]], ['alpha',['alpha',['../group__API__Performance__Model.html#aa040f018a0b973ec311427371c56e51e',1,'starpu_perfmodel_regression_model']]], ['any_5fto_5fany',['any_to_any',['../group__API__Data__Interfaces.html#a1c7bc9f8788601449ca1c091d515d2c6',1,'starpu_data_copy_methods']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_64.js0000644000373600000000000000704612571536757016051 00000000000000var searchData= [ ['data_20interfaces',['Data Interfaces',['../group__API__Data__Interfaces.html',1,'']]], ['data_20management',['Data Management',['../group__API__Data__Management.html',1,'']]], ['data_20partition',['Data Partition',['../group__API__Data__Partition.html',1,'']]], ['data_5fsize',['data_size',['../group__API__SC__Hypervisor.html#afdf2824e028c9ead969948ccb0efe6c4',1,'sc_hypervisor_policy_task_pool']]], ['deinit',['deinit',['../group__API__Workers__Properties.html#a65248cebeb87e139b7862f45991af4f3',1,'starpu_worker_collection']]], ['deinit_5fsched',['deinit_sched',['../group__API__Scheduling__Policy.html#aff1b9fd2269299f99b7410b3f2b18e3c',1,'starpu_sched_policy']]], ['deprecated_20list',['Deprecated List',['../deprecated.html',1,'']]], ['destroy',['destroy',['../group__API__Codelet__And__Tasks.html#a3a9568421a4f6e54cb71c7f2806ad92e',1,'starpu_task']]], ['detach',['detach',['../group__API__Codelet__And__Tasks.html#a295e3e4315544880389d29229f085207',1,'starpu_task']]], ['dev_5fhandle',['dev_handle',['../group__API__Data__Interfaces.html#a1cf69fd84bad6901a2ec35733799b806',1,'starpu_matrix_interface::dev_handle()'],['../group__API__Data__Interfaces.html#afd291d3734d196bc3cde21ba9ec36268',1,'starpu_block_interface::dev_handle()'],['../group__API__Data__Interfaces.html#ae97dc938c0f7cd70873ba617c478d08b',1,'starpu_vector_interface::dev_handle()']]], ['deviation',['deviation',['../group__API__Performance__Model.html#a4752374bc8245e9cb4f057b78f14c0de',1,'starpu_perfmodel_history_entry']]], ['disable_5fasynchronous_5fcopy',['disable_asynchronous_copy',['../group__API__Initialization__and__Termination.html#a360761e8c928805762561b30b3b5d92c',1,'starpu_conf']]], ['disable_5fasynchronous_5fcuda_5fcopy',['disable_asynchronous_cuda_copy',['../group__API__Initialization__and__Termination.html#ae92bd88466598b50b425fe481ca94e89',1,'starpu_conf']]], ['disable_5fasynchronous_5fopencl_5fcopy',['disable_asynchronous_opencl_copy',['../group__API__Initialization__and__Termination.html#adcf7b06f318677591d51d0823daa5859',1,'starpu_conf']]], ['display',['display',['../group__API__Data__Interfaces.html#aa7778debf6661bf5be3ce8101aae224d',1,'starpu_data_interface_ops']]], ['double_5fmax_5fvalue',['double_max_value',['../group__API__StarPUTop__Interface.html#a8416d4cc0107bd5199174752d279c1fb',1,'starpu_top_data::double_max_value()'],['../group__API__StarPUTop__Interface.html#aacb63578d756be4fe6dd6aaffde3b512',1,'starpu_top_param::double_max_value()']]], ['double_5fmin_5fvalue',['double_min_value',['../group__API__StarPUTop__Interface.html#abc246f42eacbefef34117d9f29cf4b41',1,'starpu_top_data::double_min_value()'],['../group__API__StarPUTop__Interface.html#aaf02a9317ed869c5473286c1e5a816c1',1,'starpu_top_param::double_min_value()']]], ['dumped_5fcodelets',['dumped_codelets',['../group__API__FxT__Support.html#a8d5804f46a44162d9d5839daefd5c002',1,'starpu_fxt_options']]], ['dumped_5fcodelets_5fcount',['dumped_codelets_count',['../group__API__FxT__Support.html#a6a146a384139494daea99676cbbc8cf1',1,'starpu_fxt_options']]], ['dyn_5fhandles',['dyn_handles',['../group__API__Codelet__And__Tasks.html#afb79130d7ca273b33c8b853654620178',1,'starpu_task']]], ['dyn_5finterfaces',['dyn_interfaces',['../group__API__Codelet__And__Tasks.html#ac3601bc8cbba8bc2cb865bfdcc1f4fb6',1,'starpu_task']]], ['dyn_5fmodes',['dyn_modes',['../group__API__Codelet__And__Tasks.html#a50e9bb70870a1190cbfee6e063d12865',1,'starpu_codelet']]], ['dyn_5fnodes',['dyn_nodes',['../group__API__Codelet__And__Tasks.html#ab402d1adc39a713576d150f1f144b2d1',1,'starpu_codelet']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_68.js0000644000373600000000000000372412571536757016054 00000000000000var searchData= [ ['handle',['handle',['../group__API__Codelet__And__Tasks.html#a445f957b14c8b57f5891802b2084bea6',1,'starpu_data_descr']]], ['handle_5fidle_5fcycle',['handle_idle_cycle',['../group__API__SC__Hypervisor.html#aa227429c6cf34c69c32b143b933a07b7',1,'sc_hypervisor_policy']]], ['handle_5fidle_5fend',['handle_idle_end',['../group__API__SC__Hypervisor.html#a9ef96b3ab6d2247ecb336900e5051cd1',1,'sc_hypervisor_policy']]], ['handle_5fpoped_5ftask',['handle_poped_task',['../group__API__SC__Hypervisor.html#a38f0b680a437c321ed5f9a5f91261e73',1,'sc_hypervisor_policy']]], ['handle_5fpost_5fexec_5fhook',['handle_post_exec_hook',['../group__API__SC__Hypervisor.html#a8360ac46ace04f60b44fd83ed6db16ee',1,'sc_hypervisor_policy']]], ['handle_5fpushed_5ftask',['handle_pushed_task',['../group__API__SC__Hypervisor.html#a9a10eb6dd3eb12543e505411585bafb7',1,'sc_hypervisor_policy']]], ['handle_5fsubmitted_5fjob',['handle_submitted_job',['../group__API__SC__Hypervisor.html#a31a2a9dc2fba831c86f3369974c3b874',1,'sc_hypervisor_policy']]], ['handle_5fto_5fpointer',['handle_to_pointer',['../group__API__Data__Interfaces.html#ad2b81849c511d79da324a88540cbf8b0',1,'starpu_data_interface_ops']]], ['handles',['handles',['../group__API__Codelet__And__Tasks.html#afaf0e8924390406c488144431ed3a0de',1,'starpu_task']]], ['has_5fnext',['has_next',['../group__API__Workers__Properties.html#a3a272285109c3e462cd1ce43b90616bf',1,'starpu_worker_collection']]], ['head',['head',['../group__API__Task__Lists.html#a8d37485dd1e0cbf987c3da294e3e4ea4',1,'starpu_task_list']]], ['history',['history',['../group__API__Performance__Model.html#a039135e38a71f53d048651ff9f760305',1,'starpu_perfmodel_per_arch']]], ['how_20to_20optimize_20performance_20with_20starpu',['How To Optimize Performance With StarPU',['../HowToOptimizePerformanceWithStarPU.html',1,'']]], ['hypervisor_5ftag',['hypervisor_tag',['../group__API__Codelet__And__Tasks.html#a7d2bc18a8c0d5d2b407e767af02a6f6d',1,'starpu_task']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_74.js0000644000373600000000000000074712571536757016622 00000000000000var searchData= [ ['task_20bundles',['Task Bundles',['../group__API__Task__Bundles.html',1,'']]], ['task_20lists',['Task Lists',['../group__API__Task__Lists.html',1,'']]], ['theoretical_20lower_20bound_20on_20execution_20time',['Theoretical Lower Bound on Execution Time',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html',1,'']]], ['threads',['Threads',['../group__API__Threads.html',1,'']]], ['toolbox',['Toolbox',['../group__API__Toolbox.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_69.html0000644000373600000000000000170712571536757017153 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_70.html0000644000373600000000000000170412571536757016371 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_70.html0000644000373600000000000000171212571536757017570 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_61.html0000644000373600000000000000170412571536757016371 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_74.html0000644000373600000000000000170412571536757016375 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_62.html0000644000373600000000000000171212571536757017571 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_66.html0000644000373600000000000000171212571536757017575 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_64.html0000644000373600000000000000171212571536757017573 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_6d.js0000644000373600000000000000432512571536757017326 00000000000000var searchData= [ ['magic',['magic',['../group__API__Initialization__and__Termination.html#a6dab9683bf733062e75a46f91b04abd2',1,'starpu_conf::magic()'],['../group__API__Codelet__And__Tasks.html#a9e31b78009fc1e16cb909ffcd83610fa',1,'starpu_task::magic()']]], ['max_5fidle',['max_idle',['../group__API__SC__Hypervisor.html#a6a36830f17ce8f284c3543aafdc49b79',1,'sc_hypervisor_policy_config']]], ['max_5fnworkers',['max_nworkers',['../group__API__SC__Hypervisor.html#a9f31e224b7b8f06edfe2d31cafd40139',1,'sc_hypervisor_policy_config']]], ['max_5fparallelism',['max_parallelism',['../group__API__Codelet__And__Tasks.html#a8828a68f0322f26d2b6f4ed1244dee6f',1,'starpu_codelet']]], ['maxx',['maxx',['../group__API__Performance__Model.html#aa6f114dc3a7a3925604180a6e6c0f9ea',1,'starpu_perfmodel_regression_model']]], ['mean',['mean',['../group__API__Performance__Model.html#a2ffd5e6b2827c53defd1fca3d9ccce43',1,'starpu_perfmodel_history_entry']]], ['mf_5fskip',['mf_skip',['../group__API__Codelet__And__Tasks.html#ae119d876d9d9024e448e235c49edda16',1,'starpu_task']]], ['min_5fnworkers',['min_nworkers',['../group__API__SC__Hypervisor.html#a309596658ce45de36fc2871a6df4d282',1,'sc_hypervisor_policy_config']]], ['min_5fworking',['min_working',['../group__API__SC__Hypervisor.html#a4b4cf5e2b01c071cb5451bca3446c941',1,'sc_hypervisor_policy_config']]], ['minx',['minx',['../group__API__Performance__Model.html#acc228f5c071236ef0f0b6cfada7a232f',1,'starpu_perfmodel_regression_model']]], ['mode',['mode',['../group__API__Codelet__And__Tasks.html#addc6865102814bf740ec2ec14a227c4a',1,'starpu_data_descr']]], ['model',['model',['../group__API__Codelet__And__Tasks.html#a849d672b19f7d4a9499f69642ef51d79',1,'starpu_codelet']]], ['model_5frwlock',['model_rwlock',['../group__API__Performance__Model.html#a17f51ebd11348c8f614e1c9eda9bd4a1',1,'starpu_perfmodel']]], ['modes',['modes',['../group__API__Codelet__And__Tasks.html#ad078047d7845a4cf7a109e40cb5376ec',1,'starpu_codelet']]], ['moved_5fworkers',['moved_workers',['../group__API__SC__Hypervisor.html#acd68e423efe1271125432108dd44e13a',1,'sc_hypervisor_resize_ack']]], ['mutex',['mutex',['../group__API__SC__Hypervisor.html#ab0df538a6d83e44b6e9390fab1c0a7a5',1,'sc_hypervisor_wrapper']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_65.js0000644000373600000000000000511212571536757016042 00000000000000var searchData= [ ['expert_20mode',['Expert Mode',['../group__API__Expert__Mode.html',1,'']]], ['explicit_20dependencies',['Explicit Dependencies',['../group__API__Explicit__Dependencies.html',1,'']]], ['elapsed_5fdata',['elapsed_data',['../group__API__SC__Hypervisor.html#a5256359f2725c36c087725384a89a9f9',1,'sc_hypervisor_wrapper']]], ['elapsed_5fflops',['elapsed_flops',['../group__API__SC__Hypervisor.html#a88b5959a57bf1498f4316cc6172a0b96',1,'sc_hypervisor_wrapper']]], ['elapsed_5ftasks',['elapsed_tasks',['../group__API__SC__Hypervisor.html#af976911e407e1e13fe4db83213116d55',1,'sc_hypervisor_wrapper']]], ['elemsize',['elemsize',['../group__API__Data__Interfaces.html#aa196ddab667c28d961cf47112f3236dd',1,'starpu_matrix_interface::elemsize()'],['../group__API__Data__Interfaces.html#abe0835442903808437444ff657cc5349',1,'starpu_coo_interface::elemsize()'],['../group__API__Data__Interfaces.html#a38eeb2ae168fa27137ca41c281063c2a',1,'starpu_block_interface::elemsize()'],['../group__API__Data__Interfaces.html#a64973b87e807aee1ae82bf046c557c16',1,'starpu_vector_interface::elemsize()'],['../group__API__Data__Interfaces.html#a524a7f857ea2e939bbe37200f069fe45',1,'starpu_variable_interface::elemsize()'],['../group__API__Data__Interfaces.html#ac2d8fe3b84f8984adc48e16b52ec0afa',1,'starpu_csr_interface::elemsize()'],['../group__API__Data__Interfaces.html#a3f38b6d2cf10c91231547d992fa07e48',1,'starpu_bcsr_interface::elemsize()']]], ['end_5fctx',['end_ctx',['../group__API__SC__Hypervisor.html#aff6339dc221097287b29cf0fdb78e8f8',1,'sc_hypervisor_policy']]], ['end_5ftime',['end_time',['../group__API__Profiling.html#a3c2d97753fad1f7e500bd976d56cf24c',1,'starpu_profiling_task_info']]], ['entry',['entry',['../group__API__Performance__Model.html#a2c2d9b5577b3f1b105edff39761a6071',1,'starpu_perfmodel_history_list']]], ['enum_5fvalues',['enum_values',['../group__API__StarPUTop__Interface.html#a54299f64b8652c2bfffc1bdb696d3005',1,'starpu_top_param']]], ['execute_5fon_5fa_5fspecific_5fworker',['execute_on_a_specific_worker',['../group__API__Codelet__And__Tasks.html#a81573ad6c21f6262564174f542984854',1,'starpu_task']]], ['executed_5ftasks',['executed_tasks',['../group__API__Profiling.html#aa75cdfac133df437f7091ec1464e9391',1,'starpu_profiling_worker_info']]], ['executing_5ftime',['executing_time',['../group__API__Profiling.html#a4c9156962f0c7fb7c309e37990677729',1,'starpu_profiling_worker_info']]], ['execution_20configuration_20through_20environment_20variables',['Execution Configuration Through Environment Variables',['../ExecutionConfigurationThroughEnvironmentVariables.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/mag_sel.png0000644000373600000000000000106312571536757016540 00000000000000PNG  IHDR- pHYs   cHRMms8zʴ3Dv6*IDATx䔻"A:/xQL@7010|173sVD6@PTmPjٝu &X?9S%|~|Ʉrf!LT**PH)9Nr0`Y'CZh NS,"JQ*d2V+fɄH$B^d۶(T*4MPH*zƶm:Ha0jSS-bMiP(ka<`ˉDq']?cǘ4M1tZ>z|)tu]F
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_6e.html0000644000373600000000000000170412571536757016455 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_65.html0000644000373600000000000000171212571536757017574 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/classes_74.js0000644000373600000000000000021112571536757016722 00000000000000var searchData= [ ['types_5fof_5fworkers',['types_of_workers',['../sc__hypervisor__policy_8h.html#structtypes__of__workers',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_63.html0000644000373600000000000000171212571536757017572 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_63.html0000644000373600000000000000170612571536757016724 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_70.js0000644000373600000000000000016012571536757016363 00000000000000var searchData= [ ['performance_20feedback',['Performance Feedback',['../PerformanceFeedback.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_74.html0000644000373600000000000000170712571536757017147 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_65.js0000644000373600000000000000032012571536757016605 00000000000000var searchData= [ ['expert_20mode',['Expert Mode',['../group__API__Expert__Mode.html',1,'']]], ['explicit_20dependencies',['Explicit Dependencies',['../group__API__Explicit__Dependencies.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/search_l.png0000644000373600000000000000113412571536757016710 00000000000000PNG  IHDR- pHYs   cHRMms8zʴ3Dv6*IDATxڬT=P~91M@0FPD/ѡ.;JtCڥ܊D(I.xo4hpFD8Ecmmnnl1 ,"vh4zl6{D:iP%>aax
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_64.js0000644000373600000000000000044212571536757016611 00000000000000var searchData= [ ['data_20interfaces',['Data Interfaces',['../group__API__Data__Interfaces.html',1,'']]], ['data_20management',['Data Management',['../group__API__Data__Management.html',1,'']]], ['data_20partition',['Data Partition',['../group__API__Data__Partition.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_73.js0000644000373600000000000000051012571536757016365 00000000000000var searchData= [ ['scheduling_20context_20hypervisor',['Scheduling Context Hypervisor',['../SchedulingContextHypervisor.html',1,'']]], ['scheduling_20contexts',['Scheduling Contexts',['../SchedulingContexts.html',1,'']]], ['socl_20opencl_20extensions',['SOCL OpenCL Extensions',['../SOCLOpenclExtensions.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_6c.js0000644000373600000000000000077612571536757017333 00000000000000var searchData= [ ['ld',['ld',['../group__API__Data__Interfaces.html#a1e315fb776eaa20155d75dcc236a149c',1,'starpu_matrix_interface']]], ['ldy',['ldy',['../group__API__Data__Interfaces.html#a2701c20e02876292211a75a7f24b4d5b',1,'starpu_block_interface']]], ['ldz',['ldz',['../group__API__Data__Interfaces.html#ae2599da457da73787af7813d665d9824',1,'starpu_block_interface']]], ['list',['list',['../group__API__Performance__Model.html#ae1c6fea4c92c0220712f0b02430a5ae0',1,'starpu_perfmodel_per_arch']]] ]; starpu-1.1.5/doc/doxygen/html/search/enumvalues_73.html0000644000373600000000000000171312571536757020010 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/search_r.png0000644000373600000000000000114412571536757016717 00000000000000PNG  IHDR] pHYs   cHRMms8zʴ3Dv6*IDATxڤԿAo kVi|YIR߼C+Lg,R\B$`4)BPA!UI( 檧Ïsu:‰B$|~Z,?J^ZR.F!`08 eY$I
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_62.html0000644000373600000000000000170612571536757016723 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_66.js0000644000373600000000000000466712571536757016061 00000000000000var searchData= [ ['fft_20support',['FFT Support',['../group__API__FFT__Support.html',1,'']]], ['fxt_20support',['FxT Support',['../group__API__FxT__Support.html',1,'']]], ['fft_20support',['FFT Support',['../FFTSupport.html',1,'']]], ['file_5foffset',['file_offset',['../group__API__FxT__Support.html#a2c88f17ee1053748a665fddd7949a1c1',1,'starpu_fxt_options']]], ['file_5fprefix',['file_prefix',['../group__API__FxT__Support.html#a0a0ec99a90cdf9fbcec8d1baeef5c894',1,'starpu_fxt_options']]], ['file_5frank',['file_rank',['../group__API__FxT__Support.html#ac37b89720a69aa1bf0b2a34b750f8852',1,'starpu_fxt_options']]], ['files',['Files',['../Files.html',1,'']]], ['filter_5farg',['filter_arg',['../group__API__Data__Partition.html#ab23212cd9e3b4773bfbd347fe75a0d30',1,'starpu_data_filter']]], ['filter_5farg_5fptr',['filter_arg_ptr',['../group__API__Data__Partition.html#a68640e2bb6feec9f179923bcb86e26c9',1,'starpu_data_filter']]], ['filter_5ffunc',['filter_func',['../group__API__Data__Partition.html#a931b8b5df9714049dd98532d00134141',1,'starpu_data_filter']]], ['firstentry',['firstentry',['../group__API__Data__Interfaces.html#af73b9c9306e897f7efb81d2daee8420f',1,'starpu_csr_interface::firstentry()'],['../group__API__Data__Interfaces.html#aea8014509eb5d21ba81d400c877d6d8c',1,'starpu_bcsr_interface::firstentry()']]], ['fixed_5fworkers',['fixed_workers',['../group__API__SC__Hypervisor.html#aee28c4abb71f645cb48edf4677366742',1,'sc_hypervisor_policy_config']]], ['flops',['flops',['../group__API__Performance__Model.html#a0549a4d3088675455ebed1b268324fee',1,'starpu_perfmodel_history_entry::flops()'],['../group__API__Codelet__And__Tasks.html#a3ff361225beaf58ec1ea6dc254ca2b46',1,'starpu_task::flops()']]], ['footprint',['footprint',['../group__API__Data__Interfaces.html#a3fa55c40ad905c7fcdada3be42094396',1,'starpu_data_interface_ops::footprint()'],['../group__API__Performance__Model.html#a8b0cfe33d3ee04badaad8ff136256d2b',1,'starpu_perfmodel_history_entry::footprint()'],['../group__API__SC__Hypervisor.html#a2b49b6e39b8b0882bc5fc0f2aee71f66',1,'sc_hypervisor_policy_task_pool::footprint()']]], ['free_5fdata_5fon_5fnode',['free_data_on_node',['../group__API__Data__Interfaces.html#a34fbb1ba657afffa329d58174837494d',1,'starpu_data_interface_ops']]], ['full_20source_20code_20for_20the_20_e2_80_99scaling_20a_20vector_e2_80_99_20example',['Full source code for the ’Scaling a Vector’ example',['../FullSourceCodeVectorScal.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_74.html0000644000373600000000000000171212571536757017574 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/nomatches.html0000644000373600000000000000071512571536757017275 00000000000000
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_6d.html0000644000373600000000000000170412571536757016454 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_67.js0000644000373600000000000000152612571536757017251 00000000000000var searchData= [ ['get_5fchild_5fops',['get_child_ops',['../group__API__Data__Partition.html#ac6ce9ddd9d874b574d5fa408ffcf5d0f',1,'starpu_data_filter']]], ['get_5fmf_5fops',['get_mf_ops',['../group__API__Data__Interfaces.html#a38e9e1cc6fc43a8cea38cb0d5547fe97',1,'starpu_data_interface_ops']]], ['get_5fnchildren',['get_nchildren',['../group__API__Data__Partition.html#a0abadff12ac4de557c9f7a650e5499b6',1,'starpu_data_filter']]], ['get_5fnext',['get_next',['../group__API__Workers__Properties.html#a9bf130150d2efc5f14c7703f8ce81bc5',1,'starpu_worker_collection']]], ['get_5fsize',['get_size',['../group__API__Data__Interfaces.html#a00fc59e147cc76ba7c75251513cb4fe4',1,'starpu_data_interface_ops']]], ['granularity',['granularity',['../group__API__SC__Hypervisor.html#afe75ee5e11144af39796d8adefa1c1dd',1,'sc_hypervisor_policy_config']]] ]; starpu-1.1.5/doc/doxygen/html/search/close.png0000644000373600000000000000042112571536757016233 00000000000000PNG  IHDR w&IDATuQF@  C5Cg3(w{#*&9}Ͳ,ض y""q<ϑi8K߾6 Ce(;//BVx</ڶEUUte,"gL}ߣk2VSF1 s1 DZwA$IYQ[ ouk*AiWY(G/0{A,)eln]? yEIENDB`starpu-1.1.5/doc/doxygen/html/search/pages_74.html0000644000373600000000000000170612571536757016726 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/enumvalues_73.js0000644000373600000000000002316312571536757017463 00000000000000var searchData= [ ['starpu_5fany_5fworker',['STARPU_ANY_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37dac4e189acc1d1b0971c8d950034048501',1,'starpu_worker.h']]], ['starpu_5fbcsr_5finterface_5fid',['STARPU_BCSR_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357caf0717d5dd8045aa04c0d4ea65dc632be',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5finterface_5fid',['STARPU_BLOCK_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca61676e55a5c706ecb014c772a39e292d',1,'starpu_data_interfaces.h']]], ['starpu_5fcommon',['STARPU_COMMON',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6aeedb2a69541e9b7380f766711f8eab26',1,'starpu_perfmodel.h']]], ['starpu_5fcoo_5finterface_5fid',['STARPU_COO_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cad84c1b3c230ee8b5136302fa63dfc9d2',1,'starpu_data_interfaces.h']]], ['starpu_5fcpu_5fdefault',['STARPU_CPU_DEFAULT',['../group__API__Performance__Model.html#ggaa178fceed017bdbe1bee860d7882565fafbcccb201408154dc29868a354255a8f',1,'starpu_perfmodel.h']]], ['starpu_5fcpu_5fram',['STARPU_CPU_RAM',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a9578288c35b06ee94ab4ef6a41d16674',1,'starpu_data.h']]], ['starpu_5fcpu_5fworker',['STARPU_CPU_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37da5b5aeeaa21f925e63f5fed338baf0588',1,'starpu_worker.h']]], ['starpu_5fcsr_5finterface_5fid',['STARPU_CSR_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca9566de0c4f51f4e48f6ca681d2701eed',1,'starpu_data_interfaces.h']]], ['starpu_5fcuda_5fdefault',['STARPU_CUDA_DEFAULT',['../group__API__Performance__Model.html#ggaa178fceed017bdbe1bee860d7882565fa14830630d3a691e5a6932e5555fa5805',1,'starpu_perfmodel.h']]], ['starpu_5fcuda_5fram',['STARPU_CUDA_RAM',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a619d788452761975aa62ea517c86104c',1,'starpu_data.h']]], ['starpu_5fcuda_5fworker',['STARPU_CUDA_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37dac95bbacadbe0599c06a48059d2821611',1,'starpu_worker.h']]], ['starpu_5fforkjoin',['STARPU_FORKJOIN',['../group__API__Codelet__And__Tasks.html#ggac127ad106bf376da993d3f4caa979b2faaaad35e6da5417989b55d70fa7e65447',1,'starpu_task.h']]], ['starpu_5fhistory_5fbased',['STARPU_HISTORY_BASED',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6a61a1a08e950abce6779d8eaee6cfe395',1,'starpu_perfmodel.h']]], ['starpu_5fmatrix_5finterface_5fid',['STARPU_MATRIX_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357caf3641ac475b4b69aa6ef5758b950348a',1,'starpu_data_interfaces.h']]], ['starpu_5fmax_5finterface_5fid',['STARPU_MAX_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca0eed341fd3aa3fdc35d2f38b3eae09b0',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiformat_5finterface_5fid',['STARPU_MULTIFORMAT_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cace921145fc7dd66a423b1c52991c6335',1,'starpu_data_interfaces.h']]], ['starpu_5fnl_5fregression_5fbased',['STARPU_NL_REGRESSION_BASED',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6a4b1935cc6389974fe69120e978aa3a29',1,'starpu_perfmodel.h']]], ['starpu_5fnone',['STARPU_NONE',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dbaacd20c7596d4c1ffc6dbeaa632a6a6a6',1,'starpu_data.h']]], ['starpu_5fopencl_5fdefault',['STARPU_OPENCL_DEFAULT',['../group__API__Performance__Model.html#ggaa178fceed017bdbe1bee860d7882565fa6d6e564da79daf52911a0e67393cac93',1,'starpu_perfmodel.h']]], ['starpu_5fopencl_5fram',['STARPU_OPENCL_RAM',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a6e0c8b16179c2829393a373831c3b802',1,'starpu_data.h']]], ['starpu_5fopencl_5fworker',['STARPU_OPENCL_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37da113d54380f4e41e4da1f94b1a779634f',1,'starpu_worker.h']]], ['starpu_5fper_5farch',['STARPU_PER_ARCH',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6ae4b97f418bd3496f23889a6950d7be82',1,'starpu_perfmodel.h']]], ['starpu_5fr',['STARPU_R',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dbaa4c2445a344c592fb7b1adfcf1d2e1f5',1,'starpu_data.h']]], ['starpu_5fredux',['STARPU_REDUX',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba6011b5abab92fd996b29d622c4a488f4',1,'starpu_data.h']]], ['starpu_5fregression_5fbased',['STARPU_REGRESSION_BASED',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6ab46450dd0cc93e3aaed1900afdcad26f',1,'starpu_perfmodel.h']]], ['starpu_5frw',['STARPU_RW',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba20da2e02cd303015b5967dbf72ef3e1e',1,'starpu_data.h']]], ['starpu_5fscratch',['STARPU_SCRATCH',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba2a5d5e11b2ec3aa14f5c9bf94accf6f6',1,'starpu_data.h']]], ['starpu_5fseq',['STARPU_SEQ',['../group__API__Codelet__And__Tasks.html#ggac127ad106bf376da993d3f4caa979b2fa6622e698785a33f14549958f44577fcf',1,'starpu_task.h']]], ['starpu_5fspmd',['STARPU_SPMD',['../group__API__Codelet__And__Tasks.html#ggac127ad106bf376da993d3f4caa979b2fad58c1d1b9c143aed79f1ddf6dc104746',1,'starpu_task.h']]], ['starpu_5fssend',['STARPU_SSEND',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dbaf96ec45077e70239a826867ed897bd0f',1,'starpu_data.h']]], ['starpu_5ftask_5fblocked',['STARPU_TASK_BLOCKED',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a677b001ff383c2e11850a03595949a6c',1,'starpu_task.h']]], ['starpu_5ftask_5fblocked_5fon_5fdata',['STARPU_TASK_BLOCKED_ON_DATA',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a5ff984632a93a5e0c5d8579c78b1edb0',1,'starpu_task.h']]], ['starpu_5ftask_5fblocked_5fon_5ftag',['STARPU_TASK_BLOCKED_ON_TAG',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202afa01b5f07d5e628759f9a26c7077f9d4',1,'starpu_task.h']]], ['starpu_5ftask_5fblocked_5fon_5ftask',['STARPU_TASK_BLOCKED_ON_TASK',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a8f0b251db9e88be0bd7af98816c22a78',1,'starpu_task.h']]], ['starpu_5ftask_5ffinished',['STARPU_TASK_FINISHED',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a01380324ad453dd9154c38582df6359e',1,'starpu_task.h']]], ['starpu_5ftask_5fready',['STARPU_TASK_READY',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a77b817e6cd032658581f7b9cf12dd3e3',1,'starpu_task.h']]], ['starpu_5ftask_5frunning',['STARPU_TASK_RUNNING',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202afcf62642e96b8982135f58a477e9ea9c',1,'starpu_task.h']]], ['starpu_5ftop_5fdata_5fboolean',['STARPU_TOP_DATA_BOOLEAN',['../group__API__StarPUTop__Interface.html#gga7b7dfbb9c273503e6e7f5790b39e2d27a8ae4c093533aae3d4ece7910d16fa7cf',1,'starpu_top.h']]], ['starpu_5ftop_5fdata_5ffloat',['STARPU_TOP_DATA_FLOAT',['../group__API__StarPUTop__Interface.html#gga7b7dfbb9c273503e6e7f5790b39e2d27adfb99eeccad78dbb404dc39f058e22be',1,'starpu_top.h']]], ['starpu_5ftop_5fdata_5finteger',['STARPU_TOP_DATA_INTEGER',['../group__API__StarPUTop__Interface.html#gga7b7dfbb9c273503e6e7f5790b39e2d27a70a25dacfac1c08f2e73263f9b10a21e',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5fboolean',['STARPU_TOP_PARAM_BOOLEAN',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9a6e452fdfa703a7292d7526844309dd34',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5fenum',['STARPU_TOP_PARAM_ENUM',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9aaea8e0c88de44de91feaf091f2f8f431',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5ffloat',['STARPU_TOP_PARAM_FLOAT',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9a2d732b79d2e553a6d248a348b07e1422',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5finteger',['STARPU_TOP_PARAM_INTEGER',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9ac1737a4533dd745432df144d19f7874f',1,'starpu_top.h']]], ['starpu_5funknown_5finterface_5fid',['STARPU_UNKNOWN_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca26edb6f25f81276cc829b070fd240472',1,'starpu_data_interfaces.h']]], ['starpu_5funused',['STARPU_UNUSED',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a92a0688575c41519f031fefd35f51c9e',1,'starpu_data.h']]], ['starpu_5fvariable_5finterface_5fid',['STARPU_VARIABLE_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cae02c3d444d843270b692718f22173ab3',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5finterface_5fid',['STARPU_VECTOR_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cabd89ff25621eab18a8a7306842c13217',1,'starpu_data_interfaces.h']]], ['starpu_5fvoid_5finterface_5fid',['STARPU_VOID_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca3867ecf55ad294013fd36c502af39d12',1,'starpu_data_interfaces.h']]], ['starpu_5fw',['STARPU_W',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba052ab75035ca297c7955363c605231c8',1,'starpu_data.h']]], ['starpu_5fworker_5flist',['STARPU_WORKER_LIST',['../group__API__Workers__Properties.html#gga80b06886ee8a4c0e99b09ab638113af3a7fb30f298c82f9375f49a42664d473bc',1,'starpu_worker.h']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_75.js0000644000373600000000000000213412571536757016044 00000000000000var searchData= [ ['unpack_5fdata',['unpack_data',['../group__API__Data__Interfaces.html#afd0c4b61d3490b57086f94e71eb83d87',1,'starpu_data_interface_ops']]], ['use_5fexplicit_5fworkers_5fbindid',['use_explicit_workers_bindid',['../group__API__Initialization__and__Termination.html#a920746f2be42c1606e6bfcadde3ff427',1,'starpu_conf']]], ['use_5fexplicit_5fworkers_5fcuda_5fgpuid',['use_explicit_workers_cuda_gpuid',['../group__API__Initialization__and__Termination.html#a64ef5f83556daf744b0b0e9033233ccc',1,'starpu_conf']]], ['use_5fexplicit_5fworkers_5fopencl_5fgpuid',['use_explicit_workers_opencl_gpuid',['../group__API__Initialization__and__Termination.html#a3b842a7eaf982a4fd80298c9c47332ea',1,'starpu_conf']]], ['use_5ftag',['use_tag',['../group__API__Codelet__And__Tasks.html#aa742a7ba77a2c6a825edbfe7f35a6ba7',1,'starpu_task']]], ['used_5fcycles',['used_cycles',['../group__API__Profiling.html#a23f0def141795b2e4c50ec0497108ed2',1,'starpu_profiling_task_info::used_cycles()'],['../group__API__Profiling.html#a21e826e8d51b915825af4b22d2ca17ce',1,'starpu_profiling_worker_info::used_cycles()']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_63.html0000644000373600000000000000170712571536757017145 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_72.html0000644000373600000000000000171212571536757017572 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_61.js0000644000373600000000000000014712571536757016370 00000000000000var searchData= [ ['advanced_20examples',['Advanced Examples',['../AdvancedExamples.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_72.js0000644000373600000000000000606712571536757017252 00000000000000var searchData= [ ['r',['r',['../group__API__Data__Interfaces.html#abb0c58bc42c9f81e6373d5e953a90de5',1,'starpu_bcsr_interface']]], ['ram_5fto_5fcuda',['ram_to_cuda',['../group__API__Data__Interfaces.html#a591563e1f3a6b3d4c7a302ace052b799',1,'starpu_data_copy_methods']]], ['ram_5fto_5fcuda_5fasync',['ram_to_cuda_async',['../group__API__Data__Interfaces.html#acc3e384af8664453e291dbfb69457906',1,'starpu_data_copy_methods']]], ['ram_5fto_5fopencl',['ram_to_opencl',['../group__API__Data__Interfaces.html#a2641c532eb119e22e9e59884dda01674',1,'starpu_data_copy_methods']]], ['ram_5fto_5fopencl_5fasync',['ram_to_opencl_async',['../group__API__Data__Interfaces.html#a1d62c0f83abb9cb01c75a119ed9503b1',1,'starpu_data_copy_methods']]], ['ram_5fto_5fram',['ram_to_ram',['../group__API__Data__Interfaces.html#afd6038b7d5d018247b3215e141ba1ced',1,'starpu_data_copy_methods']]], ['real_5fstart_5ftime',['real_start_time',['../group__API__SC__Hypervisor.html#a38be8cb0907ba69c715cbbfa0a078e65',1,'sc_hypervisor_wrapper']]], ['receiver_5fsched_5fctx',['receiver_sched_ctx',['../group__API__SC__Hypervisor.html#ac24cdb1fe5c0efc413267a980a8976bb',1,'sc_hypervisor_resize_ack']]], ['ref_5fspeed',['ref_speed',['../group__API__SC__Hypervisor.html#a9e05a2c227901a17b2cd15107b9d4640',1,'sc_hypervisor_wrapper']]], ['regenerate',['regenerate',['../group__API__Codelet__And__Tasks.html#a7a924cb59478069efa57ab39eea5ff2a',1,'starpu_task']]], ['register_5fdata_5fhandle',['register_data_handle',['../group__API__Data__Interfaces.html#a1644a9f37ca217507ab5192a7d2f1e60',1,'starpu_data_interface_ops']]], ['regression',['regression',['../group__API__Performance__Model.html#a90e85ec3240051bec9124d5dc677cf46',1,'starpu_perfmodel_per_arch']]], ['release_5fdata_5fend_5ftime',['release_data_end_time',['../group__API__Profiling.html#abe6ac21a8e41f8d145f46075a0af89a4',1,'starpu_profiling_task_info']]], ['release_5fdata_5fstart_5ftime',['release_data_start_time',['../group__API__Profiling.html#a448a1d08cb4f1a23433a31a8cff2f604',1,'starpu_profiling_task_info']]], ['remaining_5fflops',['remaining_flops',['../group__API__SC__Hypervisor.html#aa89295f0dbed47350995451736d4d1a3',1,'sc_hypervisor_wrapper']]], ['remove',['remove',['../group__API__Workers__Properties.html#a03bfc24432357cc128363fe22cbd12a3',1,'starpu_worker_collection']]], ['remove_5fworkers',['remove_workers',['../group__API__Scheduling__Policy.html#acc8c1fc122f9752aba6ecb70cd3a15fe',1,'starpu_sched_policy']]], ['resize_5fack',['resize_ack',['../group__API__SC__Hypervisor.html#a701a3bd29f67cdcc71a2507bac866553',1,'sc_hypervisor_wrapper']]], ['resize_5fctxs',['resize_ctxs',['../group__API__SC__Hypervisor.html#a323600b52a95f2be31f1f72f59c613b3',1,'sc_hypervisor_policy']]], ['rowptr',['rowptr',['../group__API__Data__Interfaces.html#ad134162547199f87e2db3ff0bad3c54d',1,'starpu_csr_interface::rowptr()'],['../group__API__Data__Interfaces.html#ab0abbed006274d4f8244767254e1bd04',1,'starpu_bcsr_interface::rowptr()']]], ['rows',['rows',['../group__API__Data__Interfaces.html#a9f4e98142b08b50a5034a44c8740f985',1,'starpu_coo_interface']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_76.html0000644000373600000000000000171212571536757017576 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/functions_73.html0000644000373600000000000000171212571536757017633 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_68.js0000644000373600000000000000025512571536757016377 00000000000000var searchData= [ ['how_20to_20optimize_20performance_20with_20starpu',['How To Optimize Performance With StarPU',['../HowToOptimizePerformanceWithStarPU.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_77.html0000644000373600000000000000170412571536757016400 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_77.js0000644000373600000000000000300612571536757016045 00000000000000var searchData= [ ['workers_e2_80_99_20properties',['Workers’ Properties',['../group__API__Workers__Properties.html',1,'']]], ['where',['where',['../group__API__Codelet__And__Tasks.html#a251eb3ebfa11a9da85446eec7b80772c',1,'starpu_codelet']]], ['worker_5farchtypes',['worker_archtypes',['../group__API__FxT__Support.html#a9d3191d2649dc2ac99a7e863eac6a65b',1,'starpu_fxt_options']]], ['worker_5fnames',['worker_names',['../group__API__FxT__Support.html#ac7769d24aa0bd3f5277383d5879f1e1b',1,'starpu_fxt_options']]], ['worker_5fto_5fbe_5fremoved',['worker_to_be_removed',['../group__API__SC__Hypervisor.html#a4de5ef755a7476cfac78dcc2290ec8e8',1,'sc_hypervisor_wrapper']]], ['workerid',['workerid',['../group__API__Profiling.html#af4665663048700edd2c9cfd446fd796f',1,'starpu_profiling_task_info::workerid()'],['../group__API__Codelet__And__Tasks.html#a420258e4c87454d78f81087092ef8e6a',1,'starpu_task::workerid()']]], ['workerids',['workerids',['../group__API__Workers__Properties.html#acdae7c420e6da90633296a783d7a3a30',1,'starpu_worker_collection']]], ['workers_5fbindid',['workers_bindid',['../group__API__Initialization__and__Termination.html#a39daa766673e03f793c879b75a17efe4',1,'starpu_conf']]], ['workers_5fcuda_5fgpuid',['workers_cuda_gpuid',['../group__API__Initialization__and__Termination.html#aeaaa87a158d829a3dd94d60e35586aa3',1,'starpu_conf']]], ['workers_5fopencl_5fgpuid',['workers_opencl_gpuid',['../group__API__Initialization__and__Termination.html#a9ba17cabecb4281320182cb713400423',1,'starpu_conf']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_6f.js0000644000373600000000000000353112571536757016126 00000000000000var searchData= [ ['opencl_20extensions',['OpenCL Extensions',['../group__API__OpenCL__Extensions.html',1,'']]], ['offset',['offset',['../group__API__Data__Interfaces.html#a40dac9900cbc81a5a7cfac263827b66c',1,'starpu_matrix_interface::offset()'],['../group__API__Data__Interfaces.html#aa3c9580d9f18ef09d128eb61c49456d0',1,'starpu_block_interface::offset()'],['../group__API__Data__Interfaces.html#a0f3335c03646157c15973e58b784ad87',1,'starpu_vector_interface::offset()']]], ['opencl_5felemsize',['opencl_elemsize',['../group__API__Multiformat__Data__Interface.html#a13e0663adec6d682264f032af1d4458f',1,'starpu_multiformat_data_interface_ops']]], ['opencl_5ffunc',['opencl_func',['../group__API__Codelet__And__Tasks.html#a6abec07564f333e308e303e2caf54ec3',1,'starpu_codelet']]], ['opencl_5ffuncs',['opencl_funcs',['../group__API__Codelet__And__Tasks.html#af0d0d3ae164df9993d6d3fec09a1cf33',1,'starpu_codelet']]], ['opencl_5fto_5fcpu_5fcl',['opencl_to_cpu_cl',['../group__API__Multiformat__Data__Interface.html#aa0fde881278fc5ee08d14a2d8a1ccbd7',1,'starpu_multiformat_data_interface_ops']]], ['opencl_5fto_5fcuda',['opencl_to_cuda',['../group__API__Data__Interfaces.html#af737619bef64c788e349858821950705',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fopencl',['opencl_to_opencl',['../group__API__Data__Interfaces.html#a4b5f0bcb9dc7d95fa485059be5dbee5c',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fopencl_5fasync',['opencl_to_opencl_async',['../group__API__Data__Interfaces.html#a5c4d8605f0494f23ed4f3cb93f868e10',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fram',['opencl_to_ram',['../group__API__Data__Interfaces.html#a7779dfce0e5246fb09b34622097445e3',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fram_5fasync',['opencl_to_ram_async',['../group__API__Data__Interfaces.html#ad7974847a7e12a8647e1da0082f480f0',1,'starpu_data_copy_methods']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_65.html0000644000373600000000000000170612571536757016726 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_77.html0000644000373600000000000000170712571536757017152 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_6f.html0000644000373600000000000000170412571536757016456 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_68.html0000644000373600000000000000171212571536757017577 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_72.html0000644000373600000000000000170412571536757016373 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_6d.html0000644000373600000000000000171212571536757017653 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_66.js0000644000373600000000000000050412571536757016372 00000000000000var searchData= [ ['fft_20support',['FFT Support',['../FFTSupport.html',1,'']]], ['files',['Files',['../Files.html',1,'']]], ['full_20source_20code_20for_20the_20_e2_80_99scaling_20a_20vector_e2_80_99_20example',['Full source code for the ’Scaling a Vector’ example',['../FullSourceCodeVectorScal.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_76.js0000644000373600000000000000062612571536757017251 00000000000000var searchData= [ ['valid',['valid',['../group__API__Performance__Model.html#a6f08efd7380b81cb59ede878a33bd5fa',1,'starpu_perfmodel_regression_model']]], ['value',['value',['../group__API__StarPUTop__Interface.html#a5353f4bb17f42b4bdb1052d0e24c9f66',1,'starpu_top_param']]], ['values',['values',['../group__API__Data__Interfaces.html#a467d82e68a55c78a64bddbe2885fb8bb',1,'starpu_coo_interface']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_6d.html0000644000373600000000000000170712571536757017226 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/enums_73.js0000644000373600000000000000362312571536757016425 00000000000000var searchData= [ ['starpu_5fcodelet_5ftype',['starpu_codelet_type',['../group__API__Codelet__And__Tasks.html#gac127ad106bf376da993d3f4caa979b2f',1,'starpu_task.h']]], ['starpu_5fdata_5faccess_5fmode',['starpu_data_access_mode',['../group__API__Data__Management.html#ga1fb3a1ff8622747d653d1b5f41bc41db',1,'starpu_data.h']]], ['starpu_5fdata_5finterface_5fid',['starpu_data_interface_id',['../group__API__Data__Interfaces.html#gaa2f2140147f15e7b9eec1443690e357c',1,'starpu_data_interfaces.h']]], ['starpu_5fnode_5fkind',['starpu_node_kind',['../group__API__Workers__Properties.html#ga6f3fbb6e918d0135ccb68473a8ee5ca1',1,'starpu_data.h']]], ['starpu_5fperfmodel_5farchtype',['starpu_perfmodel_archtype',['../group__API__Performance__Model.html#gaa178fceed017bdbe1bee860d7882565f',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5ftype',['starpu_perfmodel_type',['../group__API__Performance__Model.html#gae161a7cae376f3fc831a2b764e8144e6',1,'starpu_perfmodel.h']]], ['starpu_5ftask_5fstatus',['starpu_task_status',['../group__API__Codelet__And__Tasks.html#ga0088c4ab87a08b3e7a375c1a79e91202',1,'starpu_task.h']]], ['starpu_5ftop_5fdata_5ftype',['starpu_top_data_type',['../group__API__StarPUTop__Interface.html#ga7b7dfbb9c273503e6e7f5790b39e2d27',1,'starpu_top.h']]], ['starpu_5ftop_5fmessage_5ftype',['starpu_top_message_type',['../group__API__StarPUTop__Interface.html#ga568af4507d96390316b93c92fee45f52',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5ftype',['starpu_top_param_type',['../group__API__StarPUTop__Interface.html#ga1979aeea98f354bd500f4902ef2299d9',1,'starpu_top.h']]], ['starpu_5fworker_5farchtype',['starpu_worker_archtype',['../group__API__Workers__Properties.html#ga173d616aefe98c33a47a847fd2fca37d',1,'starpu_worker.h']]], ['starpu_5fworker_5fcollection_5ftype',['starpu_worker_collection_type',['../group__API__Workers__Properties.html#ga80b06886ee8a4c0e99b09ab638113af3',1,'starpu_worker.h']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_72.html0000644000373600000000000000170712571536757017145 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_61.html0000644000373600000000000000170612571536757016722 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_65.html0000644000373600000000000000170712571536757017147 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_64.js0000644000373600000000000000631712571536757017251 00000000000000var searchData= [ ['data_5fsize',['data_size',['../group__API__SC__Hypervisor.html#afdf2824e028c9ead969948ccb0efe6c4',1,'sc_hypervisor_policy_task_pool']]], ['deinit',['deinit',['../group__API__Workers__Properties.html#a65248cebeb87e139b7862f45991af4f3',1,'starpu_worker_collection']]], ['deinit_5fsched',['deinit_sched',['../group__API__Scheduling__Policy.html#aff1b9fd2269299f99b7410b3f2b18e3c',1,'starpu_sched_policy']]], ['destroy',['destroy',['../group__API__Codelet__And__Tasks.html#a3a9568421a4f6e54cb71c7f2806ad92e',1,'starpu_task']]], ['detach',['detach',['../group__API__Codelet__And__Tasks.html#a295e3e4315544880389d29229f085207',1,'starpu_task']]], ['dev_5fhandle',['dev_handle',['../group__API__Data__Interfaces.html#a1cf69fd84bad6901a2ec35733799b806',1,'starpu_matrix_interface::dev_handle()'],['../group__API__Data__Interfaces.html#afd291d3734d196bc3cde21ba9ec36268',1,'starpu_block_interface::dev_handle()'],['../group__API__Data__Interfaces.html#ae97dc938c0f7cd70873ba617c478d08b',1,'starpu_vector_interface::dev_handle()']]], ['deviation',['deviation',['../group__API__Performance__Model.html#a4752374bc8245e9cb4f057b78f14c0de',1,'starpu_perfmodel_history_entry']]], ['disable_5fasynchronous_5fcopy',['disable_asynchronous_copy',['../group__API__Initialization__and__Termination.html#a360761e8c928805762561b30b3b5d92c',1,'starpu_conf']]], ['disable_5fasynchronous_5fcuda_5fcopy',['disable_asynchronous_cuda_copy',['../group__API__Initialization__and__Termination.html#ae92bd88466598b50b425fe481ca94e89',1,'starpu_conf']]], ['disable_5fasynchronous_5fopencl_5fcopy',['disable_asynchronous_opencl_copy',['../group__API__Initialization__and__Termination.html#adcf7b06f318677591d51d0823daa5859',1,'starpu_conf']]], ['display',['display',['../group__API__Data__Interfaces.html#aa7778debf6661bf5be3ce8101aae224d',1,'starpu_data_interface_ops']]], ['double_5fmax_5fvalue',['double_max_value',['../group__API__StarPUTop__Interface.html#a8416d4cc0107bd5199174752d279c1fb',1,'starpu_top_data::double_max_value()'],['../group__API__StarPUTop__Interface.html#aacb63578d756be4fe6dd6aaffde3b512',1,'starpu_top_param::double_max_value()']]], ['double_5fmin_5fvalue',['double_min_value',['../group__API__StarPUTop__Interface.html#abc246f42eacbefef34117d9f29cf4b41',1,'starpu_top_data::double_min_value()'],['../group__API__StarPUTop__Interface.html#aaf02a9317ed869c5473286c1e5a816c1',1,'starpu_top_param::double_min_value()']]], ['dumped_5fcodelets',['dumped_codelets',['../group__API__FxT__Support.html#a8d5804f46a44162d9d5839daefd5c002',1,'starpu_fxt_options']]], ['dumped_5fcodelets_5fcount',['dumped_codelets_count',['../group__API__FxT__Support.html#a6a146a384139494daea99676cbbc8cf1',1,'starpu_fxt_options']]], ['dyn_5fhandles',['dyn_handles',['../group__API__Codelet__And__Tasks.html#afb79130d7ca273b33c8b853654620178',1,'starpu_task']]], ['dyn_5finterfaces',['dyn_interfaces',['../group__API__Codelet__And__Tasks.html#ac3601bc8cbba8bc2cb865bfdcc1f4fb6',1,'starpu_task']]], ['dyn_5fmodes',['dyn_modes',['../group__API__Codelet__And__Tasks.html#a50e9bb70870a1190cbfee6e063d12865',1,'starpu_codelet']]], ['dyn_5fnodes',['dyn_nodes',['../group__API__Codelet__And__Tasks.html#ab402d1adc39a713576d150f1f144b2d1',1,'starpu_codelet']]] ]; starpu-1.1.5/doc/doxygen/html/search/search.css0000644000373600000000000000762412571536757016413 00000000000000/*---------------- Search Box */ #FSearchBox { float: left; } #MSearchBox { white-space : nowrap; position: absolute; float: none; display: inline; margin-top: 8px; right: 0px; width: 170px; z-index: 102; background-color: white; } #MSearchBox .left { display:block; position:absolute; left:10px; width:20px; height:19px; background:url('search_l.png') no-repeat; background-position:right; } #MSearchSelect { display:block; position:absolute; width:20px; height:19px; } .left #MSearchSelect { left:4px; } .right #MSearchSelect { right:5px; } #MSearchField { display:block; position:absolute; height:19px; background:url('search_m.png') repeat-x; border:none; width:116px; margin-left:20px; padding-left:4px; color: #909090; outline: none; font: 9pt Arial, Verdana, sans-serif; } #FSearchBox #MSearchField { margin-left:15px; } #MSearchBox .right { display:block; position:absolute; right:10px; top:0px; width:20px; height:19px; background:url('search_r.png') no-repeat; background-position:left; } #MSearchClose { display: none; position: absolute; top: 4px; background : none; border: none; margin: 0px 4px 0px 0px; padding: 0px 0px; outline: none; } .left #MSearchClose { left: 6px; } .right #MSearchClose { right: 2px; } .MSearchBoxActive #MSearchField { color: #000000; } /*---------------- Search filter selection */ #MSearchSelectWindow { display: none; position: absolute; left: 0; top: 0; border: 1px solid #90A5CE; background-color: #F9FAFC; z-index: 1; padding-top: 4px; padding-bottom: 4px; -moz-border-radius: 4px; -webkit-border-top-left-radius: 4px; -webkit-border-top-right-radius: 4px; -webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-right-radius: 4px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); } .SelectItem { font: 8pt Arial, Verdana, sans-serif; padding-left: 2px; padding-right: 12px; border: 0px; } span.SelectionMark { margin-right: 4px; font-family: monospace; outline-style: none; text-decoration: none; } a.SelectItem { display: block; outline-style: none; color: #000000; text-decoration: none; padding-left: 6px; padding-right: 12px; } a.SelectItem:focus, a.SelectItem:active { color: #000000; outline-style: none; text-decoration: none; } a.SelectItem:hover { color: #FFFFFF; background-color: #3D578C; outline-style: none; text-decoration: none; cursor: pointer; display: block; } /*---------------- Search results window */ iframe#MSearchResults { width: 60ex; height: 15em; } #MSearchResultsWindow { display: none; position: absolute; left: 0; top: 0; border: 1px solid #000; background-color: #EEF1F7; } /* ----------------------------------- */ #SRIndex { clear:both; padding-bottom: 15px; } .SREntry { font-size: 10pt; padding-left: 1ex; } .SRPage .SREntry { font-size: 8pt; padding: 1px 5px; } body.SRPage { margin: 5px 2px; } .SRChildren { padding-left: 3ex; padding-bottom: .5em } .SRPage .SRChildren { display: none; } .SRSymbol { font-weight: bold; color: #425E97; font-family: Arial, Verdana, sans-serif; text-decoration: none; outline: none; } a.SRScope { display: block; color: #425E97; font-family: Arial, Verdana, sans-serif; text-decoration: none; outline: none; } a.SRSymbol:focus, a.SRSymbol:active, a.SRScope:focus, a.SRScope:active { text-decoration: underline; } span.SRScope { padding-left: 4px; } .SRPage .SRStatus { padding: 2px 5px; font-size: 8pt; font-style: italic; } .SRResult { display: none; } DIV.searchresults { margin-left: 10px; margin-right: 10px; } starpu-1.1.5/doc/doxygen/html/search/variables_75.js0000644000373600000000000000213412571536757017244 00000000000000var searchData= [ ['unpack_5fdata',['unpack_data',['../group__API__Data__Interfaces.html#afd0c4b61d3490b57086f94e71eb83d87',1,'starpu_data_interface_ops']]], ['use_5fexplicit_5fworkers_5fbindid',['use_explicit_workers_bindid',['../group__API__Initialization__and__Termination.html#a920746f2be42c1606e6bfcadde3ff427',1,'starpu_conf']]], ['use_5fexplicit_5fworkers_5fcuda_5fgpuid',['use_explicit_workers_cuda_gpuid',['../group__API__Initialization__and__Termination.html#a64ef5f83556daf744b0b0e9033233ccc',1,'starpu_conf']]], ['use_5fexplicit_5fworkers_5fopencl_5fgpuid',['use_explicit_workers_opencl_gpuid',['../group__API__Initialization__and__Termination.html#a3b842a7eaf982a4fd80298c9c47332ea',1,'starpu_conf']]], ['use_5ftag',['use_tag',['../group__API__Codelet__And__Tasks.html#aa742a7ba77a2c6a825edbfe7f35a6ba7',1,'starpu_task']]], ['used_5fcycles',['used_cycles',['../group__API__Profiling.html#a23f0def141795b2e4c50ec0497108ed2',1,'starpu_profiling_task_info::used_cycles()'],['../group__API__Profiling.html#a21e826e8d51b915825af4b22d2ca17ce',1,'starpu_profiling_worker_info::used_cycles()']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_68.js0000644000373600000000000000347312571536757017255 00000000000000var searchData= [ ['handle',['handle',['../group__API__Codelet__And__Tasks.html#a445f957b14c8b57f5891802b2084bea6',1,'starpu_data_descr']]], ['handle_5fidle_5fcycle',['handle_idle_cycle',['../group__API__SC__Hypervisor.html#aa227429c6cf34c69c32b143b933a07b7',1,'sc_hypervisor_policy']]], ['handle_5fidle_5fend',['handle_idle_end',['../group__API__SC__Hypervisor.html#a9ef96b3ab6d2247ecb336900e5051cd1',1,'sc_hypervisor_policy']]], ['handle_5fpoped_5ftask',['handle_poped_task',['../group__API__SC__Hypervisor.html#a38f0b680a437c321ed5f9a5f91261e73',1,'sc_hypervisor_policy']]], ['handle_5fpost_5fexec_5fhook',['handle_post_exec_hook',['../group__API__SC__Hypervisor.html#a8360ac46ace04f60b44fd83ed6db16ee',1,'sc_hypervisor_policy']]], ['handle_5fpushed_5ftask',['handle_pushed_task',['../group__API__SC__Hypervisor.html#a9a10eb6dd3eb12543e505411585bafb7',1,'sc_hypervisor_policy']]], ['handle_5fsubmitted_5fjob',['handle_submitted_job',['../group__API__SC__Hypervisor.html#a31a2a9dc2fba831c86f3369974c3b874',1,'sc_hypervisor_policy']]], ['handle_5fto_5fpointer',['handle_to_pointer',['../group__API__Data__Interfaces.html#ad2b81849c511d79da324a88540cbf8b0',1,'starpu_data_interface_ops']]], ['handles',['handles',['../group__API__Codelet__And__Tasks.html#afaf0e8924390406c488144431ed3a0de',1,'starpu_task']]], ['has_5fnext',['has_next',['../group__API__Workers__Properties.html#a3a272285109c3e462cd1ce43b90616bf',1,'starpu_worker_collection']]], ['head',['head',['../group__API__Task__Lists.html#a8d37485dd1e0cbf987c3da294e3e4ea4',1,'starpu_task_list']]], ['history',['history',['../group__API__Performance__Model.html#a039135e38a71f53d048651ff9f760305',1,'starpu_perfmodel_per_arch']]], ['hypervisor_5ftag',['hypervisor_tag',['../group__API__Codelet__And__Tasks.html#a7d2bc18a8c0d5d2b407e767af02a6f6d',1,'starpu_task']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_63.js0000644000373600000000000000032312571536757016606 00000000000000var searchData= [ ['codelet_20and_20tasks',['Codelet And Tasks',['../group__API__Codelet__And__Tasks.html',1,'']]], ['cuda_20extensions',['CUDA Extensions',['../group__API__CUDA__Extensions.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_61.js0000644000373600000000000000277512571536757016052 00000000000000var searchData= [ ['a',['a',['../group__API__Performance__Model.html#a2f37ce35ec69b03c19b3832c6b922c8e',1,'starpu_perfmodel_regression_model']]], ['acked_5fworkers',['acked_workers',['../group__API__SC__Hypervisor.html#a5ebd37bd5c225c6b354750be598cd90f',1,'sc_hypervisor_resize_ack']]], ['acquire_5fdata_5fend_5ftime',['acquire_data_end_time',['../group__API__Profiling.html#a28f087b9a4605f7cfc37e0511686e6e8',1,'starpu_profiling_task_info']]], ['acquire_5fdata_5fstart_5ftime',['acquire_data_start_time',['../group__API__Profiling.html#a378ede6a6d188f68feda3a041134f351',1,'starpu_profiling_task_info']]], ['active',['active',['../group__API__StarPUTop__Interface.html#adce03726f49ac1f522cd660847dcfec6',1,'starpu_top_data']]], ['add',['add',['../group__API__Workers__Properties.html#acd4bb28e0712cccaae687c4e3cf75a99',1,'starpu_worker_collection']]], ['add_5fworkers',['add_workers',['../group__API__Scheduling__Policy.html#af98c835236665b8e8be259593d65b757',1,'starpu_sched_policy']]], ['advanced_20examples',['Advanced Examples',['../AdvancedExamples.html',1,'']]], ['allocate_5fdata_5fon_5fnode',['allocate_data_on_node',['../group__API__Data__Interfaces.html#a16f76ee4b4ea9f7322adfc4678ef08f6',1,'starpu_data_interface_ops']]], ['alpha',['alpha',['../group__API__Performance__Model.html#aa040f018a0b973ec311427371c56e51e',1,'starpu_perfmodel_regression_model']]], ['any_5fto_5fany',['any_to_any',['../group__API__Data__Interfaces.html#a1c7bc9f8788601449ca1c091d515d2c6',1,'starpu_data_copy_methods']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_73.js0000644000373600000000000040206112571536757016045 00000000000000var searchData= [ ['scheduling_20context_20hypervisor_20_2d_20building_20a_20new_20resizing_20policy',['Scheduling Context Hypervisor - Building a new resizing policy',['../group__API__SC__Hypervisor.html',1,'']]], ['scheduling_20context_20hypervisor_20_2d_20regular_20usage',['Scheduling Context Hypervisor - Regular usage',['../group__API__SC__Hypervisor__usage.html',1,'']]], ['scheduling_20contexts',['Scheduling Contexts',['../group__API__Scheduling__Contexts.html',1,'']]], ['scheduling_20policy',['Scheduling Policy',['../group__API__Scheduling__Policy.html',1,'']]], ['standard_20memory_20library',['Standard Memory Library',['../group__API__Standard__Memory__Library.html',1,'']]], ['starpu_2dtop_20interface',['StarPU-Top Interface',['../group__API__StarPUTop__Interface.html',1,'']]], ['sc_5fhypervisor_2eh',['sc_hypervisor.h',['../sc__hypervisor_8h.html',1,'']]], ['sc_5fhypervisor_5fadd_5fworkers_5fto_5fsched_5fctx',['sc_hypervisor_add_workers_to_sched_ctx',['../group__API__SC__Hypervisor__usage.html#ga886533650f0dbbef618c7fdfa75f9f0e',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fcan_5fresize',['sc_hypervisor_can_resize',['../group__API__SC__Hypervisor.html#gadf5585c656c7db3ee8f7b630b86e25e3',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fconfig_2eh',['sc_hypervisor_config.h',['../sc__hypervisor__config_8h.html',1,'']]], ['sc_5fhypervisor_5fctl',['sc_hypervisor_ctl',['../group__API__SC__Hypervisor__usage.html#ga0a4b27500994ca2c56047a7da18c6216',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5ffixed_5fworkers',['SC_HYPERVISOR_FIXED_WORKERS',['../group__API__SC__Hypervisor__usage.html#ga94eea335704bbfa52bc025ad4d49eb14',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5ffree_5fsize_5freq',['sc_hypervisor_free_size_req',['../group__API__SC__Hypervisor.html#ga5f34faa17f98f25bd874950ba1a15578',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fget_5fconfig',['sc_hypervisor_get_config',['../group__API__SC__Hypervisor.html#gaf3e884b4995e3dd608120e7fe0e48fae',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fget_5felapsed_5fflops_5fper_5fsched_5fctx',['sc_hypervisor_get_elapsed_flops_per_sched_ctx',['../group__API__SC__Hypervisor.html#ga32444b31927fbc49dc721ecbb66eae28',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fget_5fnsched_5fctxs',['sc_hypervisor_get_nsched_ctxs',['../group__API__SC__Hypervisor.html#ga7136151247abc7aab59ec8e0fe6e5224',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fget_5fpolicy',['sc_hypervisor_get_policy',['../group__API__SC__Hypervisor__usage.html#ga57103c5a62477b730b8d6d9a8f3514c7',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fget_5fsched_5fctxs',['sc_hypervisor_get_sched_ctxs',['../group__API__SC__Hypervisor.html#ga5450aa9edc6b19accef60539bbbd2e08',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fget_5fsize_5freq',['sc_hypervisor_get_size_req',['../group__API__SC__Hypervisor.html#ga1366fc9bb28170e9012dcad441696e52',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fget_5fwrapper',['sc_hypervisor_get_wrapper',['../group__API__SC__Hypervisor.html#gab02cf89fff4e322e47bc96fb3b60b1ac',1,'sc_hypervisor_monitoring.h']]], ['sc_5fhypervisor_5fgranularity',['SC_HYPERVISOR_GRANULARITY',['../group__API__SC__Hypervisor__usage.html#gaf1f5a13894874d87363c32351f573c86',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5finit',['sc_hypervisor_init',['../group__API__SC__Hypervisor__usage.html#ga15d008933c3c89906f613b3a24fff3cc',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fispeed_5fctx_5fsample',['SC_HYPERVISOR_ISPEED_CTX_SAMPLE',['../group__API__SC__Hypervisor__usage.html#ga7ba4c0c3deca0dd4148ddd1f0b919792',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fispeed_5fw_5fsample',['SC_HYPERVISOR_ISPEED_W_SAMPLE',['../group__API__SC__Hypervisor__usage.html#gac3b55f616c270eb90c0103d6f062d384',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5flp_2eh',['sc_hypervisor_lp.h',['../sc__hypervisor__lp_8h.html',1,'']]], ['sc_5fhypervisor_5fmax_5fidle',['SC_HYPERVISOR_MAX_IDLE',['../group__API__SC__Hypervisor__usage.html#ga70c120158d02e550632de0ec5a207df4',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fmax_5fworkers',['SC_HYPERVISOR_MAX_WORKERS',['../group__API__SC__Hypervisor__usage.html#gaafac498199c6441e2d45c9b4eac8dfe4',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fmin_5ftasks',['SC_HYPERVISOR_MIN_TASKS',['../group__API__SC__Hypervisor__usage.html#ga04164c5a91df51882e8bdd84fd1b1e3f',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fmin_5fworkers',['SC_HYPERVISOR_MIN_WORKERS',['../group__API__SC__Hypervisor__usage.html#ga6085b1585a13c94d48f185687c6a117c',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fmonitoring_2eh',['sc_hypervisor_monitoring.h',['../sc__hypervisor__monitoring_8h.html',1,'']]], ['sc_5fhypervisor_5fmove_5fworkers',['sc_hypervisor_move_workers',['../group__API__SC__Hypervisor__usage.html#gaccfcc47b137572f79916bff5d12414d0',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fnew_5fworkers_5fmax_5fidle',['SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE',['../group__API__SC__Hypervisor__usage.html#ga4ab22667e3bd2e963f7451552f716540',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fnull',['SC_HYPERVISOR_NULL',['../group__API__SC__Hypervisor__usage.html#gabf2475a79863da74418a12b2c5c37871',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fpolicy',['sc_hypervisor_policy',['../group__API__SC__Hypervisor.html#structsc__hypervisor__policy',1,'']]], ['sc_5fhypervisor_5fpolicy_2eh',['sc_hypervisor_policy.h',['../sc__hypervisor__policy_8h.html',1,'']]], ['sc_5fhypervisor_5fpolicy_5fconfig',['sc_hypervisor_policy_config',['../group__API__SC__Hypervisor.html#structsc__hypervisor__policy__config',1,'']]], ['sc_5fhypervisor_5fpolicy_5ftask_5fpool',['sc_hypervisor_policy_task_pool',['../group__API__SC__Hypervisor.html#structsc__hypervisor__policy__task__pool',1,'']]], ['sc_5fhypervisor_5fpost_5fresize_5frequest',['sc_hypervisor_post_resize_request',['../group__API__SC__Hypervisor.html#ga5f2b33a41a697759ee2a222e623f723c',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fpriority',['SC_HYPERVISOR_PRIORITY',['../group__API__SC__Hypervisor__usage.html#gad9267ab01a8e5db5b357d8749f9e8e1a',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fregister_5fctx',['sc_hypervisor_register_ctx',['../group__API__SC__Hypervisor__usage.html#ga4c83e2984867267ea8c7da9fbaf23858',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fremove_5fworkers_5ffrom_5fsched_5fctx',['sc_hypervisor_remove_workers_from_sched_ctx',['../group__API__SC__Hypervisor__usage.html#ga37713b9ab6d282f2b705240e630f1a4c',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fresize_5fack',['sc_hypervisor_resize_ack',['../group__API__SC__Hypervisor.html#structsc__hypervisor__resize__ack',1,'']]], ['sc_5fhypervisor_5fsave_5fsize_5freq',['sc_hypervisor_save_size_req',['../group__API__SC__Hypervisor.html#ga960ae31e317c65bfa9cc6a4e539a0c84',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fset_5fconfig',['sc_hypervisor_set_config',['../group__API__SC__Hypervisor.html#ga838703a5d26ea31f7415155ecbf1e490',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5fset_5ftype_5fof_5ftask',['sc_hypervisor_set_type_of_task',['../group__API__SC__Hypervisor__usage.html#ga6398be50d801f0fc5ad73506e392d476',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fshutdown',['sc_hypervisor_shutdown',['../group__API__SC__Hypervisor__usage.html#ga07b07d1fe5d41055f451fc92c60361e1',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fsize_5fctxs',['sc_hypervisor_size_ctxs',['../group__API__SC__Hypervisor__usage.html#gadd6bc55408b1f618edb44da49300bb5c',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fstart_5fresize',['sc_hypervisor_start_resize',['../group__API__SC__Hypervisor__usage.html#gae3ad958a1d841587df13c814ce966477',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fstop_5fresize',['sc_hypervisor_stop_resize',['../group__API__SC__Hypervisor__usage.html#gaa1e2878a06847489a4de2f33f62fa1af',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5ftime_5fto_5fapply',['SC_HYPERVISOR_TIME_TO_APPLY',['../group__API__SC__Hypervisor__usage.html#gac3e457f9b5741f587d241d62cc843f9e',1,'sc_hypervisor_config.h']]], ['sc_5fhypervisor_5funregister_5fctx',['sc_hypervisor_unregister_ctx',['../group__API__SC__Hypervisor__usage.html#ga0a20609c85fa479c3fd5892399099416',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fupdate_5fdiff_5felapsed_5fflops',['sc_hypervisor_update_diff_elapsed_flops',['../group__API__SC__Hypervisor__usage.html#gac89f5d5eba3f79151ef6b2a0e895f144',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fupdate_5fdiff_5ftotal_5fflops',['sc_hypervisor_update_diff_total_flops',['../group__API__SC__Hypervisor__usage.html#ga4dfbeda855bb8963c5332fdd796c0dcf',1,'sc_hypervisor.h']]], ['sc_5fhypervisor_5fwrapper',['sc_hypervisor_wrapper',['../group__API__SC__Hypervisor.html#structsc__hypervisor__wrapper',1,'']]], ['sched_5fctx',['sched_ctx',['../group__API__Codelet__And__Tasks.html#ac67b9ea06d1326bc0debd23f8f8ff524',1,'starpu_task::sched_ctx()'],['../group__API__SC__Hypervisor.html#ab56be8402f4a8e45938a7f688dc0e304',1,'sc_hypervisor_wrapper::sched_ctx()']]], ['sched_5fctx_5fid',['sched_ctx_id',['../group__API__SC__Hypervisor.html#a8c2e8240be080f6aa6f0ad02c9918a95',1,'sc_hypervisor_policy_task_pool']]], ['sched_5fpolicy',['sched_policy',['../group__API__Initialization__and__Termination.html#a77ddecd7ac4db8c0d91d7f92b17c97d8',1,'starpu_conf']]], ['sched_5fpolicy_5fname',['sched_policy_name',['../group__API__Initialization__and__Termination.html#a931fd8421de4a9f1a7eacdb3c2c428d5',1,'starpu_conf']]], ['scheduled',['scheduled',['../group__API__Codelet__And__Tasks.html#a76d331fb3a03f446206b2a0ce1fe290c',1,'starpu_task']]], ['scheduling_20context_20hypervisor',['Scheduling Context Hypervisor',['../SchedulingContextHypervisor.html',1,'']]], ['scheduling_20contexts',['Scheduling Contexts',['../SchedulingContexts.html',1,'']]], ['sequential_5fconsistency',['sequential_consistency',['../group__API__Codelet__And__Tasks.html#a1a38ca4084e0dcb222e67d1cbb7410a4',1,'starpu_task']]], ['single_5fcombined_5fworker',['single_combined_worker',['../group__API__Initialization__and__Termination.html#a0f74f54454b6d1051c02930be1870bf9',1,'starpu_conf']]], ['size',['size',['../group__API__Performance__Model.html#a31c30a57f076a4f12f7149c764763482',1,'starpu_perfmodel_history_entry']]], ['size_5fbase',['size_base',['../group__API__Performance__Model.html#a58f5d0179fb4ada4aab502ab01ae694c',1,'starpu_perfmodel_per_arch::size_base()'],['../group__API__Performance__Model.html#a5b94a978660fd6232a7ffc0d29c346d8',1,'starpu_perfmodel::size_base()']]], ['size_5fctxs',['size_ctxs',['../group__API__SC__Hypervisor.html#a81431b76980a77c424c38772968102e5',1,'sc_hypervisor_policy']]], ['sleeping_5ftime',['sleeping_time',['../group__API__Profiling.html#aa047efa28eaf40c2c9f3ed3c5dd1a1a2',1,'starpu_profiling_worker_info']]], ['socl_20opencl_20extensions',['SOCL OpenCL Extensions',['../SOCLOpenclExtensions.html',1,'']]], ['specific_5fnodes',['specific_nodes',['../group__API__Codelet__And__Tasks.html#a2355e594fff14f8ddd683d6b3e84102b',1,'starpu_codelet']]], ['stall_5fcycles',['stall_cycles',['../group__API__Profiling.html#ae10a681f6b9fac560c2d8ae5f359dbd8',1,'starpu_profiling_task_info::stall_cycles()'],['../group__API__Profiling.html#a2492ed12922fab27cf8c09679f70c175',1,'starpu_profiling_worker_info::stall_cycles()']]], ['starpu_2eh',['starpu.h',['../starpu_8h.html',1,'']]], ['starpu_5fabort',['STARPU_ABORT',['../group__API__Toolbox.html#ga3a4d1fb56668323d4f44c18f6a6dfb3f',1,'starpu_util.h']]], ['starpu_5fabort_5fmsg',['STARPU_ABORT_MSG',['../group__API__Toolbox.html#ga4268950ebf63c0f1dabcfd0cd8808067',1,'starpu_util.h']]], ['starpu_5fany_5fworker',['STARPU_ANY_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37dac4e189acc1d1b0971c8d950034048501',1,'starpu_worker.h']]], ['starpu_5fassert',['STARPU_ASSERT',['../group__API__Toolbox.html#ga05ac0dda104331f57d85823a4f9318ce',1,'starpu_util.h']]], ['starpu_5fassert_5fmsg',['STARPU_ASSERT_MSG',['../group__API__Toolbox.html#gabb6941113e19ee4045a014943cd62aae',1,'starpu_util.h']]], ['starpu_5fasynchronous_5fcopy_5fdisabled',['starpu_asynchronous_copy_disabled',['../group__API__Initialization__and__Termination.html#ga2cf027abaf6581c7baf98f9caeb9e4e5',1,'starpu.h']]], ['starpu_5fasynchronous_5fcuda_5fcopy_5fdisabled',['starpu_asynchronous_cuda_copy_disabled',['../group__API__Initialization__and__Termination.html#ga994d261c0ac05522b02ed3ab72dce2bd',1,'starpu.h']]], ['starpu_5fasynchronous_5fopencl_5fcopy_5fdisabled',['starpu_asynchronous_opencl_copy_disabled',['../group__API__Initialization__and__Termination.html#ga8a817e603dd7ce77a7712f7c981da081',1,'starpu.h']]], ['starpu_5fattribute_5faligned',['STARPU_ATTRIBUTE_ALIGNED',['../group__API__Toolbox.html#gae8c513ecd1a5bd87a7bdd71260c49ffc',1,'starpu_util.h']]], ['starpu_5fattribute_5finternal',['STARPU_ATTRIBUTE_INTERNAL',['../group__API__Toolbox.html#ga903e600059ba1735d5d6bd688dc0cc7e',1,'starpu_util.h']]], ['starpu_5fattribute_5fmalloc',['STARPU_ATTRIBUTE_MALLOC',['../group__API__Toolbox.html#ga214c60ee1b6cbc27ab08ba6f339ef8e5',1,'starpu_util.h']]], ['starpu_5fattribute_5fpure',['STARPU_ATTRIBUTE_PURE',['../group__API__Toolbox.html#ga057b12b615ce9e8a1fe7b5e10d9a5c2e',1,'starpu_util.h']]], ['starpu_5fattribute_5funused',['STARPU_ATTRIBUTE_UNUSED',['../group__API__Toolbox.html#ga9e7c20a6cdce868976a0046206b104e6',1,'starpu_util.h']]], ['starpu_5fattribute_5fwarn_5funused_5fresult',['STARPU_ATTRIBUTE_WARN_UNUSED_RESULT',['../group__API__Toolbox.html#ga71e28fc2a0a5267bc7edc0909d9d5117',1,'starpu_util.h']]], ['starpu_5fbcsr_5fdata_5fregister',['starpu_bcsr_data_register',['../group__API__Data__Interfaces.html#ga336c1bc150930da84a2abc7d146839c3',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5ffilter_5fcanonical_5fblock',['starpu_bcsr_filter_canonical_block',['../group__API__Data__Partition.html#ga0e1bee4821237529d554605d333e9109',1,'starpu_data_filters.h']]], ['starpu_5fbcsr_5fget_5fc',['starpu_bcsr_get_c',['../group__API__Data__Interfaces.html#ga6d0c09ee7cd90ac23454ef2040a4bc25',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fcolind',['STARPU_BCSR_GET_COLIND',['../group__API__Data__Interfaces.html#ga588a7cbb105708b588e5fe008fbb9e9c',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fcolind_5fdev_5fhandle',['STARPU_BCSR_GET_COLIND_DEV_HANDLE',['../group__API__Data__Interfaces.html#ga59cbe4cadbe314b73807dc20363db5b9',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5felemsize',['starpu_bcsr_get_elemsize',['../group__API__Data__Interfaces.html#ga40f5b44c5d9bfd39f2f305aa32a25787',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5ffirstentry',['starpu_bcsr_get_firstentry',['../group__API__Data__Interfaces.html#ga8c04948b40dc3902e9b3de7a84383381',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5flocal_5fcolind',['starpu_bcsr_get_local_colind',['../group__API__Data__Interfaces.html#ga54dca826f319369d94c4cd6be0eb4828',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5flocal_5fnzval',['starpu_bcsr_get_local_nzval',['../group__API__Data__Interfaces.html#gae48e867d81c554b199b127cf9bd4f5b2',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5flocal_5frowptr',['starpu_bcsr_get_local_rowptr',['../group__API__Data__Interfaces.html#ga97859bcb7bc60911362087eefc9249ed',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fnnz',['STARPU_BCSR_GET_NNZ',['../group__API__Data__Interfaces.html#gaea999f5e67e778ac28c0a8bc1633ff28',1,'STARPU_BCSR_GET_NNZ(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga8a4c1ddb71e09437717e298c3e2c39f9',1,'starpu_bcsr_get_nnz(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fnrow',['starpu_bcsr_get_nrow',['../group__API__Data__Interfaces.html#gab59c3b606776bdc54f6ccf3f1db4bf38',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fnzval',['STARPU_BCSR_GET_NZVAL',['../group__API__Data__Interfaces.html#gad4850366b77ead9f60c6f7e1d1064b22',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fnzval_5fdev_5fhandle',['STARPU_BCSR_GET_NZVAL_DEV_HANDLE',['../group__API__Data__Interfaces.html#ga2cab8f7f6a3f484e16241c41239664fa',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5foffset',['STARPU_BCSR_GET_OFFSET',['../group__API__Data__Interfaces.html#gad3c08c06e55e86993fa5cb77dce95095',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5fr',['starpu_bcsr_get_r',['../group__API__Data__Interfaces.html#gadcf7063b1cd8d0feed7054e6e4d9d217',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5frowptr',['STARPU_BCSR_GET_ROWPTR',['../group__API__Data__Interfaces.html#ga451ea6b212d0442b2bda2937c08968f5',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5fget_5frowptr_5fdev_5fhandle',['STARPU_BCSR_GET_ROWPTR_DEV_HANDLE',['../group__API__Data__Interfaces.html#ga28e9d620c4dc360cdbb0437e81d66543',1,'starpu_data_interfaces.h']]], ['starpu_5fbcsr_5finterface',['starpu_bcsr_interface',['../group__API__Data__Interfaces.html#structstarpu__bcsr__interface',1,'']]], ['starpu_5fbcsr_5finterface_5fid',['STARPU_BCSR_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357caf0717d5dd8045aa04c0d4ea65dc632be',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fdata_5fregister',['starpu_block_data_register',['../group__API__Data__Interfaces.html#gab67a02c78b113f6b3e031735418fd838',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5ffilter_5fblock',['starpu_block_filter_block',['../group__API__Data__Partition.html#ga1a265ffca51fae58701832a4daa53bd9',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fblock_5fshadow',['starpu_block_filter_block_shadow',['../group__API__Data__Partition.html#ga7cc8832e25f2f4049ba5a0053b122dd9',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fdepth_5fblock',['starpu_block_filter_depth_block',['../group__API__Data__Partition.html#gaae4f93ab3326ded72c3a80d337e6f4a1',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fdepth_5fblock_5fshadow',['starpu_block_filter_depth_block_shadow',['../group__API__Data__Partition.html#gac4b9ec529f67e5c300e7eed3e185fbaf',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fvertical_5fblock',['starpu_block_filter_vertical_block',['../group__API__Data__Partition.html#ga73a2c9af1200c68f0403e70e36c020d0',1,'starpu_data_filters.h']]], ['starpu_5fblock_5ffilter_5fvertical_5fblock_5fshadow',['starpu_block_filter_vertical_block_shadow',['../group__API__Data__Partition.html#gafa4818b571e98acd8696a1251b0d4e74',1,'starpu_data_filters.h']]], ['starpu_5fblock_5fget_5fdev_5fhandle',['STARPU_BLOCK_GET_DEV_HANDLE',['../group__API__Data__Interfaces.html#ga335bad7c45aa5df70227ce11f03edc0f',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5felemsize',['STARPU_BLOCK_GET_ELEMSIZE',['../group__API__Data__Interfaces.html#ga3bb8d6c4169e578b219849148eece329',1,'STARPU_BLOCK_GET_ELEMSIZE(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga47cea6fc5b88aaa359066e8192fafe95',1,'starpu_block_get_elemsize(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fldy',['STARPU_BLOCK_GET_LDY',['../group__API__Data__Interfaces.html#gac2fe5221c0ccc0d082e5bc65830e497b',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fldz',['STARPU_BLOCK_GET_LDZ',['../group__API__Data__Interfaces.html#gaf3bd64a64625f45859f596db3bb9b40a',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5flocal_5fldy',['starpu_block_get_local_ldy',['../group__API__Data__Interfaces.html#gaf1843d7f93510e6bf53da173eb9dd75e',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5flocal_5fldz',['starpu_block_get_local_ldz',['../group__API__Data__Interfaces.html#ga66508648e621019be00d86832d66f278',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5flocal_5fptr',['starpu_block_get_local_ptr',['../group__API__Data__Interfaces.html#ga66df9aff4ea14be546df745f17365568',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fnx',['STARPU_BLOCK_GET_NX',['../group__API__Data__Interfaces.html#gaf0fa0d2dc99ab880ccfe12061770dad2',1,'STARPU_BLOCK_GET_NX(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga8599a8f318fcadbafcc55f9c568678f1',1,'starpu_block_get_nx(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fny',['STARPU_BLOCK_GET_NY',['../group__API__Data__Interfaces.html#ga87725438ebaccd40d8b1b90e17b46247',1,'STARPU_BLOCK_GET_NY(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga81b34820b1a410d218ad08528c0317f6',1,'starpu_block_get_ny(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fnz',['starpu_block_get_nz',['../group__API__Data__Interfaces.html#gac7b7e5f3d4d9a1468df3b9b92743a9fd',1,'starpu_block_get_nz(starpu_data_handle_t handle): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#gab316b2febb2b5fb92e83bbaab780f046',1,'STARPU_BLOCK_GET_NZ(): starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5foffset',['STARPU_BLOCK_GET_OFFSET',['../group__API__Data__Interfaces.html#gafd9d133c4d658b777d9800eba79765b3',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fget_5fptr',['STARPU_BLOCK_GET_PTR',['../group__API__Data__Interfaces.html#gaaeff5c191edc5f3df8ba1a319acd0af9',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5finterface',['starpu_block_interface',['../group__API__Data__Interfaces.html#structstarpu__block__interface',1,'']]], ['starpu_5fblock_5finterface_5fid',['STARPU_BLOCK_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca61676e55a5c706ecb014c772a39e292d',1,'starpu_data_interfaces.h']]], ['starpu_5fblock_5fptr_5fregister',['starpu_block_ptr_register',['../group__API__Data__Interfaces.html#ga8aa19dcac39f053949c1bb1b4f5fad1d',1,'starpu_data_interfaces.h']]], ['starpu_5fbound_2eh',['starpu_bound.h',['../starpu__bound_8h.html',1,'']]], ['starpu_5fbound_5fcompute',['starpu_bound_compute',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga99f073d0ad7604366ef3a8f805b5f060',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint',['starpu_bound_print',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga834aa7094c173d42985d4d70f1694f57',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint_5fdot',['starpu_bound_print_dot',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga7fc9141929ef926d346431307afb0ff1',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint_5flp',['starpu_bound_print_lp',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga066ce2e396d5b676af7a5209b0079610',1,'starpu_bound.h']]], ['starpu_5fbound_5fprint_5fmps',['starpu_bound_print_mps',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#gad0cf05d0bb9b21964fb911cfebf252df',1,'starpu_bound.h']]], ['starpu_5fbound_5fstart',['starpu_bound_start',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga284f3571becb60b2354cc1ce121e4778',1,'starpu_bound.h']]], ['starpu_5fbound_5fstop',['starpu_bound_stop',['../group__API__Theoretical__Lower__Bound__on__Execution__Time.html#ga5f1859599a28105aea4c0f33fd871218',1,'starpu_bound.h']]], ['starpu_5fbus_5fget_5fcount',['starpu_bus_get_count',['../group__API__Profiling.html#ga8dc4665fdbbbf8ce8f1b905aa8411642',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fdst',['starpu_bus_get_dst',['../group__API__Profiling.html#ga8ded3aa2a94ec7a5cd46e2e70a918c65',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fid',['starpu_bus_get_id',['../group__API__Profiling.html#ga7c70803a54aa1e5b463ebb19110c4aa2',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fprofiling_5finfo',['starpu_bus_get_profiling_info',['../group__API__Profiling.html#ga76ad19fc8b99bcd42d505c76aafae6b6',1,'starpu_profiling.h']]], ['starpu_5fbus_5fget_5fsrc',['starpu_bus_get_src',['../group__API__Profiling.html#ga858f465a2dcbcadb6169a7926e38a4d1',1,'starpu_profiling.h']]], ['starpu_5fbus_5fprint_5faffinity',['starpu_bus_print_affinity',['../group__API__Performance__Model.html#ga712a3e3498f113efb81c42c6b7a48335',1,'starpu_perfmodel.h']]], ['starpu_5fbus_5fprint_5fbandwidth',['starpu_bus_print_bandwidth',['../group__API__Performance__Model.html#gac4075eddef3625eccbbc9f1670c69244',1,'starpu_perfmodel.h']]], ['starpu_5fcallback',['STARPU_CALLBACK',['../group__API__Insert__Task.html#gae053c49170a0f318357ba3aa8e08ea89',1,'starpu_task_util.h']]], ['starpu_5fcallback_5farg',['STARPU_CALLBACK_ARG',['../group__API__Insert__Task.html#gaa2c1a7638d3cf2ddfe6cc51aa2fc4a46',1,'starpu_task_util.h']]], ['starpu_5fcallback_5fwith_5farg',['STARPU_CALLBACK_WITH_ARG',['../group__API__Insert__Task.html#ga12a05bcd675b1b88ec73ea9d8c8ccd74',1,'starpu_task_util.h']]], ['starpu_5fcheck_5freturn_5fvalue',['STARPU_CHECK_RETURN_VALUE',['../group__API__Toolbox.html#gaa3503ea5efd00806a0f9234f033e6ea1',1,'starpu_util.h']]], ['starpu_5fcheck_5freturn_5fvalue_5fis',['STARPU_CHECK_RETURN_VALUE_IS',['../group__API__Toolbox.html#ga1b41d799a04a1d6483e982ffb2f74432',1,'starpu_util.h']]], ['starpu_5fcodelet',['starpu_codelet',['../group__API__Codelet__And__Tasks.html#structstarpu__codelet',1,'']]], ['starpu_5fcodelet_5fdisplay_5fstats',['starpu_codelet_display_stats',['../group__API__Codelet__And__Tasks.html#ga0e7db78b32d57db548555c1425808dd0',1,'starpu_task.h']]], ['starpu_5fcodelet_5fget_5fmode',['STARPU_CODELET_GET_MODE',['../group__API__Codelet__And__Tasks.html#ga5dea5d6f5018e13a6b2c5d7a09f08054',1,'starpu_task.h']]], ['starpu_5fcodelet_5finit',['starpu_codelet_init',['../group__API__Codelet__And__Tasks.html#ga46b34c28e0b9b2e1726b9d033639dda7',1,'starpu_task.h']]], ['starpu_5fcodelet_5fpack_5fargs',['starpu_codelet_pack_args',['../group__API__Insert__Task.html#ga083f02c3ed2a1ab58058ba17e36e773b',1,'starpu_task_util.h']]], ['starpu_5fcodelet_5fset_5fmode',['STARPU_CODELET_SET_MODE',['../group__API__Codelet__And__Tasks.html#gae7be080fd53d7a402620cabd4070b6ca',1,'starpu_task.h']]], ['starpu_5fcodelet_5ftype',['starpu_codelet_type',['../group__API__Codelet__And__Tasks.html#gac127ad106bf376da993d3f4caa979b2f',1,'starpu_task.h']]], ['starpu_5fcodelet_5funpack_5fargs',['starpu_codelet_unpack_args',['../group__API__Insert__Task.html#gaa2e8c2206e1ea56aec65b09efb82f13a',1,'starpu_task_util.h']]], ['starpu_5fcombined_5fworker_5fassign_5fworkerid',['starpu_combined_worker_assign_workerid',['../group__API__Parallel__Tasks.html#ga176c8b45655615fbd09f0b70ba8b78b5',1,'starpu_scheduler.h']]], ['starpu_5fcombined_5fworker_5fcan_5fexecute_5ftask',['starpu_combined_worker_can_execute_task',['../group__API__Parallel__Tasks.html#gae3fe82c940e36715145baa9fe003e453',1,'starpu_scheduler.h']]], ['starpu_5fcombined_5fworker_5fget_5fcount',['starpu_combined_worker_get_count',['../group__API__Parallel__Tasks.html#ga49a6732f413550652450baa64594bc5e',1,'starpu_worker.h']]], ['starpu_5fcombined_5fworker_5fget_5fdescription',['starpu_combined_worker_get_description',['../group__API__Parallel__Tasks.html#ga720a70f5297ffe3b5ea5cf6eff549c8c',1,'starpu_scheduler.h']]], ['starpu_5fcombined_5fworker_5fget_5fid',['starpu_combined_worker_get_id',['../group__API__Parallel__Tasks.html#gae53499613fb72e9aa1abad6437a926f9',1,'starpu_worker.h']]], ['starpu_5fcombined_5fworker_5fget_5frank',['starpu_combined_worker_get_rank',['../group__API__Parallel__Tasks.html#ga4eb5aaf2f4e0c9a7f07cbc80f3ae9664',1,'starpu_worker.h']]], ['starpu_5fcombined_5fworker_5fget_5fsize',['starpu_combined_worker_get_size',['../group__API__Parallel__Tasks.html#ga573d2513a10cf1d14fee0467eda0884d',1,'starpu_worker.h']]], ['starpu_5fcommon',['STARPU_COMMON',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6aeedb2a69541e9b7380f766711f8eab26',1,'starpu_perfmodel.h']]], ['starpu_5fconf',['starpu_conf',['../group__API__Initialization__and__Termination.html#structstarpu__conf',1,'']]], ['starpu_5fconf_5finit',['starpu_conf_init',['../group__API__Initialization__and__Termination.html#ga7f7f154a1bf9600b8ccd10436412660e',1,'starpu.h']]], ['starpu_5fconfig_2eh',['starpu_config.h',['../starpu__config_8h.html',1,'']]], ['starpu_5fcoo_5fdata_5fregister',['starpu_coo_data_register',['../group__API__Data__Interfaces.html#gace26ae5c977d1fd0fbea538b582bab43',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fcolumns',['STARPU_COO_GET_COLUMNS',['../group__API__Data__Interfaces.html#ga56d6ae5fe9283bfb77e13f07c2513184',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fcolumns_5fdev_5fhandle',['STARPU_COO_GET_COLUMNS_DEV_HANDLE',['../group__API__Data__Interfaces.html#gade238eb388cbb34bf9a93643bfa4df83',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5felemsize',['STARPU_COO_GET_ELEMSIZE',['../group__API__Data__Interfaces.html#gae95b657d947e611060590d506d8e15dc',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fnvalues',['STARPU_COO_GET_NVALUES',['../group__API__Data__Interfaces.html#ga550d6222ff484201dbd3d39bb7baeb7d',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fnx',['STARPU_COO_GET_NX',['../group__API__Data__Interfaces.html#gac77fef789ec34682ba00b38dcc501170',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fny',['STARPU_COO_GET_NY',['../group__API__Data__Interfaces.html#gaa15cff8f1148e572348095ac5a2ab421',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5foffset',['STARPU_COO_GET_OFFSET',['../group__API__Data__Interfaces.html#ga1e92dc5d143be583708d87498d2dc9cb',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5frows',['STARPU_COO_GET_ROWS',['../group__API__Data__Interfaces.html#gac739182a43ec4dd00618d783b1f2a16c',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5frows_5fdev_5fhandle',['STARPU_COO_GET_ROWS_DEV_HANDLE',['../group__API__Data__Interfaces.html#gab1c57c537a980a2de5e595b2f6204772',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fvalues',['STARPU_COO_GET_VALUES',['../group__API__Data__Interfaces.html#ga001c8954d20044b466c661cf7c9f9fe0',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5fget_5fvalues_5fdev_5fhandle',['STARPU_COO_GET_VALUES_DEV_HANDLE',['../group__API__Data__Interfaces.html#gadf8eac3f96b6e63911f23165141411df',1,'starpu_data_interfaces.h']]], ['starpu_5fcoo_5finterface',['starpu_coo_interface',['../group__API__Data__Interfaces.html#structstarpu__coo__interface',1,'']]], ['starpu_5fcoo_5finterface_5fid',['STARPU_COO_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cad84c1b3c230ee8b5136302fa63dfc9d2',1,'starpu_data_interfaces.h']]], ['starpu_5fcpu',['STARPU_CPU',['../group__API__Codelet__And__Tasks.html#gaf577e4415a639beffbc48b65454b88ca',1,'starpu_task.h']]], ['starpu_5fcpu_5fdefault',['STARPU_CPU_DEFAULT',['../group__API__Performance__Model.html#ggaa178fceed017bdbe1bee860d7882565fafbcccb201408154dc29868a354255a8f',1,'starpu_perfmodel.h']]], ['starpu_5fcpu_5ffunc_5ft',['starpu_cpu_func_t',['../group__API__Codelet__And__Tasks.html#ga8a4fb4a4c3d4b96159949bda6b235c1f',1,'starpu_task.h']]], ['starpu_5fcpu_5fram',['STARPU_CPU_RAM',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a9578288c35b06ee94ab4ef6a41d16674',1,'starpu_data.h']]], ['starpu_5fcpu_5fworker',['STARPU_CPU_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37da5b5aeeaa21f925e63f5fed338baf0588',1,'starpu_worker.h']]], ['starpu_5fcpu_5fworker_5fget_5fcount',['starpu_cpu_worker_get_count',['../group__API__Workers__Properties.html#ga8c4e370ff327c38a3ec79c9249ab233a',1,'starpu_worker.h']]], ['starpu_5fcreate_5fsync_5ftask',['starpu_create_sync_task',['../group__API__Codelet__And__Tasks.html#ga8b83ae8b1c2015f961e60627d4913549',1,'starpu_task_util.h']]], ['starpu_5fcsr_5fdata_5fregister',['starpu_csr_data_register',['../group__API__Data__Interfaces.html#ga81426fc1860aabaefed1a33946df6f51',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5ffilter_5fvertical_5fblock',['starpu_csr_filter_vertical_block',['../group__API__Data__Partition.html#ga554a2fb14fdee9353364c39f36ee3a6f',1,'starpu_data_filters.h']]], ['starpu_5fcsr_5fget_5fcolind',['STARPU_CSR_GET_COLIND',['../group__API__Data__Interfaces.html#ga567d2e3780dabc30269af5e54fe20660',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fcolind_5fdev_5fhandle',['STARPU_CSR_GET_COLIND_DEV_HANDLE',['../group__API__Data__Interfaces.html#gaeed0ab452c0906a650097368bd1c6ba3',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5felemsize',['STARPU_CSR_GET_ELEMSIZE',['../group__API__Data__Interfaces.html#ga82eea89e2f23a9fdc1f34c03db68a97b',1,'STARPU_CSR_GET_ELEMSIZE(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#gab328b8e0b234147ebe36ceb8e7a55b0a',1,'starpu_csr_get_elemsize(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5ffirstentry',['STARPU_CSR_GET_FIRSTENTRY',['../group__API__Data__Interfaces.html#ga83ba12ab43444d61f4966dc76aa160d6',1,'STARPU_CSR_GET_FIRSTENTRY(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga40f2d8762bc1060e939eecae75f9be08',1,'starpu_csr_get_firstentry(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5flocal_5fcolind',['starpu_csr_get_local_colind',['../group__API__Data__Interfaces.html#gad5ffed03f141096fca4e1e2583c84e22',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5flocal_5fnzval',['starpu_csr_get_local_nzval',['../group__API__Data__Interfaces.html#ga4f137b139435d4cddcd15704fe46cbbd',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5flocal_5frowptr',['starpu_csr_get_local_rowptr',['../group__API__Data__Interfaces.html#ga78a31ef2148b8439a2c0e897d9179b84',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fnnz',['STARPU_CSR_GET_NNZ',['../group__API__Data__Interfaces.html#gab9110ecfa66b148e770a375566c1c19d',1,'STARPU_CSR_GET_NNZ(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga66106513707ed71b8849b1c1bbb3df75',1,'starpu_csr_get_nnz(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fnrow',['STARPU_CSR_GET_NROW',['../group__API__Data__Interfaces.html#ga86b64dc68625997cf3c0bb9eae3ee68a',1,'STARPU_CSR_GET_NROW(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga72c9db50152ed5bf9f18ad3a355c5376',1,'starpu_csr_get_nrow(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fnzval',['STARPU_CSR_GET_NZVAL',['../group__API__Data__Interfaces.html#gab7b07d0d2a253e02e1b2d2260cc3fa94',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5fnzval_5fdev_5fhandle',['STARPU_CSR_GET_NZVAL_DEV_HANDLE',['../group__API__Data__Interfaces.html#ga9dc1bbf7a41070a6fcf82e728cae1542',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5foffset',['STARPU_CSR_GET_OFFSET',['../group__API__Data__Interfaces.html#gaa46eb27abc7439c03776d68062f029d4',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5frowptr',['STARPU_CSR_GET_ROWPTR',['../group__API__Data__Interfaces.html#ga69dd5090534b513a374089627254f73c',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5fget_5frowptr_5fdev_5fhandle',['STARPU_CSR_GET_ROWPTR_DEV_HANDLE',['../group__API__Data__Interfaces.html#ga21ae3f41a59615f892f196b8cab16ee4',1,'starpu_data_interfaces.h']]], ['starpu_5fcsr_5finterface',['starpu_csr_interface',['../group__API__Data__Interfaces.html#structstarpu__csr__interface',1,'']]], ['starpu_5fcsr_5finterface_5fid',['STARPU_CSR_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca9566de0c4f51f4e48f6ca681d2701eed',1,'starpu_data_interfaces.h']]], ['starpu_5fcublas_2eh',['starpu_cublas.h',['../starpu__cublas_8h.html',1,'']]], ['starpu_5fcublas_5finit',['starpu_cublas_init',['../group__API__CUDA__Extensions.html#ga9f70358bd39f2228d7b0558702306d96',1,'starpu_cublas.h']]], ['starpu_5fcublas_5freport_5ferror',['STARPU_CUBLAS_REPORT_ERROR',['../group__API__CUDA__Extensions.html#ga305c371567096cedd87290bf68123ced',1,'starpu_cuda.h']]], ['starpu_5fcublas_5fshutdown',['starpu_cublas_shutdown',['../group__API__CUDA__Extensions.html#ga3cd8378588620422bc6c3246016ffcd8',1,'starpu_cublas.h']]], ['starpu_5fcuda',['STARPU_CUDA',['../group__API__Codelet__And__Tasks.html#ga43c37484ac60c15cd6f45ab25c277213',1,'starpu_task.h']]], ['starpu_5fcuda_2eh',['starpu_cuda.h',['../starpu__cuda_8h.html',1,'']]], ['starpu_5fcuda_5fcopy_5fasync_5fsync',['starpu_cuda_copy_async_sync',['../group__API__CUDA__Extensions.html#ga20c5b69812878a57e22f4f3c5cc8f56f',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fdefault',['STARPU_CUDA_DEFAULT',['../group__API__Performance__Model.html#ggaa178fceed017bdbe1bee860d7882565fa14830630d3a691e5a6932e5555fa5805',1,'starpu_perfmodel.h']]], ['starpu_5fcuda_5ffunc_5ft',['starpu_cuda_func_t',['../group__API__Codelet__And__Tasks.html#ga54f6cb6c50dab31bd1d0aaa7f7f3c10b',1,'starpu_task.h']]], ['starpu_5fcuda_5fget_5fdevice_5fproperties',['starpu_cuda_get_device_properties',['../group__API__CUDA__Extensions.html#ga71b71760c8b71cb6c3f0dc7495c84036',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fget_5flocal_5fstream',['starpu_cuda_get_local_stream',['../group__API__CUDA__Extensions.html#gad7d80d054bd2b9570e1d7e24442e19c0',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fram',['STARPU_CUDA_RAM',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a619d788452761975aa62ea517c86104c',1,'starpu_data.h']]], ['starpu_5fcuda_5freport_5ferror',['starpu_cuda_report_error',['../group__API__CUDA__Extensions.html#ga08ef1dd9623d7adb87cede9e60d3e1dc',1,'starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status): starpu_cuda.h'],['../group__API__CUDA__Extensions.html#gae30cd6ebde1dc4001ae8a17cabd5dbc4',1,'STARPU_CUDA_REPORT_ERROR(): starpu_cuda.h']]], ['starpu_5fcuda_5fset_5fdevice',['starpu_cuda_set_device',['../group__API__CUDA__Extensions.html#ga3b170653608d3381b660afba63be39da',1,'starpu_cuda.h']]], ['starpu_5fcuda_5fworker',['STARPU_CUDA_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37dac95bbacadbe0599c06a48059d2821611',1,'starpu_worker.h']]], ['starpu_5fcuda_5fworker_5fget_5fcount',['starpu_cuda_worker_get_count',['../group__API__Workers__Properties.html#gacb9d262c066c047ae55f691adc876db3',1,'starpu_worker.h']]], ['starpu_5fdata_2eh',['starpu_data.h',['../starpu__data_8h.html',1,'']]], ['starpu_5fdata_5faccess_5fmode',['starpu_data_access_mode',['../group__API__Data__Management.html#ga1fb3a1ff8622747d653d1b5f41bc41db',1,'starpu_data.h']]], ['starpu_5fdata_5facquire',['starpu_data_acquire',['../group__API__Data__Management.html#gae6eb535cf9bf46a7ef9ad2d845c675a2',1,'starpu_data.h']]], ['starpu_5fdata_5facquire_5fcb',['starpu_data_acquire_cb',['../group__API__Data__Management.html#ga358aba7459b7f99a6dbaa189ce57b925',1,'starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void(*callback)(void *), void *arg): starpu_data.h'],['../group__API__Data__Management.html#ga2b9b64ac9a650d8c8942b4227e6fce75',1,'STARPU_DATA_ACQUIRE_CB(): starpu_data.h']]], ['starpu_5fdata_5fadvise_5fas_5fimportant',['starpu_data_advise_as_important',['../group__API__Data__Management.html#gaedc8031c1b437d35232cd1700d83d472',1,'starpu_data.h']]], ['starpu_5fdata_5farray',['STARPU_DATA_ARRAY',['../group__API__Insert__Task.html#ga9eb57b0eb0ee7ce31661eed55d3a5f4d',1,'starpu_task_util.h']]], ['starpu_5fdata_5fcopy_5fmethods',['starpu_data_copy_methods',['../group__API__Data__Interfaces.html#structstarpu__data__copy__methods',1,'']]], ['starpu_5fdata_5fcpy',['starpu_data_cpy',['../group__API__Miscellaneous__Helpers.html#gaaff4ecf5818fd6f8d005f6bf57b0eb4b',1,'starpu_util.h']]], ['starpu_5fdata_5fdescr',['starpu_data_descr',['../group__API__Codelet__And__Tasks.html#structstarpu__data__descr',1,'']]], ['starpu_5fdata_5fdisplay_5fmemory_5fstats',['starpu_data_display_memory_stats',['../group__API__Profiling.html#ga6b93e19cf6ddd63d7eaee6749a7bdcf1',1,'starpu_data.h']]], ['starpu_5fdata_5fexpected_5ftransfer_5ftime',['starpu_data_expected_transfer_time',['../group__API__Scheduling__Policy.html#ga1e159d56ffa2d7705bdfd1ceb93e0d64',1,'starpu_scheduler.h']]], ['starpu_5fdata_5ffilter',['starpu_data_filter',['../group__API__Data__Partition.html#structstarpu__data__filter',1,'']]], ['starpu_5fdata_5ffilters_2eh',['starpu_data_filters.h',['../starpu__data__filters_8h.html',1,'']]], ['starpu_5fdata_5ffree_5fpinned_5fif_5fpossible',['starpu_data_free_pinned_if_possible',['../group__API__Standard__Memory__Library.html#ga4e9089680daf0b2d7f26e4657ffe9f48',1,'starpu_data.h']]], ['starpu_5fdata_5fget_5fchild',['starpu_data_get_child',['../group__API__Data__Partition.html#ga29e07c2c0604da63e7746a8018d8a62f',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fget_5fdefault_5fsequential_5fconsistency_5fflag',['starpu_data_get_default_sequential_consistency_flag',['../group__API__Implicit__Data__Dependencies.html#gaef7203edaf1725977dffac23296ede4e',1,'starpu_data.h']]], ['starpu_5fdata_5fget_5finterface_5fid',['starpu_data_get_interface_id',['../group__API__Data__Interfaces.html#gad6ca41b04e0265671d4bf899dd433c1e',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5finterface_5fon_5fnode',['starpu_data_get_interface_on_node',['../group__API__Data__Interfaces.html#gab6e12b04b231773f2eff496f57d29ee8',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5flocal_5fptr',['starpu_data_get_local_ptr',['../group__API__Data__Interfaces.html#gabcce7df711e56cafddfd82f8f5ee794b',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5fnb_5fchildren',['starpu_data_get_nb_children',['../group__API__Data__Partition.html#ga6a3f729055f14384e7397d2815a2c9a5',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fget_5fsize',['starpu_data_get_size',['../group__API__Data__Interfaces.html#gac14cfc52c450c81dd4789a7aace79d3b',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fget_5fsub_5fdata',['starpu_data_get_sub_data',['../group__API__Data__Partition.html#gac24101bbe28b1d7d4a0874d349ba8979',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fhandle_5ft',['starpu_data_handle_t',['../group__API__Data__Management.html#ga5f517ab725864d54b0459896a8f8ae07',1,'starpu_data.h']]], ['starpu_5fdata_5fhandle_5fto_5fpointer',['starpu_data_handle_to_pointer',['../group__API__Data__Interfaces.html#ga011705e0a88798562f7afb2753a6b1ce',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5finterface_5fget_5fnext_5fid',['starpu_data_interface_get_next_id',['../group__API__Data__Interfaces.html#gaf5ea640f2c977e3ae95a6be9b3be3bee',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5finterface_5fid',['starpu_data_interface_id',['../group__API__Data__Interfaces.html#gaa2f2140147f15e7b9eec1443690e357c',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5finterface_5fops',['starpu_data_interface_ops',['../group__API__Data__Interfaces.html#structstarpu__data__interface__ops',1,'']]], ['starpu_5fdata_5finterfaces_2eh',['starpu_data_interfaces.h',['../starpu__data__interfaces_8h.html',1,'']]], ['starpu_5fdata_5finvalidate',['starpu_data_invalidate',['../group__API__Data__Management.html#ga4e82fe020ec010bcacb6aee16021607c',1,'starpu_data.h']]], ['starpu_5fdata_5finvalidate_5fsubmit',['starpu_data_invalidate_submit',['../group__API__Data__Management.html#ga06b01fdf769f8f2eb222ecde42afbc81',1,'starpu_data.h']]], ['starpu_5fdata_5flookup',['starpu_data_lookup',['../group__API__Data__Management.html#ga75907283eef0a058a040ff06de87b4b2',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fmalloc_5fpinned_5fif_5fpossible',['starpu_data_malloc_pinned_if_possible',['../group__API__Standard__Memory__Library.html#gad1e07e6fc879ed3d05d2a6c5c2a04b56',1,'starpu_data.h']]], ['starpu_5fdata_5fmap_5ffilters',['starpu_data_map_filters',['../group__API__Data__Partition.html#ga551d6fa7fead5b9f7c8a85b1f9885e91',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fpack',['starpu_data_pack',['../group__API__Data__Interfaces.html#gad7e204d690945cbe5145bc8950078291',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fpartition',['starpu_data_partition',['../group__API__Data__Partition.html#ga1363109ba0e36c1b6c7f1a40c9608791',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fprefetch_5fon_5fnode',['starpu_data_prefetch_on_node',['../group__API__Data__Management.html#ga57687b811ced00dbfc35af73164a72aa',1,'starpu_data.h']]], ['starpu_5fdata_5fptr_5fregister',['starpu_data_ptr_register',['../group__API__Data__Management.html#ga1d0a0dc4903585e099b2e4b16a22946a',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fquery_5fstatus',['starpu_data_query_status',['../group__API__Data__Management.html#ga9a6122bae224d714383ae775434cdce3',1,'starpu_data.h']]], ['starpu_5fdata_5fregister',['starpu_data_register',['../group__API__Data__Management.html#ga74d62dfa2a733db4bac71caaae751d9d',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5fregister_5fsame',['starpu_data_register_same',['../group__API__Data__Management.html#ga1be29ee257e3d9c3321df759b8105cb1',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5frelease',['starpu_data_release',['../group__API__Data__Management.html#gadc145017bafa2948109c624715de77a2',1,'starpu_data.h']]], ['starpu_5fdata_5frequest_5fallocation',['starpu_data_request_allocation',['../group__API__Data__Management.html#gac561fd637be17b74f0456106dc25f5d1',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5fdefault_5fsequential_5fconsistency_5fflag',['starpu_data_set_default_sequential_consistency_flag',['../group__API__Implicit__Data__Dependencies.html#ga26f17239b14354e61eef0710ffadc434',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5freduction_5fmethods',['starpu_data_set_reduction_methods',['../group__API__Data__Management.html#ga1f5ba1c1cfefc1f81a4095cf3c213e54',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5fsequential_5fconsistency_5fflag',['starpu_data_set_sequential_consistency_flag',['../group__API__Implicit__Data__Dependencies.html#ga273df19e4cad1c05ec5df697bcec4444',1,'starpu_data.h']]], ['starpu_5fdata_5fset_5fwt_5fmask',['starpu_data_set_wt_mask',['../group__API__Data__Management.html#gae53e7b21c7426c9845a1046cfe5becce',1,'starpu_data.h']]], ['starpu_5fdata_5funpack',['starpu_data_unpack',['../group__API__Data__Interfaces.html#ga97c7b78c97576eb44741bdd7e2183fa7',1,'starpu_data_interfaces.h']]], ['starpu_5fdata_5funpartition',['starpu_data_unpartition',['../group__API__Data__Partition.html#gae80794b9cad7855a3ee54a4361f656ed',1,'starpu_data_filters.h']]], ['starpu_5fdata_5funregister',['starpu_data_unregister',['../group__API__Data__Management.html#ga586146498466b60d6b81145dfaeb8948',1,'starpu_data.h']]], ['starpu_5fdata_5funregister_5fno_5fcoherency',['starpu_data_unregister_no_coherency',['../group__API__Data__Management.html#gaa1f95d17759711f7703bf02820e2e49b',1,'starpu_data.h']]], ['starpu_5fdata_5funregister_5fsubmit',['starpu_data_unregister_submit',['../group__API__Data__Management.html#ga4fa34753bff1d29c20f0a0e361020b4e',1,'starpu_data.h']]], ['starpu_5fdata_5fvget_5fsub_5fdata',['starpu_data_vget_sub_data',['../group__API__Data__Partition.html#ga7904efb86ab3f9d6d682a3a3be3646fe',1,'starpu_data_filters.h']]], ['starpu_5fdata_5fvmap_5ffilters',['starpu_data_vmap_filters',['../group__API__Data__Partition.html#ga15a28291a5045ef7ed3c93afc94ed248',1,'starpu_data_filters.h']]], ['starpu_5fdefault_5fprio',['STARPU_DEFAULT_PRIO',['../group__API__Scheduling__Contexts.html#gabd6c53517107a2b467bdbc8af21cee2c',1,'starpu_sched_ctx.h']]], ['starpu_5fdeprecated_5fapi_2eh',['starpu_deprecated_api.h',['../starpu__deprecated__api_8h.html',1,'']]], ['starpu_5fdriver',['starpu_driver',['../group__API__Initialization__and__Termination.html#structstarpu__driver',1,'']]], ['starpu_5fdriver_2eh',['starpu_driver.h',['../starpu__driver_8h.html',1,'']]], ['starpu_5fdriver_2eid',['starpu_driver.id',['../group__API__Initialization__and__Termination.html#unionstarpu__driver_8id',1,'']]], ['starpu_5fdriver_5fdeinit',['starpu_driver_deinit',['../group__API__Running__Drivers.html#gac8f8848b64980676190d77d265fda841',1,'starpu_driver.h']]], ['starpu_5fdriver_5finit',['starpu_driver_init',['../group__API__Running__Drivers.html#gab274599ec82fe38cb41267b8a1384995',1,'starpu_driver.h']]], ['starpu_5fdriver_5frun',['starpu_driver_run',['../group__API__Running__Drivers.html#ga68b320765b17e5e4a256f156c9932e69',1,'starpu_driver.h']]], ['starpu_5fdriver_5frun_5fonce',['starpu_driver_run_once',['../group__API__Running__Drivers.html#gad6d01b57f2f84df90f554ea205dcf90d',1,'starpu_driver.h']]], ['starpu_5fdrivers_5frequest_5ftermination',['starpu_drivers_request_termination',['../group__API__Running__Drivers.html#ga497d48a24107dfebf6ef3ad40d4a6df8',1,'starpu_driver.h']]], ['starpu_5fexecute_5fon_5fdata',['STARPU_EXECUTE_ON_DATA',['../group__API__MPI__Support.html#gadc9112873f348b1f6daa0da4b93b061f',1,'starpu_task_util.h']]], ['starpu_5fexecute_5fon_5feach_5fworker',['starpu_execute_on_each_worker',['../group__API__Miscellaneous__Helpers.html#ga7a97b0699b97b30b4d408c660be46102',1,'starpu_util.h']]], ['starpu_5fexecute_5fon_5fnode',['STARPU_EXECUTE_ON_NODE',['../group__API__MPI__Support.html#ga750b87a6ea137c903f02c53029d1131d',1,'starpu_task_util.h']]], ['starpu_5fexecute_5fon_5fworker',['STARPU_EXECUTE_ON_WORKER',['../group__API__Insert__Task.html#ga71d2b5f941b3c05d67a7d002e834a753',1,'starpu_task_util.h']]], ['starpu_5fexpert_2eh',['starpu_expert.h',['../starpu__expert_8h.html',1,'']]], ['starpu_5fflops',['STARPU_FLOPS',['../group__API__Insert__Task.html#ga1a0a565f2de522abc9c5f3457397b095',1,'starpu_task_util.h']]], ['starpu_5fforkjoin',['STARPU_FORKJOIN',['../group__API__Codelet__And__Tasks.html#ggac127ad106bf376da993d3f4caa979b2faaaad35e6da5417989b55d70fa7e65447',1,'starpu_task.h']]], ['starpu_5ffree',['starpu_free',['../group__API__Standard__Memory__Library.html#ga889e8ea2a1becb4eff634e264973b261',1,'starpu_stdlib.h']]], ['starpu_5ffree_5fflags',['starpu_free_flags',['../group__API__Standard__Memory__Library.html#gad60ddd8514e8ed664ecf1f21ad84e6f5',1,'starpu_stdlib.h']]], ['starpu_5ffree_5fon_5fnode',['starpu_free_on_node',['../group__API__Data__Interfaces.html#ga7e3ef9efbc7a65adad27f9ac27493493',1,'starpu_data_interfaces.h']]], ['starpu_5ffxt_2eh',['starpu_fxt.h',['../starpu__fxt_8h.html',1,'']]], ['starpu_5ffxt_5fcodelet_5fevent',['starpu_fxt_codelet_event',['../group__API__FxT__Support.html#structstarpu__fxt__codelet__event',1,'']]], ['starpu_5ffxt_5fgenerate_5ftrace',['starpu_fxt_generate_trace',['../group__API__FxT__Support.html#ga9249a38d77ab128f665b4359ac0c4781',1,'starpu_fxt.h']]], ['starpu_5ffxt_5foptions',['starpu_fxt_options',['../group__API__FxT__Support.html#structstarpu__fxt__options',1,'']]], ['starpu_5ffxt_5foptions_5finit',['starpu_fxt_options_init',['../group__API__FxT__Support.html#gaf4a2675d7c5f2dc473879ef0a0a2a114',1,'starpu_fxt.h']]], ['starpu_5ffxt_5fstart_5fprofiling',['starpu_fxt_start_profiling',['../group__API__FxT__Support.html#ga5793bf5c8fc0bedf76d18a5fa38593df',1,'starpu_fxt.h']]], ['starpu_5ffxt_5fstop_5fprofiling',['starpu_fxt_stop_profiling',['../group__API__FxT__Support.html#ga52a3e1a95689315f0b789a3325ec2a90',1,'starpu_fxt.h']]], ['starpu_5fget_5fenv_5fnumber',['starpu_get_env_number',['../group__API__Toolbox.html#gac9eef7c5611291831a56af2134d9945c',1,'starpu_util.h']]], ['starpu_5fget_5fprefetch_5fflag',['starpu_get_prefetch_flag',['../group__API__Scheduling__Policy.html#ga94edfd4a02666d8c1b8c506423586426',1,'starpu_scheduler.h']]], ['starpu_5fget_5fversion',['starpu_get_version',['../group__API__Versioning.html#gaa9151820d2ef6a8231b510b4b3c19ca4',1,'starpu.h']]], ['starpu_5fgnuc_5fprereq',['STARPU_GNUC_PREREQ',['../group__API__Toolbox.html#ga4fc771a29d7dc0e826da42777edbcf15',1,'starpu_util.h']]], ['starpu_5fhash_2eh',['starpu_hash.h',['../starpu__hash_8h.html',1,'']]], ['starpu_5fhash_5fcrc32c_5fbe',['starpu_hash_crc32c_be',['../group__API__Data__Interfaces.html#gaa29d5f4bd11fce82cd9a01b0e860bf75',1,'starpu_hash.h']]], ['starpu_5fhash_5fcrc32c_5fbe_5fn',['starpu_hash_crc32c_be_n',['../group__API__Data__Interfaces.html#ga86956bce305447697cb9346bee692b24',1,'starpu_hash.h']]], ['starpu_5fhash_5fcrc32c_5fstring',['starpu_hash_crc32c_string',['../group__API__Data__Interfaces.html#gaec6ca64cc2c52e319b9b73cc4f753658',1,'starpu_hash.h']]], ['starpu_5fhistory_5fbased',['STARPU_HISTORY_BASED',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6a61a1a08e950abce6779d8eaee6cfe395',1,'starpu_perfmodel.h']]], ['starpu_5finit',['starpu_init',['../group__API__Initialization__and__Termination.html#ga9ce171bcbbee2edd169ba2649e6e75e3',1,'starpu.h']]], ['starpu_5finsert_5ftask',['starpu_insert_task',['../group__API__Insert__Task.html#ga2e9916071a4b6d60ae0b3c45854e4c9c',1,'starpu_task_util.h']]], ['starpu_5finterface_5fcopy',['starpu_interface_copy',['../group__API__Data__Interfaces.html#ga7af8e4f90b557fefaa09f40a930efd74',1,'starpu_data_interfaces.h']]], ['starpu_5flikely',['STARPU_LIKELY',['../group__API__Toolbox.html#ga4456c2db2cc8df7c98d62ecc21b2bd1d',1,'starpu_util.h']]], ['starpu_5fmajor_5fversion',['STARPU_MAJOR_VERSION',['../group__API__Versioning.html#ga61698352a3ca7e28b4bcdd8bcad8d8cc',1,'starpu_config.h']]], ['starpu_5fmalloc',['starpu_malloc',['../group__API__Standard__Memory__Library.html#ga49603eaea3b05e8ced9ba1bd873070c3',1,'starpu_stdlib.h']]], ['starpu_5fmalloc_5fcount',['STARPU_MALLOC_COUNT',['../group__API__Standard__Memory__Library.html#gaace5eebbb6662fb1be7c79a65464e1cc',1,'starpu_stdlib.h']]], ['starpu_5fmalloc_5fflags',['starpu_malloc_flags',['../group__API__Standard__Memory__Library.html#gaebaa5a1503be11ba7da92f72a8e601b2',1,'starpu_stdlib.h']]], ['starpu_5fmalloc_5fon_5fnode',['starpu_malloc_on_node',['../group__API__Data__Interfaces.html#gab91cbc596a65e6a4322b657c79934269',1,'starpu_data_interfaces.h']]], ['starpu_5fmalloc_5fpinned',['STARPU_MALLOC_PINNED',['../group__API__Standard__Memory__Library.html#ga2abe959e39acfb75c7c0652706dfe84c',1,'starpu_stdlib.h']]], ['starpu_5fmalloc_5fset_5falign',['starpu_malloc_set_align',['../group__API__Standard__Memory__Library.html#ga52ec305b6afdd76130a4f6877e23849c',1,'starpu_stdlib.h']]], ['starpu_5fmatrix_5fdata_5fregister',['starpu_matrix_data_register',['../group__API__Data__Interfaces.html#ga7af287b9089acc7cf4b3b7ed19d82abb',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5ffilter_5fblock',['starpu_matrix_filter_block',['../group__API__Data__Partition.html#ga8c86b2af9e0806e631c1cbb5d506506b',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5ffilter_5fblock_5fshadow',['starpu_matrix_filter_block_shadow',['../group__API__Data__Partition.html#ga88fbca61843b76314e39a2c0f8b93d6c',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5ffilter_5fvertical_5fblock',['starpu_matrix_filter_vertical_block',['../group__API__Data__Partition.html#ga2925be576ac7d597ecead381ff32a894',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5ffilter_5fvertical_5fblock_5fshadow',['starpu_matrix_filter_vertical_block_shadow',['../group__API__Data__Partition.html#ga7132923bd901e0e4254cc0b20d49997a',1,'starpu_data_filters.h']]], ['starpu_5fmatrix_5fget_5fdev_5fhandle',['STARPU_MATRIX_GET_DEV_HANDLE',['../group__API__Data__Interfaces.html#gac046f5fb0472cada47cd44650194b1c8',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5felemsize',['STARPU_MATRIX_GET_ELEMSIZE',['../group__API__Data__Interfaces.html#gaef6039a7976d3ee6c6916df28a08da1a',1,'STARPU_MATRIX_GET_ELEMSIZE(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#gaebeefdd9980c18575924ed9860315bcf',1,'starpu_matrix_get_elemsize(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5fld',['STARPU_MATRIX_GET_LD',['../group__API__Data__Interfaces.html#ga6f28e1a774923108005760426cf8da5b',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5flocal_5fld',['starpu_matrix_get_local_ld',['../group__API__Data__Interfaces.html#ga5c4dfa96a4ffa7be08e22a9dc20484e4',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5flocal_5fptr',['starpu_matrix_get_local_ptr',['../group__API__Data__Interfaces.html#ga9f6457e4a7e558101dd6ad64076a6a99',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5fnx',['STARPU_MATRIX_GET_NX',['../group__API__Data__Interfaces.html#gae3d95a1379358cbd85c663c8462da98c',1,'STARPU_MATRIX_GET_NX(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga461a1d65e0f4559dacbc1ba77eafbb2b',1,'starpu_matrix_get_nx(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5fny',['STARPU_MATRIX_GET_NY',['../group__API__Data__Interfaces.html#gab915146b6d59fbd8e6d04480511f7945',1,'STARPU_MATRIX_GET_NY(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga720fcf673578ec23e583b5f674626847',1,'starpu_matrix_get_ny(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5foffset',['STARPU_MATRIX_GET_OFFSET',['../group__API__Data__Interfaces.html#gac23356ed31839f1d1c52efccb7a99dd7',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fget_5fptr',['STARPU_MATRIX_GET_PTR',['../group__API__Data__Interfaces.html#gacd9e0b5bd06d1b7d88be4e0143be8a68',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5finterface',['starpu_matrix_interface',['../group__API__Data__Interfaces.html#structstarpu__matrix__interface',1,'']]], ['starpu_5fmatrix_5finterface_5fid',['STARPU_MATRIX_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357caf3641ac475b4b69aa6ef5758b950348a',1,'starpu_data_interfaces.h']]], ['starpu_5fmatrix_5fptr_5fregister',['starpu_matrix_ptr_register',['../group__API__Data__Interfaces.html#ga22a8126d41b43e71c3c79e210401b12e',1,'starpu_data_interfaces.h']]], ['starpu_5fmax',['STARPU_MAX',['../group__API__Toolbox.html#gaa156afa885bb447bc0ced3ea66bcf7e6',1,'starpu_util.h']]], ['starpu_5fmax_5finterface_5fid',['STARPU_MAX_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca0eed341fd3aa3fdc35d2f38b3eae09b0',1,'starpu_data_interfaces.h']]], ['starpu_5fmax_5fprio',['STARPU_MAX_PRIO',['../group__API__Scheduling__Contexts.html#gaf213c18d752d78286cff68a379ee7611',1,'starpu_sched_ctx.h']]], ['starpu_5fmaxcudadevs',['STARPU_MAXCUDADEVS',['../group__API__CUDA__Extensions.html#gae2a0ce53013a0c3d7bafaf0ec000cdd5',1,'starpu_config.h']]], ['starpu_5fmaxopencldevs',['STARPU_MAXOPENCLDEVS',['../group__API__OpenCL__Extensions.html#ga1b591248c13dc33e2e9b00ace593405e',1,'starpu_config.h']]], ['starpu_5fmemory_5fget_5favailable',['starpu_memory_get_available',['../group__API__Standard__Memory__Library.html#ga13b23ecc431501f8aebcb7b498acd92b',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5fget_5ftotal',['starpu_memory_get_total',['../group__API__Standard__Memory__Library.html#ga552a99a9bb5c02acd10ed744c9c00a9d',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5fpin',['starpu_memory_pin',['../group__API__Standard__Memory__Library.html#ga5a6ea6d03d7b0f4a97a8046b30ecd0bb',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5funpin',['starpu_memory_unpin',['../group__API__Standard__Memory__Library.html#ga3506e4b5ab7a605e25968883ded27d64',1,'starpu_stdlib.h']]], ['starpu_5fmemory_5fwait_5favailable',['starpu_memory_wait_available',['../group__API__Standard__Memory__Library.html#ga71ec84f082fd96f53612e684eda0e178',1,'starpu_stdlib.h']]], ['starpu_5fmin',['STARPU_MIN',['../group__API__Toolbox.html#gad614bcaae1a110a4ddc0ddc3636dac5d',1,'starpu_util.h']]], ['starpu_5fmin_5fprio',['STARPU_MIN_PRIO',['../group__API__Scheduling__Contexts.html#ga7988c6119e176957987baac65f4fc62c',1,'starpu_sched_ctx.h']]], ['starpu_5fminor_5fversion',['STARPU_MINOR_VERSION',['../group__API__Versioning.html#ga847f129c7b859f46c8bd69c9c8cbcde5',1,'starpu_config.h']]], ['starpu_5fmpi_2eh',['starpu_mpi.h',['../starpu__mpi_8h.html',1,'']]], ['starpu_5fmpi_5fbarrier',['starpu_mpi_barrier',['../group__API__MPI__Support.html#ga77aa675b91da2a069caeebdb11a3edc9',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fflush',['starpu_mpi_cache_flush',['../group__API__MPI__Support.html#gacb05635d95f946f099a1772c8bd59c8b',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fflush_5fall_5fdata',['starpu_mpi_cache_flush_all_data',['../group__API__MPI__Support.html#gadf1f289d1cf35bd31df930bc347fb9ce',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fis_5fenabled',['starpu_mpi_cache_is_enabled',['../group__API__MPI__Support.html#gac0558236c9fb4cfc333f413c0ca191a9',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcache_5fset',['starpu_mpi_cache_set',['../group__API__MPI__Support.html#ga82dceaf1ad42b9a0ab4ed22f9c03b1a8',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fcomm_5famounts_5fretrieve',['starpu_mpi_comm_amounts_retrieve',['../group__API__MPI__Support.html#ga3a6dcddd7eaf6cd3265fd837d67800a2',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fdata_5fget_5frank',['starpu_mpi_data_get_rank',['../group__API__MPI__Support.html#ga0a464b972068bac652622d6a1ed0a996',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fdata_5fget_5ftag',['starpu_mpi_data_get_tag',['../group__API__MPI__Support.html#gacf1e74720ea6884fd8d1ded3cb4eaae9',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fdata_5fregister_5fcomm',['starpu_mpi_data_register_comm',['../group__API__MPI__Support.html#ga2b0587b6cb0dce79fb5ef3b29a0fbf6b',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fgather_5fdetached',['starpu_mpi_gather_detached',['../group__API__MPI__Support.html#gaf83405a3154137f00ccf554c5e5684b5',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fget_5fdata_5fon_5fnode',['starpu_mpi_get_data_on_node',['../group__API__MPI__Support.html#ga0ca9fc89dc1315bf32f38cd14caf24a5',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fget_5fdata_5fon_5fnode_5fdetached',['starpu_mpi_get_data_on_node_detached',['../group__API__MPI__Support.html#ga6c581f7133773a98b583e0c51970ecb7',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finit',['starpu_mpi_init',['../group__API__MPI__Support.html#ga008d0df24380455d6b9301ae750ccd4c',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finitialize',['starpu_mpi_initialize',['../group__API__MPI__Support.html#ga0ec1ce958654468b20224c9ae772f98f',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finitialize_5fextended',['starpu_mpi_initialize_extended',['../group__API__MPI__Support.html#ga234e28905c976ed1b03fcdf75812a06d',1,'starpu_mpi.h']]], ['starpu_5fmpi_5finsert_5ftask',['starpu_mpi_insert_task',['../group__API__MPI__Support.html#ga04229edbc905be8eefce8fb58bfccf8f',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv',['starpu_mpi_irecv',['../group__API__MPI__Support.html#gabb6c92b51c1e76408e0816385fde75c5',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv_5farray_5fdetached_5funlock_5ftag',['starpu_mpi_irecv_array_detached_unlock_tag',['../group__API__MPI__Support.html#ga11f71926b324d325d8a6f6b72b58cdf1',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv_5fdetached',['starpu_mpi_irecv_detached',['../group__API__MPI__Support.html#gabdf54ffd31c0b0908d7751e1b2257897',1,'starpu_mpi.h']]], ['starpu_5fmpi_5firecv_5fdetached_5funlock_5ftag',['starpu_mpi_irecv_detached_unlock_tag',['../group__API__MPI__Support.html#ga6cbbe5e484f38cb5e4e601330f2c5b0d',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend',['starpu_mpi_isend',['../group__API__MPI__Support.html#gafc29de4080f202511f2b558673304b8c',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend_5farray_5fdetached_5funlock_5ftag',['starpu_mpi_isend_array_detached_unlock_tag',['../group__API__MPI__Support.html#ga546dbbe7e9e40817b23bd37fb0eccfe1',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend_5fdetached',['starpu_mpi_isend_detached',['../group__API__MPI__Support.html#gae9506ceb82e72ab1096ac8443dbf13e4',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fisend_5fdetached_5funlock_5ftag',['starpu_mpi_isend_detached_unlock_tag',['../group__API__MPI__Support.html#gae6957a62f85340484cbcebbf65b573c4',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fissend',['starpu_mpi_issend',['../group__API__MPI__Support.html#ga8374cb42eb85e86e58ccfa8e0c5e8aab',1,'starpu_mpi.h']]], ['starpu_5fmpi_5frecv',['starpu_mpi_recv',['../group__API__MPI__Support.html#gaa92438804968616ed4fee7246ec254aa',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fredux_5fdata',['starpu_mpi_redux_data',['../group__API__MPI__Support.html#ga565996704c6707a55410488f8d569357',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fscatter_5fdetached',['starpu_mpi_scatter_detached',['../group__API__MPI__Support.html#ga39ae075749aef08653ade368b9a95ee0',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fsend',['starpu_mpi_send',['../group__API__MPI__Support.html#gaca01fd4db21aebb91da808a3d03f36dc',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fshutdown',['starpu_mpi_shutdown',['../group__API__MPI__Support.html#ga87b22900dc132a958a0f7bce68d32153',1,'starpu_mpi.h']]], ['starpu_5fmpi_5ftest',['starpu_mpi_test',['../group__API__MPI__Support.html#gae8e8389eb3e916131946028e9ebee670',1,'starpu_mpi.h']]], ['starpu_5fmpi_5fwait',['starpu_mpi_wait',['../group__API__MPI__Support.html#gaad03f0a288bad79078045130b9a83188',1,'starpu_mpi.h']]], ['starpu_5fmultiformat_5fdata_5finterface_5fops',['starpu_multiformat_data_interface_ops',['../group__API__Multiformat__Data__Interface.html#structstarpu__multiformat__data__interface__ops',1,'']]], ['starpu_5fmultiformat_5fdata_5fregister',['starpu_multiformat_data_register',['../group__API__Multiformat__Data__Interface.html#gae36d714a8bf065925923a35fd6fd4ae5',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiformat_5fget_5fcpu_5fptr',['STARPU_MULTIFORMAT_GET_CPU_PTR',['../group__API__Multiformat__Data__Interface.html#gaf0937aae4bedeb03e9ebbec36cc1dad6',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiformat_5fget_5fcuda_5fptr',['STARPU_MULTIFORMAT_GET_CUDA_PTR',['../group__API__Multiformat__Data__Interface.html#gaeb6356075b3f57e8c7aeccc85f076d87',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiformat_5fget_5fnx',['STARPU_MULTIFORMAT_GET_NX',['../group__API__Multiformat__Data__Interface.html#ga9719eab3a5e9fbaad2837b4a985a3a14',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiformat_5fget_5fopencl_5fptr',['STARPU_MULTIFORMAT_GET_OPENCL_PTR',['../group__API__Multiformat__Data__Interface.html#ga0b6869745c464525b25a0757d112c318',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiformat_5finterface',['starpu_multiformat_interface',['../group__API__Multiformat__Data__Interface.html#structstarpu__multiformat__interface',1,'']]], ['starpu_5fmultiformat_5finterface_5fid',['STARPU_MULTIFORMAT_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cace921145fc7dd66a423b1c52991c6335',1,'starpu_data_interfaces.h']]], ['starpu_5fmultiple_5fcpu_5fimplementations',['STARPU_MULTIPLE_CPU_IMPLEMENTATIONS',['../group__API__Codelet__And__Tasks.html#ga29760ecd052f42a017005498d707d649',1,'starpu_task.h']]], ['starpu_5fmultiple_5fcuda_5fimplementations',['STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS',['../group__API__Codelet__And__Tasks.html#gad41f0586b5bd0f116a9106457117e7f8',1,'starpu_task.h']]], ['starpu_5fmultiple_5fopencl_5fimplementations',['STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS',['../group__API__Codelet__And__Tasks.html#gabf8eee9a9ff1a110f06e6d9c95fd1e8b',1,'starpu_task.h']]], ['starpu_5fnl_5fregression_5fbased',['STARPU_NL_REGRESSION_BASED',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6a4b1935cc6389974fe69120e978aa3a29',1,'starpu_perfmodel.h']]], ['starpu_5fnmaxbufs',['STARPU_NMAXBUFS',['../group__API__Codelet__And__Tasks.html#gad9efd8b217907a2fe26d92bd91438cdf',1,'starpu_config.h']]], ['starpu_5fnmaxworkers',['STARPU_NMAXWORKERS',['../group__API__Workers__Properties.html#gad7c443d1341e4976d63fb5d77e74bf09',1,'starpu_config.h']]], ['starpu_5fnode_5fget_5fkind',['starpu_node_get_kind',['../group__API__Workers__Properties.html#ga9b2541fc1a20c4c486c499af01a3283c',1,'starpu_data.h']]], ['starpu_5fnode_5fkind',['starpu_node_kind',['../group__API__Workers__Properties.html#ga6f3fbb6e918d0135ccb68473a8ee5ca1',1,'starpu_data.h']]], ['starpu_5fnone',['STARPU_NONE',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dbaacd20c7596d4c1ffc6dbeaa632a6a6a6',1,'starpu_data.h']]], ['starpu_5fnowhere',['STARPU_NOWHERE',['../group__API__Codelet__And__Tasks.html#ga7d5977bc7532b4b357ea8b1017b5aaca',1,'starpu_task.h']]], ['starpu_5fopencl',['STARPU_OPENCL',['../group__API__Codelet__And__Tasks.html#gaec9e5cdf8ac48607ce4495ded31001d5',1,'starpu_task.h']]], ['starpu_5fopencl_2eh',['starpu_opencl.h',['../starpu__opencl_8h.html',1,'']]], ['starpu_5fopencl_5fcollect_5fstats',['starpu_opencl_collect_stats',['../group__API__OpenCL__Extensions.html#gaeaabc8e5d90531a21a8307c06c659984',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcompile_5fopencl_5ffrom_5ffile',['starpu_opencl_compile_opencl_from_file',['../group__API__OpenCL__Extensions.html#ga03f34ac98495afc5d0f268e366f80598',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcompile_5fopencl_5ffrom_5fstring',['starpu_opencl_compile_opencl_from_string',['../group__API__OpenCL__Extensions.html#gac543428352d04b3ff8f735cfc71c3b99',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fasync_5fsync',['starpu_opencl_copy_async_sync',['../group__API__OpenCL__Extensions.html#ga95184b2188d67976e00bcb4637ac1933',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fopencl_5fto_5fopencl',['starpu_opencl_copy_opencl_to_opencl',['../group__API__OpenCL__Extensions.html#ga002e85a0f6bcd087df54287de5ae5e07',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fopencl_5fto_5fram',['starpu_opencl_copy_opencl_to_ram',['../group__API__OpenCL__Extensions.html#ga2bd30ada22e761a6b889f0661b54592f',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fcopy_5fram_5fto_5fopencl',['starpu_opencl_copy_ram_to_opencl',['../group__API__OpenCL__Extensions.html#ga9a1331f26cc54a1f5406770f68b95d29',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fdatadir',['STARPU_OPENCL_DATADIR',['../group__API__OpenCL__Extensions.html#gababf3ee0552f34c89fdc8ebdec116dbf',1,'starpu_config.h']]], ['starpu_5fopencl_5fdefault',['STARPU_OPENCL_DEFAULT',['../group__API__Performance__Model.html#ggaa178fceed017bdbe1bee860d7882565fa6d6e564da79daf52911a0e67393cac93',1,'starpu_perfmodel.h']]], ['starpu_5fopencl_5fdisplay_5ferror',['starpu_opencl_display_error',['../group__API__OpenCL__Extensions.html#ga9e0073e4c839eec6096f6eeca21d7e36',1,'starpu_opencl_display_error(const char *func, const char *file, int line, const char *msg, cl_int status): starpu_opencl.h'],['../group__API__OpenCL__Extensions.html#gae023af317c4040f926d2c50a8f96b5d2',1,'STARPU_OPENCL_DISPLAY_ERROR(): starpu_opencl.h']]], ['starpu_5fopencl_5ferror_5fstring',['starpu_opencl_error_string',['../group__API__OpenCL__Extensions.html#ga7f8e1507dec24eaa7427923bbacb873f',1,'starpu_opencl.h']]], ['starpu_5fopencl_5ffunc_5ft',['starpu_opencl_func_t',['../group__API__Codelet__And__Tasks.html#ga5580d9f3ee1cf070e0bdca49534fecde',1,'starpu_task.h']]], ['starpu_5fopencl_5fget_5fcontext',['starpu_opencl_get_context',['../group__API__OpenCL__Extensions.html#ga7ad0ab374a65417ae3d3a9ceed8f24c4',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fcurrent_5fcontext',['starpu_opencl_get_current_context',['../group__API__OpenCL__Extensions.html#gad18d6a0dfbfadcb0fe0b2be6294aa87d',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fcurrent_5fqueue',['starpu_opencl_get_current_queue',['../group__API__OpenCL__Extensions.html#gab43c1f30361aaa72ca98a9a9fdec792b',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fdevice',['starpu_opencl_get_device',['../group__API__OpenCL__Extensions.html#ga84a524eaac758722f083ee129a19a567',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fget_5fqueue',['starpu_opencl_get_queue',['../group__API__OpenCL__Extensions.html#ga8318641373e06a2a635cb3ab377c5994',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fbinary_5fopencl',['starpu_opencl_load_binary_opencl',['../group__API__OpenCL__Extensions.html#ga893f462bfed53eff3a54f341488db7ad',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fkernel',['starpu_opencl_load_kernel',['../group__API__OpenCL__Extensions.html#ga1d06b6c00b15f4fcd8d4c0c998f955ac',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fopencl_5ffrom_5ffile',['starpu_opencl_load_opencl_from_file',['../group__API__OpenCL__Extensions.html#ga3441dd1c6e61717dd81a3a6eb0bf75a8',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fopencl_5ffrom_5fstring',['starpu_opencl_load_opencl_from_string',['../group__API__OpenCL__Extensions.html#ga9768e086b947961c9db5199e676f05db',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fload_5fprogram_5fsource',['starpu_opencl_load_program_source',['../group__API__OpenCL__Extensions.html#ga7dd3784262c0be223394bc8c2fe81935',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fprogram',['starpu_opencl_program',['../group__API__OpenCL__Extensions.html#structstarpu__opencl__program',1,'']]], ['starpu_5fopencl_5fram',['STARPU_OPENCL_RAM',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a6e0c8b16179c2829393a373831c3b802',1,'starpu_data.h']]], ['starpu_5fopencl_5frelease_5fkernel',['starpu_opencl_release_kernel',['../group__API__OpenCL__Extensions.html#ga68adf424491ec715e891000fa4a6030d',1,'starpu_opencl.h']]], ['starpu_5fopencl_5freport_5ferror',['starpu_opencl_report_error',['../group__API__OpenCL__Extensions.html#ga15f6e4c82407cd3c16e461fc2f129a40',1,'starpu_opencl_report_error(const char *func, const char *file, int line, const char *msg, cl_int status): starpu_opencl.h'],['../group__API__OpenCL__Extensions.html#ga6680ed21ce09f073fa0256169f4e4868',1,'STARPU_OPENCL_REPORT_ERROR(): starpu_opencl.h']]], ['starpu_5fopencl_5freport_5ferror_5fwith_5fmsg',['STARPU_OPENCL_REPORT_ERROR_WITH_MSG',['../group__API__OpenCL__Extensions.html#ga23fa324d87f923f39f05bfdc9d3fe7e9',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fset_5fkernel_5fargs',['starpu_opencl_set_kernel_args',['../group__API__OpenCL__Extensions.html#ga80f968f210417eb9fbf2bfe82e1953a9',1,'starpu_opencl.h']]], ['starpu_5fopencl_5funload_5fopencl',['starpu_opencl_unload_opencl',['../group__API__OpenCL__Extensions.html#gaa38e7cb3231ed30303e50f46c8f6e39c',1,'starpu_opencl.h']]], ['starpu_5fopencl_5fworker',['STARPU_OPENCL_WORKER',['../group__API__Workers__Properties.html#gga173d616aefe98c33a47a847fd2fca37da113d54380f4e41e4da1f94b1a779634f',1,'starpu_worker.h']]], ['starpu_5fopencl_5fworker_5fget_5fcount',['starpu_opencl_worker_get_count',['../group__API__Workers__Properties.html#ga0dd6ff2d77c6a520a6cc4c051eb40bfa',1,'starpu_worker.h']]], ['starpu_5fparallel_5ftask_5fbarrier_5finit',['starpu_parallel_task_barrier_init',['../group__API__Parallel__Tasks.html#ga3d362cb0de1da4e2659f602eff325479',1,'starpu_task.h']]], ['starpu_5fparallel_5ftask_5fbarrier_5finit_5fn',['starpu_parallel_task_barrier_init_n',['../group__API__Parallel__Tasks.html#gaf99bc08bf6f586b658febdd1dc6fef80',1,'starpu_task.h']]], ['starpu_5fpause',['starpu_pause',['../group__API__Initialization__and__Termination.html#ga1796b8121a83d544d146b22daf216387',1,'starpu.h']]], ['starpu_5fper_5farch',['STARPU_PER_ARCH',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6ae4b97f418bd3496f23889a6950d7be82',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel',['starpu_perfmodel',['../group__API__Performance__Model.html#structstarpu__perfmodel',1,'']]], ['starpu_5fperfmodel_2eh',['starpu_perfmodel.h',['../starpu__perfmodel_8h.html',1,'']]], ['starpu_5fperfmodel_5farchtype',['starpu_perfmodel_archtype',['../group__API__Performance__Model.html#gaa178fceed017bdbe1bee860d7882565f',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fdebugfilepath',['starpu_perfmodel_debugfilepath',['../group__API__Performance__Model.html#ga7b23c06e84bdacf454e0da8b962023c2',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fdirectory',['starpu_perfmodel_directory',['../group__API__Performance__Model.html#gaf67943252fb8e637d56f0d84f75334eb',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5ffree_5fsampling_5fdirectories',['starpu_perfmodel_free_sampling_directories',['../group__API__Performance__Model.html#ga4da8a63a264195f54ccaa9f49d188897',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fget_5farch_5fname',['starpu_perfmodel_get_arch_name',['../group__API__Performance__Model.html#ga769faede1986dec6f9eed89998e941a4',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fhistory_5fentry',['starpu_perfmodel_history_entry',['../group__API__Performance__Model.html#structstarpu__perfmodel__history__entry',1,'']]], ['starpu_5fperfmodel_5fhistory_5flist',['starpu_perfmodel_history_list',['../group__API__Performance__Model.html#structstarpu__perfmodel__history__list',1,'']]], ['starpu_5fperfmodel_5flist',['starpu_perfmodel_list',['../group__API__Performance__Model.html#ga7562bd09e4894eeb15391f2a0f21cf00',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fload_5fsymbol',['starpu_perfmodel_load_symbol',['../group__API__Performance__Model.html#ga5ab7213f5c229c16e783004853fcba4c',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fper_5farch',['starpu_perfmodel_per_arch',['../group__API__Performance__Model.html#structstarpu__perfmodel__per__arch',1,'']]], ['starpu_5fperfmodel_5fprint',['starpu_perfmodel_print',['../group__API__Performance__Model.html#ga865fd82e884a5bdf85f99deb83612975',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fprint_5fall',['starpu_perfmodel_print_all',['../group__API__Performance__Model.html#gab70e8b18742e868e5f6505814938bdd1',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fregression_5fmodel',['starpu_perfmodel_regression_model',['../group__API__Performance__Model.html#structstarpu__perfmodel__regression__model',1,'']]], ['starpu_5fperfmodel_5ftype',['starpu_perfmodel_type',['../group__API__Performance__Model.html#gae161a7cae376f3fc831a2b764e8144e6',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5funload_5fmodel',['starpu_perfmodel_unload_model',['../group__API__Performance__Model.html#ga96746e1665eeffec32a82a465325f7dc',1,'starpu_perfmodel.h']]], ['starpu_5fperfmodel_5fupdate_5fhistory',['starpu_perfmodel_update_history',['../group__API__Performance__Model.html#ga5b62043c9f7995a83c7972d98e684c6f',1,'starpu_perfmodel.h']]], ['starpu_5fpoison_5fptr',['STARPU_POISON_PTR',['../group__API__Toolbox.html#ga4c4f93f8ed79333f5801058af4267d84',1,'starpu_util.h']]], ['starpu_5fprefetch_5ftask_5finput_5fon_5fnode',['starpu_prefetch_task_input_on_node',['../group__API__Scheduling__Policy.html#ga3bf8df94c9ea3f1370b53fff54e72888',1,'starpu_scheduler.h']]], ['starpu_5fpriority',['STARPU_PRIORITY',['../group__API__Insert__Task.html#gab9d32b41f7fbae16e9ed2331f6dde8ac',1,'starpu_task_util.h']]], ['starpu_5fprivate',['starpu_private',['../group__API__Codelet__And__Tasks.html#a1761e7b7ea4196aef43891bb9ba5c81d',1,'starpu_task']]], ['starpu_5fprofiling_2eh',['starpu_profiling.h',['../starpu__profiling_8h.html',1,'']]], ['starpu_5fprofiling_5fbus_5fhelper_5fdisplay_5fsummary',['starpu_profiling_bus_helper_display_summary',['../group__API__Profiling.html#ga6511f50290edcabbdf605a1b74746645',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fbus_5finfo',['starpu_profiling_bus_info',['../group__API__Profiling.html#structstarpu__profiling__bus__info',1,'']]], ['starpu_5fprofiling_5fdisable',['STARPU_PROFILING_DISABLE',['../group__API__Profiling.html#gacd7d4b9e0d31ea949f7c14fed739a502',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fenable',['STARPU_PROFILING_ENABLE',['../group__API__Profiling.html#ga24254aaa82ee94c3e6b8b2e21185db32',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5finit',['starpu_profiling_init',['../group__API__Profiling.html#ga57faec3e3c84069a741b420cecc0efd3',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fset_5fid',['starpu_profiling_set_id',['../group__API__Profiling.html#gad126fc77826a0472b6bd872e7ceb40d4',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fstatus_5fget',['starpu_profiling_status_get',['../group__API__Profiling.html#gaf014e2e050ebd38bc4cffec0081f96bf',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fstatus_5fset',['starpu_profiling_status_set',['../group__API__Profiling.html#gabeb22bbe8062a45507cfc6273aae51ae',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5ftask_5finfo',['starpu_profiling_task_info',['../group__API__Profiling.html#structstarpu__profiling__task__info',1,'']]], ['starpu_5fprofiling_5fworker_5fget_5finfo',['starpu_profiling_worker_get_info',['../group__API__Profiling.html#ga8a423df93ec48a7391b2f439357a5544',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fworker_5fhelper_5fdisplay_5fsummary',['starpu_profiling_worker_helper_display_summary',['../group__API__Profiling.html#ga4e4f9fb593d29219a1109062ba9d72ef',1,'starpu_profiling.h']]], ['starpu_5fprofiling_5fworker_5finfo',['starpu_profiling_worker_info',['../group__API__Profiling.html#structstarpu__profiling__worker__info',1,'']]], ['starpu_5fprogression_5fhook_5fderegister',['starpu_progression_hook_deregister',['../group__API__Expert__Mode.html#ga5d52c35e46e387eed77dd9b7b39507a7',1,'starpu_expert.h']]], ['starpu_5fprogression_5fhook_5fregister',['starpu_progression_hook_register',['../group__API__Expert__Mode.html#ga4e8d1e607b2383f80b232c27ec6a9386',1,'starpu_expert.h']]], ['starpu_5fpthread_5fattr_5fdestroy',['starpu_pthread_attr_destroy',['../group__API__Threads.html#ga0a47c0f221c5d06bd2060be964fbaeb2',1,'starpu_thread.h']]], ['starpu_5fpthread_5fattr_5finit',['starpu_pthread_attr_init',['../group__API__Threads.html#gaffe50be0f786d9a529a9946171469879',1,'starpu_thread.h']]], ['starpu_5fpthread_5fattr_5fsetdetachstate',['starpu_pthread_attr_setdetachstate',['../group__API__Threads.html#ga4b4dc49f4d02c93e9b5364e9fb8f148f',1,'starpu_thread.h']]], ['starpu_5fpthread_5fbarrier_5fdestroy',['STARPU_PTHREAD_BARRIER_DESTROY',['../group__API__Threads.html#ga2bd1ebeca9a2d4eefc3d0a399ce3ae3c',1,'starpu_thread_util.h']]], ['starpu_5fpthread_5fbarrier_5finit',['STARPU_PTHREAD_BARRIER_INIT',['../group__API__Threads.html#ga707b1afc766917d4ddbbe19e5569359b',1,'starpu_thread_util.h']]], ['starpu_5fpthread_5fbarrier_5ft',['starpu_pthread_barrier_t',['../starpu__thread_8h.html#structstarpu__pthread__barrier__t',1,'']]], ['starpu_5fpthread_5fbarrier_5fwait',['STARPU_PTHREAD_BARRIER_WAIT',['../group__API__Threads.html#gaa0871b23fee2d5cfa1e4930108b53708',1,'starpu_thread_util.h']]], ['starpu_5fpthread_5fcond_5fbroadcast',['starpu_pthread_cond_broadcast',['../group__API__Threads.html#ga564bcbc71208d2b7636ebb1cc5738ec6',1,'starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond): starpu_thread.h'],['../group__API__Threads.html#ga81126f750a75beef8a9679dd261e1bd2',1,'STARPU_PTHREAD_COND_BROADCAST(): starpu_thread_util.h']]], ['starpu_5fpthread_5fcond_5fdestroy',['starpu_pthread_cond_destroy',['../group__API__Threads.html#ga23c628e2ce5d4d461c4f74d5b87f56d7',1,'starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond): starpu_thread.h'],['../group__API__Threads.html#ga0f576d7a841d598e1f8c78390a539ab6',1,'STARPU_PTHREAD_COND_DESTROY(): starpu_thread_util.h']]], ['starpu_5fpthread_5fcond_5finit',['starpu_pthread_cond_init',['../group__API__Threads.html#gab76ecd1362bef463573d4efb207490fb',1,'starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr): starpu_thread.h'],['../group__API__Threads.html#gaba0e781d7d8a22c313200edaa9ec59f9',1,'STARPU_PTHREAD_COND_INIT(): starpu_thread_util.h']]], ['starpu_5fpthread_5fcond_5finitializer',['STARPU_PTHREAD_COND_INITIALIZER',['../group__API__Threads.html#gac83bf1cce7a509b76cae9e191fb39bb4',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5fsignal',['starpu_pthread_cond_signal',['../group__API__Threads.html#gab118c44d65bf1b0367eae9b02dd65380',1,'starpu_pthread_cond_signal(starpu_pthread_cond_t *cond): starpu_thread.h'],['../group__API__Threads.html#ga42b7eaa98fe66b90eb67f3fdb51fd14d',1,'STARPU_PTHREAD_COND_SIGNAL(): starpu_thread_util.h']]], ['starpu_5fpthread_5fcond_5ftimedwait',['starpu_pthread_cond_timedwait',['../group__API__Threads.html#gaeabcbc8c9aa04f7db8c5486eb4a5b40e',1,'starpu_thread.h']]], ['starpu_5fpthread_5fcond_5fwait',['starpu_pthread_cond_wait',['../group__API__Threads.html#gab4b26829e22eeb9fe23f3f5e15a9e80c',1,'starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex): starpu_thread.h'],['../group__API__Threads.html#gad37f49e0fb051b7a3a66208a4bc67397',1,'STARPU_PTHREAD_COND_WAIT(): starpu_thread_util.h']]], ['starpu_5fpthread_5fcreate',['starpu_pthread_create',['../group__API__Threads.html#ga670ae411d7536934d784c88c6d11177c',1,'starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg): starpu_thread.h'],['../group__API__Threads.html#ga43ef5044dfe6169c422d3ded42aa69e4',1,'STARPU_PTHREAD_CREATE(): starpu_thread_util.h']]], ['starpu_5fpthread_5fcreate_5fon',['STARPU_PTHREAD_CREATE_ON',['../group__API__Threads.html#gaea6e537f9a02061690e845082158b3b4',1,'starpu_thread_util.h']]], ['starpu_5fpthread_5fgetspecific',['starpu_pthread_getspecific',['../group__API__Threads.html#gac88e8ffb09493e5b07c26be794a39613',1,'starpu_pthread_getspecific(starpu_pthread_key_t key): starpu_thread.h'],['../group__API__Threads.html#gae024574a5ff66361d2b00f10924dbf3a',1,'STARPU_PTHREAD_GETSPECIFIC(): starpu_thread_util.h']]], ['starpu_5fpthread_5fjoin',['starpu_pthread_join',['../group__API__Threads.html#ga9d53e88546b413acd8b1312acd885966',1,'starpu_thread.h']]], ['starpu_5fpthread_5fkey_5fcreate',['starpu_pthread_key_create',['../group__API__Threads.html#ga28942688ecde4a23020c9ad0e2051151',1,'starpu_pthread_key_create(starpu_pthread_key_t *key, void(*destr_function)(void *)): starpu_thread.h'],['../group__API__Threads.html#gab1f13e8c7f4e9c7a93e35ffa5f3c8925',1,'STARPU_PTHREAD_KEY_CREATE(): starpu_thread_util.h']]], ['starpu_5fpthread_5fkey_5fdelete',['starpu_pthread_key_delete',['../group__API__Threads.html#ga1a9e6ff32713348b5aee92bf00717639',1,'starpu_pthread_key_delete(starpu_pthread_key_t key): starpu_thread.h'],['../group__API__Threads.html#gac1f65845c0c1c76e65c63fc5174ff5cb',1,'STARPU_PTHREAD_KEY_DELETE(): starpu_thread_util.h']]], ['starpu_5fpthread_5fmutex_5fdestroy',['starpu_pthread_mutex_destroy',['../group__API__Threads.html#gadecb508e5f50f8cf5c90626bdaca17fa',1,'starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex): starpu_thread.h'],['../group__API__Threads.html#gab99612af964c7e92d99e3fcc9513c909',1,'STARPU_PTHREAD_MUTEX_DESTROY(): starpu_thread_util.h']]], ['starpu_5fpthread_5fmutex_5finit',['STARPU_PTHREAD_MUTEX_INIT',['../group__API__Threads.html#gab1d60ac7acd857f056de5d9cdd3b8b93',1,'STARPU_PTHREAD_MUTEX_INIT(): starpu_thread_util.h'],['../group__API__Threads.html#gadda164742adc172cb99860c88363ecd8',1,'starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr): starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5finitializer',['STARPU_PTHREAD_MUTEX_INITIALIZER',['../group__API__Threads.html#gac93d8e7fcb44d354421a77b1c0bc9569',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5flock',['starpu_pthread_mutex_lock',['../group__API__Threads.html#ga402f8687fe2f6f7277c692fa6c1d0d29',1,'starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex): starpu_thread.h'],['../group__API__Threads.html#gacabc76c4b40c66603b5d417d7039439a',1,'STARPU_PTHREAD_MUTEX_LOCK(): starpu_thread_util.h']]], ['starpu_5fpthread_5fmutex_5ftrylock',['starpu_pthread_mutex_trylock',['../group__API__Threads.html#ga8fd0aa9fa9c38abbdcb91047eccf34e5',1,'starpu_thread.h']]], ['starpu_5fpthread_5fmutex_5funlock',['STARPU_PTHREAD_MUTEX_UNLOCK',['../group__API__Threads.html#ga5e53025adc42966a97d616304bd654bd',1,'STARPU_PTHREAD_MUTEX_UNLOCK(): starpu_thread_util.h'],['../group__API__Threads.html#gaebaf9c865b4a20d01a6017a11053c223',1,'starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex): starpu_thread.h']]], ['starpu_5fpthread_5frwlock_5fdestroy',['starpu_pthread_rwlock_destroy',['../group__API__Threads.html#gac62425c906d4084bcc7a8ae8eabdddc9',1,'starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock): starpu_thread.h'],['../group__API__Threads.html#ga348ba00ab90144b68f094631fb3657de',1,'STARPU_PTHREAD_RWLOCK_DESTROY(): starpu_thread_util.h']]], ['starpu_5fpthread_5frwlock_5finit',['starpu_pthread_rwlock_init',['../group__API__Threads.html#gabf2e8a1cabd3330b1ce9c63c2e322a2c',1,'starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr): starpu_thread.h'],['../group__API__Threads.html#gab24c9ad484185c1b0fc2518a27824041',1,'STARPU_PTHREAD_RWLOCK_INIT(): starpu_thread_util.h']]], ['starpu_5fpthread_5frwlock_5frdlock',['starpu_pthread_rwlock_rdlock',['../group__API__Threads.html#ga4156ff97b36067a221b521379c3d3c0a',1,'starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock): starpu_thread.h'],['../group__API__Threads.html#gaede3f824ce3ecf6079987a68da9eb621',1,'STARPU_PTHREAD_RWLOCK_RDLOCK(): starpu_thread_util.h']]], ['starpu_5fpthread_5frwlock_5funlock',['starpu_pthread_rwlock_unlock',['../group__API__Threads.html#ga6fba802f0cd437943d79146250d605fc',1,'starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock): starpu_thread.h'],['../group__API__Threads.html#ga7cf8cbee2a33b4714cf37724f657bd4a',1,'STARPU_PTHREAD_RWLOCK_UNLOCK(): starpu_thread_util.h']]], ['starpu_5fpthread_5frwlock_5fwrlock',['starpu_pthread_rwlock_wrlock',['../group__API__Threads.html#ga459977d1a48ff2396b15e3eee1f00b64',1,'starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock): starpu_thread.h'],['../group__API__Threads.html#ga2331ffac0d863e2d34463003fa961550',1,'STARPU_PTHREAD_RWLOCK_WRLOCK(): starpu_thread_util.h']]], ['starpu_5fpthread_5fsetspecific',['starpu_pthread_setspecific',['../group__API__Threads.html#gadcaa2002f0cd921e66afca18a63ccb88',1,'starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer): starpu_thread.h'],['../group__API__Threads.html#ga0f4c9033a1cbf7b7ef88c5124a65149f',1,'STARPU_PTHREAD_SETSPECIFIC(): starpu_thread_util.h']]], ['starpu_5fpush_5flocal_5ftask',['starpu_push_local_task',['../group__API__Scheduling__Policy.html#gae0b8a9bb53822f3d92cb2d19c2520e5e',1,'starpu_scheduler.h']]], ['starpu_5fpush_5ftask_5fend',['starpu_push_task_end',['../group__API__Scheduling__Policy.html#ga24154b37920144de18bca59090429d6d',1,'starpu_scheduler.h']]], ['starpu_5fr',['STARPU_R',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dbaa4c2445a344c592fb7b1adfcf1d2e1f5',1,'starpu_data.h']]], ['starpu_5frand_2eh',['starpu_rand.h',['../starpu__rand_8h.html',1,'']]], ['starpu_5fredux',['STARPU_REDUX',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba6011b5abab92fd996b29d622c4a488f4',1,'starpu_data.h']]], ['starpu_5fregression_5fbased',['STARPU_REGRESSION_BASED',['../group__API__Performance__Model.html#ggae161a7cae376f3fc831a2b764e8144e6ab46450dd0cc93e3aaed1900afdcad26f',1,'starpu_perfmodel.h']]], ['starpu_5frelease_5fversion',['STARPU_RELEASE_VERSION',['../group__API__Versioning.html#ga43895a109dc6f27de709208f460b321d',1,'starpu_config.h']]], ['starpu_5fresume',['starpu_resume',['../group__API__Initialization__and__Termination.html#ga713e7882886d755830c02eb7003ae475',1,'starpu.h']]], ['starpu_5frmb',['STARPU_RMB',['../group__API__Toolbox.html#gaa5363993d4f519517316ccf9dc47a7bb',1,'starpu_util.h']]], ['starpu_5frw',['STARPU_RW',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba20da2e02cd303015b5967dbf72ef3e1e',1,'starpu_data.h']]], ['starpu_5fsched_5fctx',['STARPU_SCHED_CTX',['../group__API__Insert__Task.html#ga45ae06dad37b9a8518198b1c3b06f276',1,'starpu_task_util.h']]], ['starpu_5fsched_5fctx_2eh',['starpu_sched_ctx.h',['../starpu__sched__ctx_8h.html',1,'']]], ['starpu_5fsched_5fctx_5fadd_5fworkers',['starpu_sched_ctx_add_workers',['../group__API__Scheduling__Contexts.html#ga4938f463f59aaea3f0b766c5da770fb9',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcall_5fpushed_5ftask_5fcb',['starpu_sched_ctx_call_pushed_task_cb',['../group__API__Scheduling__Contexts.html#ga62867177a48ccd40ac944602630cd8f0',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcheck_5fif_5fhypervisor_5fexists',['starpu_sched_ctx_check_if_hypervisor_exists',['../group__API__Scheduling__Contexts.html#ga95283c927a7787e2859cb4a42c93bf19',1,'starpu_sched_ctx_hypervisor.h']]], ['starpu_5fsched_5fctx_5fcontains_5fworker',['starpu_sched_ctx_contains_worker',['../group__API__Scheduling__Contexts.html#ga0fe5c1b14fc254c8b2a737402870a149',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcreate',['starpu_sched_ctx_create',['../group__API__Scheduling__Contexts.html#ga517b7cf4bfac60f2faf484584f19d9d3',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcreate_5finside_5finterval',['starpu_sched_ctx_create_inside_interval',['../group__API__Scheduling__Contexts.html#ga067a3f2a63a9697e5df616466dacf658',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fcreate_5fworker_5fcollection',['starpu_sched_ctx_create_worker_collection',['../group__API__Scheduling__Contexts.html#gaef6a5f63713254b79eca39743f43ddd9',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fdelete',['starpu_sched_ctx_delete',['../group__API__Scheduling__Contexts.html#ga101c3a13d4adc8d932c46324ae71b93a',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fdelete_5fworker_5fcollection',['starpu_sched_ctx_delete_worker_collection',['../group__API__Scheduling__Contexts.html#ga5de2e1e6295cf1fa5723d1164d0a76e6',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5ffinished_5fsubmit',['starpu_sched_ctx_finished_submit',['../group__API__Scheduling__Contexts.html#ga11e94f2968626d9b46ccf021057ddd90',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fcontext',['starpu_sched_ctx_get_context',['../group__API__Scheduling__Contexts.html#gae6b235a9555a74e5cb4c89ca5117b419',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fmax_5fpriority',['starpu_sched_ctx_get_max_priority',['../group__API__Scheduling__Contexts.html#ga1cfc7b78954e33f2738547cbf05e820e',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fmin_5fpriority',['starpu_sched_ctx_get_min_priority',['../group__API__Scheduling__Contexts.html#ga6ae38faa632f496d81f0cf3b0cec5c77',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fnshared_5fworkers',['starpu_sched_ctx_get_nshared_workers',['../group__API__Scheduling__Contexts.html#gae00f5710446d14161beefdad2e48833d',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fnworkers',['starpu_sched_ctx_get_nworkers',['../group__API__Scheduling__Contexts.html#ga18af575377ee066528081b5aec754ea2',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fpolicy_5fdata',['starpu_sched_ctx_get_policy_data',['../group__API__Scheduling__Contexts.html#gaacd0aff652dc75ac37aa51c9c826e043',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fworker_5fcollection',['starpu_sched_ctx_get_worker_collection',['../group__API__Scheduling__Contexts.html#ga6e559a6889a89ec0b9a3b995a41f5f8f',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fget_5fworkers_5flist',['starpu_sched_ctx_get_workers_list',['../group__API__Scheduling__Contexts.html#ga182b6196b075139f611cfd34b42b86e8',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fhypervisor_2eh',['starpu_sched_ctx_hypervisor.h',['../starpu__sched__ctx__hypervisor_8h.html',1,'']]], ['starpu_5fsched_5fctx_5fiterator',['starpu_sched_ctx_iterator',['../group__API__Workers__Properties.html#structstarpu__sched__ctx__iterator',1,'']]], ['starpu_5fsched_5fctx_5fnotify_5fhypervisor_5fexists',['starpu_sched_ctx_notify_hypervisor_exists',['../group__API__Scheduling__Contexts.html#gae7de365db4b774cdea340f7548e93c9d',1,'starpu_sched_ctx_hypervisor.h']]], ['starpu_5fsched_5fctx_5foverlapping_5fctxs_5fon_5fworker',['starpu_sched_ctx_overlapping_ctxs_on_worker',['../group__API__Scheduling__Contexts.html#ga66d2d4d08df845a40b7d19f12bf791c0',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fperformance_5fcounters',['starpu_sched_ctx_performance_counters',['../group__API__Scheduling__Contexts.html#structstarpu__sched__ctx__performance__counters',1,'']]], ['starpu_5fsched_5fctx_5fpolicy_5fmax_5fprio',['STARPU_SCHED_CTX_POLICY_MAX_PRIO',['../group__API__Scheduling__Contexts.html#ga80c723b1a18a2104a28320430d8e8489',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fpolicy_5fmin_5fprio',['STARPU_SCHED_CTX_POLICY_MIN_PRIO',['../group__API__Scheduling__Contexts.html#ga80f88b1017cfde58c18381a52ba0a122',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fpolicy_5fname',['STARPU_SCHED_CTX_POLICY_NAME',['../group__API__Scheduling__Contexts.html#ga66ed9279fc4eb746a0596c2f0be7daa2',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fpolicy_5fstruct',['STARPU_SCHED_CTX_POLICY_STRUCT',['../group__API__Scheduling__Contexts.html#ga9cdf99b6998b774eb53a8cc845f4e597',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fregister_5fclose_5fcallback',['starpu_sched_ctx_register_close_callback',['../group__API__Scheduling__Contexts.html#gaadbcaf9118792338aafe480da6fc6d94',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fremove_5fworkers',['starpu_sched_ctx_remove_workers',['../group__API__Scheduling__Contexts.html#ga5fced8ae787486d906b057c20dfe5926',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fcontext',['starpu_sched_ctx_set_context',['../group__API__Scheduling__Contexts.html#ga4e1aaf03ba327f47e5027c6fb7e5ed00',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5finheritor',['starpu_sched_ctx_set_inheritor',['../group__API__Scheduling__Contexts.html#gad6b7f96254526bb145e0df5ed0354a13',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fmax_5fpriority',['starpu_sched_ctx_set_max_priority',['../group__API__Scheduling__Contexts.html#ga1945cfb563891ad94861e5a5f6b01495',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fmin_5fpriority',['starpu_sched_ctx_set_min_priority',['../group__API__Scheduling__Contexts.html#ga6b8a02442fc4b18ae7f1c67a1a4add35',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fset_5fperf_5fcounters',['starpu_sched_ctx_set_perf_counters',['../group__API__Scheduling__Contexts.html#gaee24cd7da1cde089e038b93f52d1bf1d',1,'starpu_sched_ctx_hypervisor.h']]], ['starpu_5fsched_5fctx_5fset_5fpolicy_5fdata',['starpu_sched_ctx_set_policy_data',['../group__API__Scheduling__Contexts.html#ga20077926e6cd8264bcbb831a394c381a',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fstop_5ftask_5fsubmission',['starpu_sched_ctx_stop_task_submission',['../group__API__Scheduling__Contexts.html#gafe295aec3c152fe1fc0dd74e17f82961',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fworker_5fget_5fid',['starpu_sched_ctx_worker_get_id',['../group__API__Scheduling__Contexts.html#gaa06e10ab1edfe31d7da2f3359630e6f4',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fctx_5fworker_5fshares_5ftasks_5flists',['starpu_sched_ctx_worker_shares_tasks_lists',['../group__API__Scheduling__Policy.html#ga315482308105aa57ecc59e88f71823aa',1,'starpu_scheduler.h']]], ['starpu_5fsched_5fget_5fmax_5fpriority',['starpu_sched_get_max_priority',['../group__API__Scheduling__Policy.html#ga6c2233ec86c827981117306f63da7679',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fget_5fmin_5fpriority',['starpu_sched_get_min_priority',['../group__API__Scheduling__Policy.html#ga6d8a3d42b5f2fee81785b3cf650fa6d2',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fget_5fpredefined_5fpolicies',['starpu_sched_get_predefined_policies',['../group__API__Scheduling__Policy.html#gaca9fb71cec7aa99dfd7a7a6dcafefb88',1,'starpu_scheduler.h']]], ['starpu_5fsched_5fpolicy',['starpu_sched_policy',['../group__API__Scheduling__Policy.html#structstarpu__sched__policy',1,'']]], ['starpu_5fsched_5fset_5fmax_5fpriority',['starpu_sched_set_max_priority',['../group__API__Scheduling__Policy.html#gab8e4a2cd9f4fbad7b20b1086494d842d',1,'starpu_sched_ctx.h']]], ['starpu_5fsched_5fset_5fmin_5fpriority',['starpu_sched_set_min_priority',['../group__API__Scheduling__Policy.html#gace525e755092440f63acbe5cc0b4d066',1,'starpu_sched_ctx.h']]], ['starpu_5fscheduler_2eh',['starpu_scheduler.h',['../starpu__scheduler_8h.html',1,'']]], ['starpu_5fscratch',['STARPU_SCRATCH',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba2a5d5e11b2ec3aa14f5c9bf94accf6f6',1,'starpu_data.h']]], ['starpu_5fseq',['STARPU_SEQ',['../group__API__Codelet__And__Tasks.html#ggac127ad106bf376da993d3f4caa979b2fa6622e698785a33f14549958f44577fcf',1,'starpu_task.h']]], ['starpu_5fshutdown',['starpu_shutdown',['../group__API__Initialization__and__Termination.html#ga48edf5e30e71fbb71923e3867ad16c0a',1,'starpu.h']]], ['starpu_5fspmd',['STARPU_SPMD',['../group__API__Codelet__And__Tasks.html#ggac127ad106bf376da993d3f4caa979b2fad58c1d1b9c143aed79f1ddf6dc104746',1,'starpu_task.h']]], ['starpu_5fssend',['STARPU_SSEND',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dbaf96ec45077e70239a826867ed897bd0f',1,'starpu_data.h']]], ['starpu_5fstdlib_2eh',['starpu_stdlib.h',['../starpu__stdlib_8h.html',1,'']]], ['starpu_5ftag',['STARPU_TAG',['../group__API__Insert__Task.html#ga66222fb40e0942f5b93aed24f0917e3b',1,'starpu_task_util.h']]], ['starpu_5ftag_5fdeclare_5fdeps',['starpu_tag_declare_deps',['../group__API__Explicit__Dependencies.html#ga863d71b775ec517493f81e731a64d134',1,'starpu_task.h']]], ['starpu_5ftag_5fdeclare_5fdeps_5farray',['starpu_tag_declare_deps_array',['../group__API__Explicit__Dependencies.html#gab5c86743355724ee2f9596de1ae221df',1,'starpu_task.h']]], ['starpu_5ftag_5fnotify_5ffrom_5fapps',['starpu_tag_notify_from_apps',['../group__API__Explicit__Dependencies.html#gabdb8d20fca507a93450fe775233dd20c',1,'starpu_task.h']]], ['starpu_5ftag_5fremove',['starpu_tag_remove',['../group__API__Explicit__Dependencies.html#gadbed48d64331463d4f9a9090933e5b9f',1,'starpu_task.h']]], ['starpu_5ftag_5frestart',['starpu_tag_restart',['../group__API__Explicit__Dependencies.html#gaef0b7cee7536d4a5de1b10888ab13add',1,'starpu_task.h']]], ['starpu_5ftag_5ft',['starpu_tag_t',['../group__API__Explicit__Dependencies.html#ga6e19fdd4a84d04323ee05e9b7ec5990e',1,'starpu_task.h']]], ['starpu_5ftag_5fwait',['starpu_tag_wait',['../group__API__Explicit__Dependencies.html#gaf5090c3c45414d693445e79ab7842992',1,'starpu_task.h']]], ['starpu_5ftag_5fwait_5farray',['starpu_tag_wait_array',['../group__API__Explicit__Dependencies.html#gaf5cf68c72a863a6ab0ef8737c92b57ba',1,'starpu_task.h']]], ['starpu_5ftask',['starpu_task',['../group__API__Codelet__And__Tasks.html#structstarpu__task',1,'']]], ['starpu_5ftask_2eh',['starpu_task.h',['../starpu__task_8h.html',1,'']]], ['starpu_5ftask_5fblocked',['STARPU_TASK_BLOCKED',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a677b001ff383c2e11850a03595949a6c',1,'starpu_task.h']]], ['starpu_5ftask_5fblocked_5fon_5fdata',['STARPU_TASK_BLOCKED_ON_DATA',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a5ff984632a93a5e0c5d8579c78b1edb0',1,'starpu_task.h']]], ['starpu_5ftask_5fblocked_5fon_5ftag',['STARPU_TASK_BLOCKED_ON_TAG',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202afa01b5f07d5e628759f9a26c7077f9d4',1,'starpu_task.h']]], ['starpu_5ftask_5fblocked_5fon_5ftask',['STARPU_TASK_BLOCKED_ON_TASK',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a8f0b251db9e88be0bd7af98816c22a78',1,'starpu_task.h']]], ['starpu_5ftask_5fbuild',['starpu_task_build',['../group__API__Insert__Task.html#ga8f7f5033f2077ebae698741750884ff2',1,'starpu_task_util.h']]], ['starpu_5ftask_5fbundle_2eh',['starpu_task_bundle.h',['../starpu__task__bundle_8h.html',1,'']]], ['starpu_5ftask_5fbundle_5fclose',['starpu_task_bundle_close',['../group__API__Task__Bundles.html#ga7fcf9fedcf2a3f79784425431980a480',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5fcreate',['starpu_task_bundle_create',['../group__API__Task__Bundles.html#gadd37abde6806819967151a64146b19d6',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5fexpected_5fdata_5ftransfer_5ftime',['starpu_task_bundle_expected_data_transfer_time',['../group__API__Task__Bundles.html#gaf589986f5e69b7452ba90857d1931594',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fbundle_5fexpected_5flength',['starpu_task_bundle_expected_length',['../group__API__Task__Bundles.html#ga8b84caba693abab75f2085447ed24354',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fbundle_5fexpected_5fpower',['starpu_task_bundle_expected_power',['../group__API__Task__Bundles.html#ga30367fa33967131fa547364c2cf5f328',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fbundle_5finsert',['starpu_task_bundle_insert',['../group__API__Task__Bundles.html#gae8be4224d241ac2d30d9d573359e3280',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5fremove',['starpu_task_bundle_remove',['../group__API__Task__Bundles.html#gad904bbf27569e421454a2c8b25458eb3',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fbundle_5ft',['starpu_task_bundle_t',['../group__API__Task__Bundles.html#ga1be1e845a54cec05cbc371d1f0c9a2e1',1,'starpu_task_bundle.h']]], ['starpu_5ftask_5fclean',['starpu_task_clean',['../group__API__Codelet__And__Tasks.html#gaecb3efa04cb10b049b10c6166dd9c30c',1,'starpu_task.h']]], ['starpu_5ftask_5fcreate',['starpu_task_create',['../group__API__Codelet__And__Tasks.html#ga8720143096f8274be1b6ae75a1abd0ed',1,'starpu_task.h']]], ['starpu_5ftask_5fdeclare_5fdeps_5farray',['starpu_task_declare_deps_array',['../group__API__Explicit__Dependencies.html#gada6692ca393aa820bc105252ca19830f',1,'starpu_task.h']]], ['starpu_5ftask_5fdestroy',['starpu_task_destroy',['../group__API__Codelet__And__Tasks.html#ga8fdfb4c2276013b699f5398a1c528bba',1,'starpu_task.h']]], ['starpu_5ftask_5fdup',['starpu_task_dup',['../group__API__Codelet__And__Tasks.html#gafae324cd8f5a0851d66bffc95bb28d49',1,'starpu_task.h']]], ['starpu_5ftask_5fexpected_5fconversion_5ftime',['starpu_task_expected_conversion_time',['../group__API__Scheduling__Policy.html#gac3b5544dc3748c741fae1f6c10bc2b01',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fexpected_5fdata_5ftransfer_5ftime',['starpu_task_expected_data_transfer_time',['../group__API__Scheduling__Policy.html#ga4faf5df3280a5331bdddd3f878a3024d',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fexpected_5flength',['starpu_task_expected_length',['../group__API__Scheduling__Policy.html#ga10f34ad6d9dc824c63cc075dde87b4c1',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fexpected_5fpower',['starpu_task_expected_power',['../group__API__Scheduling__Policy.html#gaab1a403f861fc72079a4bda1d83a433b',1,'starpu_scheduler.h']]], ['starpu_5ftask_5ffinished',['STARPU_TASK_FINISHED',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a01380324ad453dd9154c38582df6359e',1,'starpu_task.h']]], ['starpu_5ftask_5ffootprint',['starpu_task_footprint',['../group__API__Scheduling__Policy.html#ga4f9b7837908f7a3d07b759debc72ad54',1,'starpu_scheduler.h']]], ['starpu_5ftask_5fget_5fcurrent',['starpu_task_get_current',['../group__API__Codelet__And__Tasks.html#gab0a96cce01be9f4eccad9c783e8e27bb',1,'starpu_task.h']]], ['starpu_5ftask_5fget_5fhandle',['STARPU_TASK_GET_HANDLE',['../group__API__Codelet__And__Tasks.html#ga260a1f7f8bef6b255dd0e0e45481385e',1,'starpu_task.h']]], ['starpu_5ftask_5fget_5fimplementation',['starpu_task_get_implementation',['../group__API__Codelet__And__Tasks.html#gaac492d7132cc930b8483b571d0dd4333',1,'starpu_task.h']]], ['starpu_5ftask_5finit',['starpu_task_init',['../group__API__Codelet__And__Tasks.html#gadf8b76ef62ba0e68684e07ebf1db1731',1,'starpu_task.h']]], ['starpu_5ftask_5finitializer',['STARPU_TASK_INITIALIZER',['../group__API__Codelet__And__Tasks.html#gafe2c37f8164584418e7781fc15fb054c',1,'starpu_task.h']]], ['starpu_5ftask_5finvalid',['STARPU_TASK_INVALID',['../group__API__Codelet__And__Tasks.html#ga5cd260cfe96251890a0749743692de09',1,'starpu_task.h']]], ['starpu_5ftask_5flist',['starpu_task_list',['../group__API__Task__Lists.html#structstarpu__task__list',1,'']]], ['starpu_5ftask_5flist_2eh',['starpu_task_list.h',['../starpu__task__list_8h.html',1,'']]], ['starpu_5ftask_5flist_5fback',['starpu_task_list_back',['../group__API__Task__Lists.html#ga871dd2f2bb4429d4edc9777abf3490b3',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fbegin',['starpu_task_list_begin',['../group__API__Task__Lists.html#gac3ea85752262f5281b745b2792af9266',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fempty',['starpu_task_list_empty',['../group__API__Task__Lists.html#ga477ef573c883af23f946ec291801458a',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5ferase',['starpu_task_list_erase',['../group__API__Task__Lists.html#gaedf8ff832aea57abbb8ab94304a85c13',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5ffront',['starpu_task_list_front',['../group__API__Task__Lists.html#gad38d569521bb710afc2299a9150f083f',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5finit',['starpu_task_list_init',['../group__API__Task__Lists.html#ga5618612b0ce2f914ab9032474ddf072f',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fnext',['starpu_task_list_next',['../group__API__Task__Lists.html#ga4630f5b59e347b36b27f025b9c8801a1',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpop_5fback',['starpu_task_list_pop_back',['../group__API__Task__Lists.html#gad88622cd18759da0a9b30ca75c11e22b',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpop_5ffront',['starpu_task_list_pop_front',['../group__API__Task__Lists.html#gad0e3e0684ea77c786b7c5b83894b5e5d',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpush_5fback',['starpu_task_list_push_back',['../group__API__Task__Lists.html#gae29a8aae4e82286c80656a7afdc7a106',1,'starpu_task_list.h']]], ['starpu_5ftask_5flist_5fpush_5ffront',['starpu_task_list_push_front',['../group__API__Task__Lists.html#gabf5bb8daf00f9902ea501009720af19d',1,'starpu_task_list.h']]], ['starpu_5ftask_5fnready',['starpu_task_nready',['../group__API__Codelet__And__Tasks.html#ga18bec8430309a613520d6042d701790d',1,'starpu_task.h']]], ['starpu_5ftask_5fnsubmitted',['starpu_task_nsubmitted',['../group__API__Codelet__And__Tasks.html#gae2740e2b2b948a5c48f5424651dfc721',1,'starpu_task.h']]], ['starpu_5ftask_5fready',['STARPU_TASK_READY',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202a77b817e6cd032658581f7b9cf12dd3e3',1,'starpu_task.h']]], ['starpu_5ftask_5frunning',['STARPU_TASK_RUNNING',['../group__API__Codelet__And__Tasks.html#gga0088c4ab87a08b3e7a375c1a79e91202afcf62642e96b8982135f58a477e9ea9c',1,'starpu_task.h']]], ['starpu_5ftask_5fset_5fhandle',['STARPU_TASK_SET_HANDLE',['../group__API__Codelet__And__Tasks.html#ga82b2ad7adb9e1c70d4c901a89be88d5d',1,'starpu_task.h']]], ['starpu_5ftask_5fset_5fimplementation',['starpu_task_set_implementation',['../group__API__Codelet__And__Tasks.html#gaabb4805df503ece40a5e092d8e99ae52',1,'starpu_task.h']]], ['starpu_5ftask_5fstatus',['starpu_task_status',['../group__API__Codelet__And__Tasks.html#ga0088c4ab87a08b3e7a375c1a79e91202',1,'starpu_task.h']]], ['starpu_5ftask_5fsubmit',['starpu_task_submit',['../group__API__Codelet__And__Tasks.html#gaa32228bf7f452f7d664986668ea46590',1,'starpu_task.h']]], ['starpu_5ftask_5fsubmit_5fto_5fctx',['starpu_task_submit_to_ctx',['../group__API__Codelet__And__Tasks.html#ga3c6c4dd317df02d7021e23ab6b14e3e2',1,'starpu_task.h']]], ['starpu_5ftask_5futil_2eh',['starpu_task_util.h',['../starpu__task__util_8h.html',1,'']]], ['starpu_5ftask_5fwait',['starpu_task_wait',['../group__API__Codelet__And__Tasks.html#gad915868fe3e292657cefc6e1c404c7f4',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fall',['starpu_task_wait_for_all',['../group__API__Codelet__And__Tasks.html#gad0baa8dbfd13e5a7bc3651bcd76022aa',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fall_5fin_5fctx',['starpu_task_wait_for_all_in_ctx',['../group__API__Codelet__And__Tasks.html#gaf963bbf24935bdf137d2eefa7fd06b80',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fn_5fsubmitted',['starpu_task_wait_for_n_submitted',['../group__API__Codelet__And__Tasks.html#ga724cda8b0ffeaa7532a5e573b86bc90b',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fn_5fsubmitted_5fin_5fctx',['starpu_task_wait_for_n_submitted_in_ctx',['../group__API__Codelet__And__Tasks.html#gabba5bab6e4eb84f21f01ba53008a0cd3',1,'starpu_task.h']]], ['starpu_5ftask_5fwait_5ffor_5fno_5fready',['starpu_task_wait_for_no_ready',['../group__API__Codelet__And__Tasks.html#ga50ff3cb4b73a5e44e51035166127d40a',1,'starpu_task.h']]], ['starpu_5fthread_2eh',['starpu_thread.h',['../starpu__thread_8h.html',1,'']]], ['starpu_5fthread_5futil_2eh',['starpu_thread_util.h',['../starpu__thread__util_8h.html',1,'']]], ['starpu_5ftiming_5fnow',['starpu_timing_now',['../group__API__Scheduling__Policy.html#ga34953348991f74a1cbd694fffb27f8b7',1,'starpu_util.h']]], ['starpu_5ftiming_5ftimespec_5fdelay_5fus',['starpu_timing_timespec_delay_us',['../group__API__Profiling.html#gacf0b5499290848f07c97a32c6c2412db',1,'starpu_profiling.h']]], ['starpu_5ftiming_5ftimespec_5fto_5fus',['starpu_timing_timespec_to_us',['../group__API__Profiling.html#ga87639260ff5c89f466e83fcc093e77fe',1,'starpu_profiling.h']]], ['starpu_5ftop_2eh',['starpu_top.h',['../starpu__top_8h.html',1,'']]], ['starpu_5ftop_5fadd_5fdata_5fboolean',['starpu_top_add_data_boolean',['../group__API__StarPUTop__Interface.html#ga016dd52f4fb957306fbc0d8dfdf50c71',1,'starpu_top.h']]], ['starpu_5ftop_5fadd_5fdata_5ffloat',['starpu_top_add_data_float',['../group__API__StarPUTop__Interface.html#gae79ecd90078b87ebf97cbb127effde89',1,'starpu_top.h']]], ['starpu_5ftop_5fadd_5fdata_5finteger',['starpu_top_add_data_integer',['../group__API__StarPUTop__Interface.html#gad2d523db513a2e74f8cc417926fe4886',1,'starpu_top.h']]], ['starpu_5ftop_5fdata',['starpu_top_data',['../group__API__StarPUTop__Interface.html#structstarpu__top__data',1,'']]], ['starpu_5ftop_5fdata_5fboolean',['STARPU_TOP_DATA_BOOLEAN',['../group__API__StarPUTop__Interface.html#gga7b7dfbb9c273503e6e7f5790b39e2d27a8ae4c093533aae3d4ece7910d16fa7cf',1,'starpu_top.h']]], ['starpu_5ftop_5fdata_5ffloat',['STARPU_TOP_DATA_FLOAT',['../group__API__StarPUTop__Interface.html#gga7b7dfbb9c273503e6e7f5790b39e2d27adfb99eeccad78dbb404dc39f058e22be',1,'starpu_top.h']]], ['starpu_5ftop_5fdata_5finteger',['STARPU_TOP_DATA_INTEGER',['../group__API__StarPUTop__Interface.html#gga7b7dfbb9c273503e6e7f5790b39e2d27a70a25dacfac1c08f2e73263f9b10a21e',1,'starpu_top.h']]], ['starpu_5ftop_5fdata_5ftype',['starpu_top_data_type',['../group__API__StarPUTop__Interface.html#ga7b7dfbb9c273503e6e7f5790b39e2d27',1,'starpu_top.h']]], ['starpu_5ftop_5fdebug_5flock',['starpu_top_debug_lock',['../group__API__StarPUTop__Interface.html#ga414faad453d183d1c026eb04fc59b07f',1,'starpu_top.h']]], ['starpu_5ftop_5fdebug_5flog',['starpu_top_debug_log',['../group__API__StarPUTop__Interface.html#ga07e4329145ef683b44df8f36e5331158',1,'starpu_top.h']]], ['starpu_5ftop_5finit_5fand_5fwait',['starpu_top_init_and_wait',['../group__API__StarPUTop__Interface.html#ga84638ef94fd71d3192c194053e91b4d8',1,'starpu_top.h']]], ['starpu_5ftop_5fmessage_5ftype',['starpu_top_message_type',['../group__API__StarPUTop__Interface.html#ga568af4507d96390316b93c92fee45f52',1,'starpu_top.h']]], ['starpu_5ftop_5fparam',['starpu_top_param',['../group__API__StarPUTop__Interface.html#structstarpu__top__param',1,'']]], ['starpu_5ftop_5fparam_5fboolean',['STARPU_TOP_PARAM_BOOLEAN',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9a6e452fdfa703a7292d7526844309dd34',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5fenum',['STARPU_TOP_PARAM_ENUM',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9aaea8e0c88de44de91feaf091f2f8f431',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5ffloat',['STARPU_TOP_PARAM_FLOAT',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9a2d732b79d2e553a6d248a348b07e1422',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5finteger',['STARPU_TOP_PARAM_INTEGER',['../group__API__StarPUTop__Interface.html#gga1979aeea98f354bd500f4902ef2299d9ac1737a4533dd745432df144d19f7874f',1,'starpu_top.h']]], ['starpu_5ftop_5fparam_5ftype',['starpu_top_param_type',['../group__API__StarPUTop__Interface.html#ga1979aeea98f354bd500f4902ef2299d9',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5fboolean',['starpu_top_register_parameter_boolean',['../group__API__StarPUTop__Interface.html#gadae398d33233f7d7f8860562885c564d',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5fenum',['starpu_top_register_parameter_enum',['../group__API__StarPUTop__Interface.html#ga3406e743f8db81f60c019b1be2bbb46f',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5ffloat',['starpu_top_register_parameter_float',['../group__API__StarPUTop__Interface.html#ga91db3cdf3b86e37066e625e504b33fb0',1,'starpu_top.h']]], ['starpu_5ftop_5fregister_5fparameter_5finteger',['starpu_top_register_parameter_integer',['../group__API__StarPUTop__Interface.html#ga97bf62e4f04016e273f364ab99b3d146',1,'starpu_top.h']]], ['starpu_5ftop_5ftask_5fprevision',['starpu_top_task_prevision',['../group__API__StarPUTop__Interface.html#gac361229a1e495768bf5f1653940528de',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fdata_5fboolean',['starpu_top_update_data_boolean',['../group__API__StarPUTop__Interface.html#ga87b6dcc03287a2a19788c984443160c2',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fdata_5ffloat',['starpu_top_update_data_float',['../group__API__StarPUTop__Interface.html#ga373e3fecfd9fccc0ac3e3857f2e5a0e8',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fdata_5finteger',['starpu_top_update_data_integer',['../group__API__StarPUTop__Interface.html#ga68fb3d6362e00a8d32668389e98dca07',1,'starpu_top.h']]], ['starpu_5ftop_5fupdate_5fparameter',['starpu_top_update_parameter',['../group__API__StarPUTop__Interface.html#ga4afdee5376361117e11e8a9ee4a47bad',1,'starpu_top.h']]], ['starpu_5ftopology_5fprint',['starpu_topology_print',['../group__API__Initialization__and__Termination.html#ga0702f607811a2af4f7d2bc271eb434e9',1,'starpu.h']]], ['starpu_5ftransfer_5fbandwidth',['starpu_transfer_bandwidth',['../group__API__Performance__Model.html#ga767f88b087d4b0bf4086ade9bb673826',1,'starpu_perfmodel.h']]], ['starpu_5ftransfer_5flatency',['starpu_transfer_latency',['../group__API__Performance__Model.html#ga77915973bf2f03bd70fb84ee4c9c51a0',1,'starpu_perfmodel.h']]], ['starpu_5ftransfer_5fpredict',['starpu_transfer_predict',['../group__API__Performance__Model.html#ga9a4af8d1b5a3486a5a21c72dd4a6c4c2',1,'starpu_perfmodel.h']]], ['starpu_5funknown_5finterface_5fid',['STARPU_UNKNOWN_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca26edb6f25f81276cc829b070fd240472',1,'starpu_data_interfaces.h']]], ['starpu_5funlikely',['STARPU_UNLIKELY',['../group__API__Toolbox.html#ga23742c6fca8b5386e1f3e3f7bbf3a692',1,'starpu_util.h']]], ['starpu_5funused',['STARPU_UNUSED',['../group__API__Workers__Properties.html#gga6f3fbb6e918d0135ccb68473a8ee5ca1a92a0688575c41519f031fefd35f51c9e',1,'starpu_data.h']]], ['starpu_5fuse_5fcuda',['STARPU_USE_CUDA',['../group__API__CUDA__Extensions.html#ga384db70769609ec68fae5a0105821299',1,'starpu_config.h']]], ['starpu_5fuse_5fmpi',['STARPU_USE_MPI',['../group__API__MPI__Support.html#gabefad62cd0f0ea270a95e97c0fae17d6',1,'starpu_config.h']]], ['starpu_5fuse_5fopencl',['STARPU_USE_OPENCL',['../group__API__OpenCL__Extensions.html#ga160dc78c0f6a90b5aa2200b49c5b4d7b',1,'starpu_config.h']]], ['starpu_5futil_2eh',['starpu_util.h',['../starpu__util_8h.html',1,'']]], ['starpu_5fvalue',['STARPU_VALUE',['../group__API__Insert__Task.html#gaff4c08029dceb2d7f158d49def9aec00',1,'starpu_task_util.h']]], ['starpu_5fvariable_5fdata_5fregister',['starpu_variable_data_register',['../group__API__Data__Interfaces.html#gadcd1aee7fb7226edebe64dfcc46c1d69',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5fdev_5fhandle',['STARPU_VARIABLE_GET_DEV_HANDLE',['../group__API__Data__Interfaces.html#gaf011a057a557a66271ce06e8109c11c4',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5felemsize',['starpu_variable_get_elemsize',['../group__API__Data__Interfaces.html#ga988036ae1f9385832c2988064a4f27af',1,'starpu_variable_get_elemsize(starpu_data_handle_t handle): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga7d44b8a0594932a8cece13e1cc9932bb',1,'STARPU_VARIABLE_GET_ELEMSIZE(): starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5flocal_5fptr',['starpu_variable_get_local_ptr',['../group__API__Data__Interfaces.html#ga540f980b1c4bee16c78d84097a8b07f9',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5foffset',['STARPU_VARIABLE_GET_OFFSET',['../group__API__Data__Interfaces.html#ga789d363d29e5cc1fcbf0eb038babbcab',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5fget_5fptr',['STARPU_VARIABLE_GET_PTR',['../group__API__Data__Interfaces.html#gad99e209fafc3ad5e0c4da0de02e5bda2',1,'starpu_data_interfaces.h']]], ['starpu_5fvariable_5finterface',['starpu_variable_interface',['../group__API__Data__Interfaces.html#structstarpu__variable__interface',1,'']]], ['starpu_5fvariable_5finterface_5fid',['STARPU_VARIABLE_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cae02c3d444d843270b692718f22173ab3',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fdata_5fregister',['starpu_vector_data_register',['../group__API__Data__Interfaces.html#ga98ea4083ac39db45b6be75354e66bca1',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5ffilter_5fblock',['starpu_vector_filter_block',['../group__API__Data__Partition.html#ga212189d3b83dfa4e225609b5f2bf8461',1,'starpu_data_filters.h']]], ['starpu_5fvector_5ffilter_5fblock_5fshadow',['starpu_vector_filter_block_shadow',['../group__API__Data__Partition.html#gaab49915dc0462c1b145bfb0a9ce4cf52',1,'starpu_data_filters.h']]], ['starpu_5fvector_5ffilter_5fdivide_5fin_5f2',['starpu_vector_filter_divide_in_2',['../group__API__Data__Partition.html#gab639622ea4929c36df704a0bebfd3fac',1,'starpu_data_filters.h']]], ['starpu_5fvector_5ffilter_5flist',['starpu_vector_filter_list',['../group__API__Data__Partition.html#gab9fa487bfff5ccdd59210bdde65a11db',1,'starpu_data_filters.h']]], ['starpu_5fvector_5fget_5fdev_5fhandle',['STARPU_VECTOR_GET_DEV_HANDLE',['../group__API__Data__Interfaces.html#gadccf196d01dd9c43e931827a86f886b2',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5felemsize',['STARPU_VECTOR_GET_ELEMSIZE',['../group__API__Data__Interfaces.html#ga3a3cf303a3e3be144aab7abdf587c900',1,'STARPU_VECTOR_GET_ELEMSIZE(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#gacd95c31b537322b1d4000a1248b9c425',1,'starpu_vector_get_elemsize(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5flocal_5fptr',['starpu_vector_get_local_ptr',['../group__API__Data__Interfaces.html#gacee0a9e166f87b48da1f56e1ae5d988d',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5fnx',['STARPU_VECTOR_GET_NX',['../group__API__Data__Interfaces.html#ga7cc322b2f03830ec7afbb58b7416a283',1,'STARPU_VECTOR_GET_NX(): starpu_data_interfaces.h'],['../group__API__Data__Interfaces.html#ga08bed7d1e9b7cb2b2b76932eb9c33353',1,'starpu_vector_get_nx(starpu_data_handle_t handle): starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5foffset',['STARPU_VECTOR_GET_OFFSET',['../group__API__Data__Interfaces.html#ga8fa1c7e18fa7c621ec68fc5aa32ef181',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fget_5fptr',['STARPU_VECTOR_GET_PTR',['../group__API__Data__Interfaces.html#gaa23416a6d049b276fe57b19e069b68b3',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5finterface',['starpu_vector_interface',['../group__API__Data__Interfaces.html#structstarpu__vector__interface',1,'']]], ['starpu_5fvector_5finterface_5fid',['STARPU_VECTOR_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357cabd89ff25621eab18a8a7306842c13217',1,'starpu_data_interfaces.h']]], ['starpu_5fvector_5fptr_5fregister',['starpu_vector_ptr_register',['../group__API__Data__Interfaces.html#gacb816db830d6991909a35a8c0e93a843',1,'starpu_data_interfaces.h']]], ['starpu_5fvoid_5fdata_5fregister',['starpu_void_data_register',['../group__API__Data__Interfaces.html#gab7f9484602aeef560cc2e5904e3b2cff',1,'starpu_data_interfaces.h']]], ['starpu_5fvoid_5finterface_5fid',['STARPU_VOID_INTERFACE_ID',['../starpu__data__interfaces_8h.html#gaa2f2140147f15e7b9eec1443690e357ca3867ecf55ad294013fd36c502af39d12',1,'starpu_data_interfaces.h']]], ['starpu_5fw',['STARPU_W',['../group__API__Data__Management.html#gga1fb3a1ff8622747d653d1b5f41bc41dba052ab75035ca297c7955363c605231c8',1,'starpu_data.h']]], ['starpu_5fwake_5fall_5fblocked_5fworkers',['starpu_wake_all_blocked_workers',['../group__API__Expert__Mode.html#gaf5f4a32a78630fb051a846cbdcd77d8b',1,'starpu_expert.h']]], ['starpu_5fwarn_5funused_5fresult',['STARPU_WARN_UNUSED_RESULT',['../group__API__Toolbox.html#ga718857e58c604e0fab6a45a217961277',1,'starpu_util.h']]], ['starpu_5fwmb',['STARPU_WMB',['../group__API__Toolbox.html#ga07b2628bd6680fe49d92c7f816d7ce53',1,'starpu_util.h']]], ['starpu_5fworker_2eh',['starpu_worker.h',['../starpu__worker_8h.html',1,'']]], ['starpu_5fworker_5farchtype',['starpu_worker_archtype',['../group__API__Workers__Properties.html#ga173d616aefe98c33a47a847fd2fca37d',1,'starpu_worker.h']]], ['starpu_5fworker_5fcan_5fexecute_5ftask',['starpu_worker_can_execute_task',['../group__API__Scheduling__Policy.html#ga2c45db0c01e86497082c907b9cb0f4cc',1,'starpu_scheduler.h']]], ['starpu_5fworker_5fcollection',['starpu_worker_collection',['../group__API__Workers__Properties.html#structstarpu__worker__collection',1,'']]], ['starpu_5fworker_5fcollection_5ftype',['starpu_worker_collection_type',['../group__API__Workers__Properties.html#ga80b06886ee8a4c0e99b09ab638113af3',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fby_5fdevid',['starpu_worker_get_by_devid',['../group__API__Workers__Properties.html#gae6166f338640d033b740f5c8008b851b',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fby_5ftype',['starpu_worker_get_by_type',['../group__API__Workers__Properties.html#gab0ffe5622c5980444226f1ed8d6fee71',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fcount',['starpu_worker_get_count',['../group__API__Workers__Properties.html#ga6312aa4b12ce7e06fe391bcafda6796a',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fcount_5fby_5ftype',['starpu_worker_get_count_by_type',['../group__API__Workers__Properties.html#ga60b4a796a3dba40e5159158750805bf2',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fdevid',['starpu_worker_get_devid',['../group__API__Workers__Properties.html#ga0c9b9b7f5195cb8cbc5ee1223ec0f264',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fid',['starpu_worker_get_id',['../group__API__Workers__Properties.html#gac6d06f4e22b63bf50bc8e836cf16f81f',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fids_5fby_5ftype',['starpu_worker_get_ids_by_type',['../group__API__Workers__Properties.html#gaddb73ee5de667ba2e3353eb977d22cde',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fmemory_5fnode',['starpu_worker_get_memory_node',['../group__API__Workers__Properties.html#ga7de6654141ce89ea83c3aba60486396e',1,'starpu_data.h']]], ['starpu_5fworker_5fget_5fname',['starpu_worker_get_name',['../group__API__Workers__Properties.html#gae35a841f996b8758f3d0ce2ac2d066a5',1,'starpu_worker.h']]], ['starpu_5fworker_5fget_5fperf_5farchtype',['starpu_worker_get_perf_archtype',['../group__API__Performance__Model.html#ga62eb61bbe13515d4b29c8a63b3bf19d0',1,'starpu_perfmodel.h']]], ['starpu_5fworker_5fget_5frelative_5fspeedup',['starpu_worker_get_relative_speedup',['../group__API__Scheduling__Policy.html#gab46e48dff40b77e87abef46517cc58b4',1,'starpu_scheduler.h']]], ['starpu_5fworker_5fget_5fsched_5fcondition',['starpu_worker_get_sched_condition',['../group__API__Scheduling__Policy.html#gadf8e42d41b76117293db5651b0912c78',1,'starpu_scheduler.h']]], ['starpu_5fworker_5fget_5ftype',['starpu_worker_get_type',['../group__API__Workers__Properties.html#ga4998e4e1dfa0d121059c60f790496a03',1,'starpu_worker.h']]], ['starpu_5fworker_5flist',['STARPU_WORKER_LIST',['../group__API__Workers__Properties.html#gga80b06886ee8a4c0e99b09ab638113af3a7fb30f298c82f9375f49a42664d473bc',1,'starpu_worker.h']]], ['starpufft_5fcleanup',['starpufft_cleanup',['../group__API__FFT__Support.html#ga4670f7ac8c6980f78b80b48bbe561299',1,'starpufft.h']]], ['starpufft_5fdestroy_5fplan',['starpufft_destroy_plan',['../group__API__FFT__Support.html#ga2b1a62489b5b48491067bc8dc39f4b16',1,'starpufft.h']]], ['starpufft_5fexecute',['starpufft_execute',['../group__API__FFT__Support.html#gae73ea67d1d7df63938661c7a1105800a',1,'starpufft.h']]], ['starpufft_5fexecute_5fhandle',['starpufft_execute_handle',['../group__API__FFT__Support.html#ga22ad2f1c869305d11132322039d38876',1,'starpufft.h']]], ['starpufft_5ffree',['starpufft_free',['../group__API__FFT__Support.html#ga6809e3bc78ad0d7f9df41e99ddada069',1,'starpufft.h']]], ['starpufft_5fmalloc',['starpufft_malloc',['../group__API__FFT__Support.html#gabf7989748571ab9155a865a19002d1fa',1,'starpufft.h']]], ['starpufft_5fplan_5fdft_5f1d',['starpufft_plan_dft_1d',['../group__API__FFT__Support.html#ga642104c645445688177f1a44afeeefb0',1,'starpufft.h']]], ['starpufft_5fplan_5fdft_5f2d',['starpufft_plan_dft_2d',['../group__API__FFT__Support.html#gaf263d43c43927007819edf069cc8c93b',1,'starpufft.h']]], ['starpufft_5fstart',['starpufft_start',['../group__API__FFT__Support.html#ga8e37e0bd1edc887cf456dcf7d95b86c4',1,'starpufft.h']]], ['starpufft_5fstart_5fhandle',['starpufft_start_handle',['../group__API__FFT__Support.html#gabff378384df24d2c2ea296397b600569',1,'starpufft.h']]], ['start_5ftime',['start_time',['../group__API__Profiling.html#a2f772c59446f844a1eb4fd4c275d7da6',1,'starpu_profiling_task_info::start_time()'],['../group__API__Profiling.html#ab33462e0d10f7aa57c7dc73f70f986f4',1,'starpu_profiling_worker_info::start_time()'],['../group__API__Profiling.html#a47f093211da62496652bfa5073a01f3f',1,'starpu_profiling_bus_info::start_time()'],['../group__API__SC__Hypervisor.html#adc95fd3044241fb7a37334c55c90e597',1,'sc_hypervisor_wrapper::start_time()']]], ['status',['status',['../group__API__Codelet__And__Tasks.html#a8e95db453ef9883d8218bb1d0ee5d9ec',1,'starpu_task']]], ['submit_5ftime',['submit_time',['../group__API__Profiling.html#a085522d0ec2100f68a257012fa61d4ad',1,'starpu_profiling_task_info']]], ['submitted_5fflops',['submitted_flops',['../group__API__SC__Hypervisor.html#a874e7f62575f017b1956e7ec4035514a',1,'sc_hypervisor_wrapper']]], ['sum',['sum',['../group__API__Performance__Model.html#af56989786ce5bcc6b492c8b66667ceb0',1,'starpu_perfmodel_history_entry']]], ['sum2',['sum2',['../group__API__Performance__Model.html#ac91475eb15f733e7609a061467e3a64f',1,'starpu_perfmodel_history_entry']]], ['sumlnx',['sumlnx',['../group__API__Performance__Model.html#adf0699424245c4c15edf7c2ebe94f256',1,'starpu_perfmodel_regression_model']]], ['sumlnx2',['sumlnx2',['../group__API__Performance__Model.html#a70b8ac0b07255f2d6376915f2b5b3241',1,'starpu_perfmodel_regression_model']]], ['sumlnxlny',['sumlnxlny',['../group__API__Performance__Model.html#a37e26dbc03d50d09a18bad125c88988b',1,'starpu_perfmodel_regression_model']]], ['sumlny',['sumlny',['../group__API__Performance__Model.html#ab44cbe4ca7a554b450ef405bf02ca34b',1,'starpu_perfmodel_regression_model']]], ['symbol',['symbol',['../group__API__FxT__Support.html#a746d053a2f7640f00b7e7821f7d69f8f',1,'starpu_fxt_codelet_event::symbol()'],['../group__API__Performance__Model.html#a1bccd05fa3169b783bfd0d7dfbf95d6c',1,'starpu_perfmodel::symbol()']]], ['synchronous',['synchronous',['../group__API__Codelet__And__Tasks.html#abd0c5c3a9df1ac0c30de2b1468cd5993',1,'starpu_task']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_6f.js0000644000373600000000000000016512571536757016675 00000000000000var searchData= [ ['opencl_20extensions',['OpenCL Extensions',['../group__API__OpenCL__Extensions.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_68.html0000644000373600000000000000170412571536757016400 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_69.js0000644000373600000000000000570412571536757016055 00000000000000var searchData= [ ['implicit_20data_20dependencies',['Implicit Data Dependencies',['../group__API__Implicit__Data__Dependencies.html',1,'']]], ['initialization_20and_20termination',['Initialization and Termination',['../group__API__Initialization__and__Termination.html',1,'']]], ['insert_5ftask',['Insert_Task',['../group__API__Insert__Task.html',1,'']]], ['id',['id',['../group__API__Initialization__and__Termination.html#ad8d6e8261ac90dcdda4ec2704ee908d3',1,'starpu_driver::id()'],['../group__API__StarPUTop__Interface.html#aeb466ce65ed83d91c0d06bdcc32b1f76',1,'starpu_top_data::id()'],['../group__API__StarPUTop__Interface.html#a78d99fce4c885b7c3def42e22b737761',1,'starpu_top_param::id()']]], ['idle_5fstart_5ftime',['idle_start_time',['../group__API__SC__Hypervisor.html#a15b7572ea77ba649646ea7a2e618c708',1,'sc_hypervisor_wrapper']]], ['idle_5ftime',['idle_time',['../group__API__SC__Hypervisor.html#a8ddc223936bf073c6de110cf4cb9fcb3',1,'sc_hypervisor_wrapper']]], ['introduction',['Introduction',['../index.html',1,'']]], ['init',['init',['../group__API__Workers__Properties.html#aa0b9cbfd6d6a0e186385c034b8dd1112',1,'starpu_worker_collection']]], ['init_5fiterator',['init_iterator',['../group__API__Workers__Properties.html#a4b0467fc504cec52ffd7b297e4f39429',1,'starpu_worker_collection']]], ['init_5fsched',['init_sched',['../group__API__Scheduling__Policy.html#a41e6bddc19a16c514c3bd16df0c7d50f',1,'starpu_sched_policy']]], ['int_5fmax_5fvalue',['int_max_value',['../group__API__StarPUTop__Interface.html#ab6f65000e0bc138df2fb8a89bac4609c',1,'starpu_top_data::int_max_value()'],['../group__API__StarPUTop__Interface.html#abb33120024eeed47085170503792cc2e',1,'starpu_top_param::int_max_value()']]], ['int_5fmin_5fvalue',['int_min_value',['../group__API__StarPUTop__Interface.html#aef3ff2f1573929ceb2b43088892bdeb0',1,'starpu_top_data::int_min_value()'],['../group__API__StarPUTop__Interface.html#a9b1a3f02d68e34ca66619850ccf68cd6',1,'starpu_top_param::int_min_value()']]], ['interface_5fsize',['interface_size',['../group__API__Data__Interfaces.html#a5afa1ac2a0d8f8d6ac12ce1913bc7748',1,'starpu_data_interface_ops']]], ['interfaceid',['interfaceid',['../group__API__Data__Interfaces.html#a052d1a3cb569a08c206310ccfffa493c',1,'starpu_data_interface_ops']]], ['interfaces',['interfaces',['../group__API__Codelet__And__Tasks.html#ae66c4454e0a376d1fc7dc307b00a03fd',1,'starpu_task']]], ['is_5floaded',['is_loaded',['../group__API__Performance__Model.html#a39010052175b669071eceb6d5c5dad6d',1,'starpu_perfmodel']]], ['is_5fmultiformat',['is_multiformat',['../group__API__Data__Interfaces.html#a191bf441e84e8aca7ef8f53f163b089e',1,'starpu_data_interface_ops']]], ['ispeed_5fctx_5fsample',['ispeed_ctx_sample',['../group__API__SC__Hypervisor.html#a111f937e2d3126fe9fef849ac6796147',1,'sc_hypervisor_policy_config']]], ['ispeed_5fw_5fsample',['ispeed_w_sample',['../group__API__SC__Hypervisor.html#acacb7cb4b04509ac0f912f1cf65661d4',1,'sc_hypervisor_policy_config']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_6d.js0000644000373600000000000000012512571536757016447 00000000000000var searchData= [ ['mpi_20support',['MPI Support',['../MPISupport.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_6e.js0000644000373600000000000001357412571536757017335 00000000000000var searchData= [ ['n',['n',['../group__API__SC__Hypervisor.html#a742686cd824c01df912c4443f57f0d57',1,'sc_hypervisor_policy_task_pool']]], ['n_5fnot_5flaunched_5fdrivers',['n_not_launched_drivers',['../group__API__Initialization__and__Termination.html#a1a6411908ca8435f6440863f1a6e1e6d',1,'starpu_conf']]], ['n_5fvalues',['n_values',['../group__API__Data__Interfaces.html#a2af2ce4c2c53372a2b2fd0a85c194bca',1,'starpu_coo_interface']]], ['name',['name',['../group__API__Codelet__And__Tasks.html#ad5706d98c7ae2e9eea7d51e55930b7f2',1,'starpu_codelet::name()'],['../group__API__StarPUTop__Interface.html#a82d9700185ed03e6237057197960c90c',1,'starpu_top_data::name()'],['../group__API__StarPUTop__Interface.html#a495c93749e4b59649881abf99abab6f8',1,'starpu_top_param::name()'],['../group__API__SC__Hypervisor.html#a411c84854af7ba5a563050c22ed65d24',1,'sc_hypervisor_policy::name()']]], ['nb_5fvalues',['nb_values',['../group__API__StarPUTop__Interface.html#a50b12c43152cde90bba048ba831ab5cd',1,'starpu_top_param']]], ['nbuffers',['nbuffers',['../group__API__Codelet__And__Tasks.html#af06a8c62acd44734a840111f4dbad5af',1,'starpu_codelet']]], ['nchildren',['nchildren',['../group__API__Data__Partition.html#a49c588461d3b969bc56529586c541e16',1,'starpu_data_filter']]], ['ncpus',['ncpus',['../group__API__Initialization__and__Termination.html#ad80547a4eec7864413fda1f3aecd0726',1,'starpu_conf']]], ['ncuda',['ncuda',['../group__API__Initialization__and__Termination.html#aee2b4473a78f8315060241a8555a4b85',1,'starpu_conf']]], ['new_5fworkers_5fmax_5fidle',['new_workers_max_idle',['../group__API__SC__Hypervisor.html#a154dac023379e94c0a04efdd822a3e50',1,'sc_hypervisor_policy_config']]], ['next',['next',['../group__API__Performance__Model.html#a64438e798293c158b2af20143dbbf303',1,'starpu_perfmodel_history_list::next()'],['../group__API__Codelet__And__Tasks.html#a4c04ba83a7b284519ff99d7c9770a0ca',1,'starpu_task::next()'],['../group__API__StarPUTop__Interface.html#a11cb129a57cc13f192cf1527bece9159',1,'starpu_top_data::next()'],['../group__API__StarPUTop__Interface.html#a0474967a5f8c3a6c8d15b6096cf2199f',1,'starpu_top_param::next()'],['../group__API__SC__Hypervisor.html#a1063b7c16ddaeab110882a8dbdb7e9da',1,'sc_hypervisor_policy_task_pool::next()']]], ['nl_5fvalid',['nl_valid',['../group__API__Performance__Model.html#a0dfad26b1930921b00c640a2ae3b5ff3',1,'starpu_perfmodel_regression_model']]], ['nmoved_5fworkers',['nmoved_workers',['../group__API__SC__Hypervisor.html#a4e24e8772a56d038634be9302eb9e93c',1,'sc_hypervisor_resize_ack']]], ['nnz',['nnz',['../group__API__Data__Interfaces.html#af627696926d68201dc615b9fdb56dae4',1,'starpu_csr_interface::nnz()'],['../group__API__Data__Interfaces.html#a8b12aea1a96b9cf5ef80fc35edce2b25',1,'starpu_bcsr_interface::nnz()']]], ['nodes',['nodes',['../group__API__Codelet__And__Tasks.html#ad8ec66d2a97fd9f9894ebebf0e11696c',1,'starpu_codelet']]], ['nopencl',['nopencl',['../group__API__Initialization__and__Termination.html#a5c53d39d5dc8e25f5bf08408a8214b11',1,'starpu_conf']]], ['not_5flaunched_5fdrivers',['not_launched_drivers',['../group__API__Initialization__and__Termination.html#add2fde12ef5ffa49901d89592c0e9d8c',1,'starpu_conf']]], ['notify_5fdelete_5fcontext',['notify_delete_context',['../group__API__Scheduling__Contexts.html#a1907617128c71feb1e383ae2dec60f36',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fidle_5fcycle',['notify_idle_cycle',['../group__API__Scheduling__Contexts.html#a60e61f9fb90abd275d50af108d3206d9',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fpoped_5ftask',['notify_poped_task',['../group__API__Scheduling__Contexts.html#a9754612760748ffcdb8a14c4972715a6',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fpushed_5ftask',['notify_pushed_task',['../group__API__Scheduling__Contexts.html#ad87ec8e3ebccf73e5e77e4ab3eebbdcb',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fsubmitted_5fjob',['notify_submitted_job',['../group__API__Scheduling__Contexts.html#a3346cdf7b6e0b8387afb897e7a9614b9',1,'starpu_sched_ctx_performance_counters']]], ['nrow',['nrow',['../group__API__Data__Interfaces.html#aae07b9566de37485d4a4f3edb54bbb01',1,'starpu_csr_interface::nrow()'],['../group__API__Data__Interfaces.html#ab77841397a2eb72c572a1a374133864b',1,'starpu_bcsr_interface::nrow()']]], ['nsample',['nsample',['../group__API__Performance__Model.html#a42b7c84a6edc8b6337194d210bea8c42',1,'starpu_perfmodel_history_entry::nsample()'],['../group__API__Performance__Model.html#a430604235277a2c92997f5189333269e',1,'starpu_perfmodel_regression_model::nsample()']]], ['nworkers',['nworkers',['../group__API__FxT__Support.html#aad91dca632d0e97ab222b294bb638e69',1,'starpu_fxt_options::nworkers()'],['../group__API__Workers__Properties.html#abaf37a6f1ce0271dab7489336b601268',1,'starpu_worker_collection::nworkers()']]], ['nx',['nx',['../group__API__Data__Interfaces.html#aefb2fcff74bb7ca5583a46c75102f3e0',1,'starpu_matrix_interface::nx()'],['../group__API__Data__Interfaces.html#ad7fff60b638d86b94565cf38f5799f12',1,'starpu_coo_interface::nx()'],['../group__API__Data__Interfaces.html#ab2a07816fdda4a1ea36ff3a6dbaa9516',1,'starpu_block_interface::nx()'],['../group__API__Data__Interfaces.html#af1c0b7ec2bf4efc247c62923018bba12',1,'starpu_vector_interface::nx()']]], ['ny',['ny',['../group__API__Data__Interfaces.html#a8dfcab90696c46e2918b514bbf922dbd',1,'starpu_matrix_interface::ny()'],['../group__API__Data__Interfaces.html#a0708fb43717cf94a1d74dc2914028d4a',1,'starpu_coo_interface::ny()'],['../group__API__Data__Interfaces.html#a6b20ce3775b718eec3c5bfee9392b1b1',1,'starpu_block_interface::ny()']]], ['nz',['nz',['../group__API__Data__Interfaces.html#aafc645cc0795d8924314ad8fec15cb28',1,'starpu_block_interface']]], ['nzval',['nzval',['../group__API__Data__Interfaces.html#ad4e33e8dcacfc25744db68c2e035fb52',1,'starpu_csr_interface::nzval()'],['../group__API__Data__Interfaces.html#ae3a0773ec9de2388de5cffe04a4ad4fd',1,'starpu_bcsr_interface::nzval()']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_74.js0000644000373600000000000000042512571536757016373 00000000000000var searchData= [ ['the_20gnu_20free_20documentation_20license',['The GNU Free Documentation License',['../GNUFreeDocumentationLicense.html',1,'']]], ['tips_20and_20tricks_20to_20know_20about',['Tips and Tricks To Know About',['../TipsAndTricksToKnowAbout.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_69.html0000644000373600000000000000170612571536757016732 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_67.html0000644000373600000000000000171212571536757017576 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_6c.html0000644000373600000000000000170412571536757016453 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_62.js0000644000373600000000000000145112571536757017241 00000000000000var searchData= [ ['b',['b',['../group__API__Performance__Model.html#a8f295e115b5aa963a5ceadaa9914a5b1',1,'starpu_perfmodel_regression_model']]], ['benchmarking',['benchmarking',['../group__API__Performance__Model.html#ae422818443d7dd3a83b44cee31d5b319',1,'starpu_perfmodel']]], ['beta',['beta',['../group__API__Performance__Model.html#a987642ec52d30357ff2fa05044f9dd60',1,'starpu_perfmodel_regression_model']]], ['buffers',['buffers',['../group__API__Codelet__And__Tasks.html#a46d6f70c2999e09ad55c7c26eb25d830',1,'starpu_task']]], ['bundle',['bundle',['../group__API__Codelet__And__Tasks.html#a8312a98be5bd9e11bc40f820a65fbc51',1,'starpu_task']]], ['bus_5fcalibrate',['bus_calibrate',['../group__API__Initialization__and__Termination.html#ae3635b9acce7a279cae7f645bcd9fffb',1,'starpu_conf']]] ]; starpu-1.1.5/doc/doxygen/html/search/enumvalues_74.js0000644000373600000000000000235012571536757017457 00000000000000var searchData= [ ['top_5ftype_5fcontinue',['TOP_TYPE_CONTINUE',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52a9dad9fc65f92a2ece0935fd17ca0b1a6',1,'starpu_top.h']]], ['top_5ftype_5fdebug',['TOP_TYPE_DEBUG',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52a952a3745b30ea9defd6b4e397fe7bcc6',1,'starpu_top.h']]], ['top_5ftype_5fdisable',['TOP_TYPE_DISABLE',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52ae0d6282a934eccc5bfee15a5657ce69a',1,'starpu_top.h']]], ['top_5ftype_5fenable',['TOP_TYPE_ENABLE',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52ad2658f645e029c0013185fd47bb99cbd',1,'starpu_top.h']]], ['top_5ftype_5fgo',['TOP_TYPE_GO',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52a2980d96d782513d6a2ba7e320e4b67f9',1,'starpu_top.h']]], ['top_5ftype_5fset',['TOP_TYPE_SET',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52a3c1b1dcb8ad446753dbde70039aac0e5',1,'starpu_top.h']]], ['top_5ftype_5funknow',['TOP_TYPE_UNKNOW',['../group__API__StarPUTop__Interface.html#gga568af4507d96390316b93c92fee45f52a49307bcbda7b5b9e34e0fd76fea2a372',1,'starpu_top.h']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_6e.js0000644000373600000000000001357412571536757016135 00000000000000var searchData= [ ['n',['n',['../group__API__SC__Hypervisor.html#a742686cd824c01df912c4443f57f0d57',1,'sc_hypervisor_policy_task_pool']]], ['n_5fnot_5flaunched_5fdrivers',['n_not_launched_drivers',['../group__API__Initialization__and__Termination.html#a1a6411908ca8435f6440863f1a6e1e6d',1,'starpu_conf']]], ['n_5fvalues',['n_values',['../group__API__Data__Interfaces.html#a2af2ce4c2c53372a2b2fd0a85c194bca',1,'starpu_coo_interface']]], ['name',['name',['../group__API__Codelet__And__Tasks.html#ad5706d98c7ae2e9eea7d51e55930b7f2',1,'starpu_codelet::name()'],['../group__API__StarPUTop__Interface.html#a82d9700185ed03e6237057197960c90c',1,'starpu_top_data::name()'],['../group__API__StarPUTop__Interface.html#a495c93749e4b59649881abf99abab6f8',1,'starpu_top_param::name()'],['../group__API__SC__Hypervisor.html#a411c84854af7ba5a563050c22ed65d24',1,'sc_hypervisor_policy::name()']]], ['nb_5fvalues',['nb_values',['../group__API__StarPUTop__Interface.html#a50b12c43152cde90bba048ba831ab5cd',1,'starpu_top_param']]], ['nbuffers',['nbuffers',['../group__API__Codelet__And__Tasks.html#af06a8c62acd44734a840111f4dbad5af',1,'starpu_codelet']]], ['nchildren',['nchildren',['../group__API__Data__Partition.html#a49c588461d3b969bc56529586c541e16',1,'starpu_data_filter']]], ['ncpus',['ncpus',['../group__API__Initialization__and__Termination.html#ad80547a4eec7864413fda1f3aecd0726',1,'starpu_conf']]], ['ncuda',['ncuda',['../group__API__Initialization__and__Termination.html#aee2b4473a78f8315060241a8555a4b85',1,'starpu_conf']]], ['new_5fworkers_5fmax_5fidle',['new_workers_max_idle',['../group__API__SC__Hypervisor.html#a154dac023379e94c0a04efdd822a3e50',1,'sc_hypervisor_policy_config']]], ['next',['next',['../group__API__Performance__Model.html#a64438e798293c158b2af20143dbbf303',1,'starpu_perfmodel_history_list::next()'],['../group__API__Codelet__And__Tasks.html#a4c04ba83a7b284519ff99d7c9770a0ca',1,'starpu_task::next()'],['../group__API__StarPUTop__Interface.html#a11cb129a57cc13f192cf1527bece9159',1,'starpu_top_data::next()'],['../group__API__StarPUTop__Interface.html#a0474967a5f8c3a6c8d15b6096cf2199f',1,'starpu_top_param::next()'],['../group__API__SC__Hypervisor.html#a1063b7c16ddaeab110882a8dbdb7e9da',1,'sc_hypervisor_policy_task_pool::next()']]], ['nl_5fvalid',['nl_valid',['../group__API__Performance__Model.html#a0dfad26b1930921b00c640a2ae3b5ff3',1,'starpu_perfmodel_regression_model']]], ['nmoved_5fworkers',['nmoved_workers',['../group__API__SC__Hypervisor.html#a4e24e8772a56d038634be9302eb9e93c',1,'sc_hypervisor_resize_ack']]], ['nnz',['nnz',['../group__API__Data__Interfaces.html#af627696926d68201dc615b9fdb56dae4',1,'starpu_csr_interface::nnz()'],['../group__API__Data__Interfaces.html#a8b12aea1a96b9cf5ef80fc35edce2b25',1,'starpu_bcsr_interface::nnz()']]], ['nodes',['nodes',['../group__API__Codelet__And__Tasks.html#ad8ec66d2a97fd9f9894ebebf0e11696c',1,'starpu_codelet']]], ['nopencl',['nopencl',['../group__API__Initialization__and__Termination.html#a5c53d39d5dc8e25f5bf08408a8214b11',1,'starpu_conf']]], ['not_5flaunched_5fdrivers',['not_launched_drivers',['../group__API__Initialization__and__Termination.html#add2fde12ef5ffa49901d89592c0e9d8c',1,'starpu_conf']]], ['notify_5fdelete_5fcontext',['notify_delete_context',['../group__API__Scheduling__Contexts.html#a1907617128c71feb1e383ae2dec60f36',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fidle_5fcycle',['notify_idle_cycle',['../group__API__Scheduling__Contexts.html#a60e61f9fb90abd275d50af108d3206d9',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fpoped_5ftask',['notify_poped_task',['../group__API__Scheduling__Contexts.html#a9754612760748ffcdb8a14c4972715a6',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fpushed_5ftask',['notify_pushed_task',['../group__API__Scheduling__Contexts.html#ad87ec8e3ebccf73e5e77e4ab3eebbdcb',1,'starpu_sched_ctx_performance_counters']]], ['notify_5fsubmitted_5fjob',['notify_submitted_job',['../group__API__Scheduling__Contexts.html#a3346cdf7b6e0b8387afb897e7a9614b9',1,'starpu_sched_ctx_performance_counters']]], ['nrow',['nrow',['../group__API__Data__Interfaces.html#aae07b9566de37485d4a4f3edb54bbb01',1,'starpu_csr_interface::nrow()'],['../group__API__Data__Interfaces.html#ab77841397a2eb72c572a1a374133864b',1,'starpu_bcsr_interface::nrow()']]], ['nsample',['nsample',['../group__API__Performance__Model.html#a42b7c84a6edc8b6337194d210bea8c42',1,'starpu_perfmodel_history_entry::nsample()'],['../group__API__Performance__Model.html#a430604235277a2c92997f5189333269e',1,'starpu_perfmodel_regression_model::nsample()']]], ['nworkers',['nworkers',['../group__API__FxT__Support.html#aad91dca632d0e97ab222b294bb638e69',1,'starpu_fxt_options::nworkers()'],['../group__API__Workers__Properties.html#abaf37a6f1ce0271dab7489336b601268',1,'starpu_worker_collection::nworkers()']]], ['nx',['nx',['../group__API__Data__Interfaces.html#aefb2fcff74bb7ca5583a46c75102f3e0',1,'starpu_matrix_interface::nx()'],['../group__API__Data__Interfaces.html#ad7fff60b638d86b94565cf38f5799f12',1,'starpu_coo_interface::nx()'],['../group__API__Data__Interfaces.html#ab2a07816fdda4a1ea36ff3a6dbaa9516',1,'starpu_block_interface::nx()'],['../group__API__Data__Interfaces.html#af1c0b7ec2bf4efc247c62923018bba12',1,'starpu_vector_interface::nx()']]], ['ny',['ny',['../group__API__Data__Interfaces.html#a8dfcab90696c46e2918b514bbf922dbd',1,'starpu_matrix_interface::ny()'],['../group__API__Data__Interfaces.html#a0708fb43717cf94a1d74dc2914028d4a',1,'starpu_coo_interface::ny()'],['../group__API__Data__Interfaces.html#a6b20ce3775b718eec3c5bfee9392b1b1',1,'starpu_block_interface::ny()']]], ['nz',['nz',['../group__API__Data__Interfaces.html#aafc645cc0795d8924314ad8fec15cb28',1,'starpu_block_interface']]], ['nzval',['nzval',['../group__API__Data__Interfaces.html#ad4e33e8dcacfc25744db68c2e035fb52',1,'starpu_csr_interface::nzval()'],['../group__API__Data__Interfaces.html#ae3a0773ec9de2388de5cffe04a4ad4fd',1,'starpu_bcsr_interface::nzval()']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_76.js0000644000373600000000000000073712571536757016054 00000000000000var searchData= [ ['versioning',['Versioning',['../group__API__Versioning.html',1,'']]], ['valid',['valid',['../group__API__Performance__Model.html#a6f08efd7380b81cb59ede878a33bd5fa',1,'starpu_perfmodel_regression_model']]], ['value',['value',['../group__API__StarPUTop__Interface.html#a5353f4bb17f42b4bdb1052d0e24c9f66',1,'starpu_top_param']]], ['values',['values',['../group__API__Data__Interfaces.html#a467d82e68a55c78a64bddbe2885fb8bb',1,'starpu_coo_interface']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_77.js0000644000373600000000000000020412571536757016611 00000000000000var searchData= [ ['workers_e2_80_99_20properties',['Workers’ Properties',['../group__API__Workers__Properties.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/groups_73.html0000644000373600000000000000170712571536757017146 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_66.html0000644000373600000000000000170412571536757016376 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_69.js0000644000373600000000000000012012571536757016367 00000000000000var searchData= [ ['introduction',['Introduction',['../index.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/typedefs_73.js0000644000373600000000000000164112571536757017117 00000000000000var searchData= [ ['starpu_5fcpu_5ffunc_5ft',['starpu_cpu_func_t',['../group__API__Codelet__And__Tasks.html#ga8a4fb4a4c3d4b96159949bda6b235c1f',1,'starpu_task.h']]], ['starpu_5fcuda_5ffunc_5ft',['starpu_cuda_func_t',['../group__API__Codelet__And__Tasks.html#ga54f6cb6c50dab31bd1d0aaa7f7f3c10b',1,'starpu_task.h']]], ['starpu_5fdata_5fhandle_5ft',['starpu_data_handle_t',['../group__API__Data__Management.html#ga5f517ab725864d54b0459896a8f8ae07',1,'starpu_data.h']]], ['starpu_5fopencl_5ffunc_5ft',['starpu_opencl_func_t',['../group__API__Codelet__And__Tasks.html#ga5580d9f3ee1cf070e0bdca49534fecde',1,'starpu_task.h']]], ['starpu_5ftag_5ft',['starpu_tag_t',['../group__API__Explicit__Dependencies.html#ga6e19fdd4a84d04323ee05e9b7ec5990e',1,'starpu_task.h']]], ['starpu_5ftask_5fbundle_5ft',['starpu_task_bundle_t',['../group__API__Task__Bundles.html#ga1be1e845a54cec05cbc371d1f0c9a2e1',1,'starpu_task_bundle.h']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_66.js0000644000373600000000000000375112571536757017252 00000000000000var searchData= [ ['file_5foffset',['file_offset',['../group__API__FxT__Support.html#a2c88f17ee1053748a665fddd7949a1c1',1,'starpu_fxt_options']]], ['file_5fprefix',['file_prefix',['../group__API__FxT__Support.html#a0a0ec99a90cdf9fbcec8d1baeef5c894',1,'starpu_fxt_options']]], ['file_5frank',['file_rank',['../group__API__FxT__Support.html#ac37b89720a69aa1bf0b2a34b750f8852',1,'starpu_fxt_options']]], ['filter_5farg',['filter_arg',['../group__API__Data__Partition.html#ab23212cd9e3b4773bfbd347fe75a0d30',1,'starpu_data_filter']]], ['filter_5farg_5fptr',['filter_arg_ptr',['../group__API__Data__Partition.html#a68640e2bb6feec9f179923bcb86e26c9',1,'starpu_data_filter']]], ['filter_5ffunc',['filter_func',['../group__API__Data__Partition.html#a931b8b5df9714049dd98532d00134141',1,'starpu_data_filter']]], ['firstentry',['firstentry',['../group__API__Data__Interfaces.html#af73b9c9306e897f7efb81d2daee8420f',1,'starpu_csr_interface::firstentry()'],['../group__API__Data__Interfaces.html#aea8014509eb5d21ba81d400c877d6d8c',1,'starpu_bcsr_interface::firstentry()']]], ['fixed_5fworkers',['fixed_workers',['../group__API__SC__Hypervisor.html#aee28c4abb71f645cb48edf4677366742',1,'sc_hypervisor_policy_config']]], ['flops',['flops',['../group__API__Performance__Model.html#a0549a4d3088675455ebed1b268324fee',1,'starpu_perfmodel_history_entry::flops()'],['../group__API__Codelet__And__Tasks.html#a3ff361225beaf58ec1ea6dc254ca2b46',1,'starpu_task::flops()']]], ['footprint',['footprint',['../group__API__Data__Interfaces.html#a3fa55c40ad905c7fcdada3be42094396',1,'starpu_data_interface_ops::footprint()'],['../group__API__Performance__Model.html#a8b0cfe33d3ee04badaad8ff136256d2b',1,'starpu_perfmodel_history_entry::footprint()'],['../group__API__SC__Hypervisor.html#a2b49b6e39b8b0882bc5fc0f2aee71f66',1,'sc_hypervisor_policy_task_pool::footprint()']]], ['free_5fdata_5fon_5fnode',['free_data_on_node',['../group__API__Data__Interfaces.html#a34fbb1ba657afffa329d58174837494d',1,'starpu_data_interface_ops']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_6c.html0000644000373600000000000000171212571536757017652 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_64.html0000644000373600000000000000170612571536757016725 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_70.html0000644000373600000000000000170612571536757016722 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_76.html0000644000373600000000000000170412571536757016377 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/all_75.html0000644000373600000000000000170412571536757016376 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_66.html0000644000373600000000000000170612571536757016727 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_64.js0000644000373600000000000000013512571536757016370 00000000000000var searchData= [ ['deprecated_20list',['Deprecated List',['../deprecated.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_69.html0000644000373600000000000000171212571536757017600 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/files_73.js0000644000373600000000000000620312571536757016375 00000000000000var searchData= [ ['sc_5fhypervisor_2eh',['sc_hypervisor.h',['../sc__hypervisor_8h.html',1,'']]], ['sc_5fhypervisor_5fconfig_2eh',['sc_hypervisor_config.h',['../sc__hypervisor__config_8h.html',1,'']]], ['sc_5fhypervisor_5flp_2eh',['sc_hypervisor_lp.h',['../sc__hypervisor__lp_8h.html',1,'']]], ['sc_5fhypervisor_5fmonitoring_2eh',['sc_hypervisor_monitoring.h',['../sc__hypervisor__monitoring_8h.html',1,'']]], ['sc_5fhypervisor_5fpolicy_2eh',['sc_hypervisor_policy.h',['../sc__hypervisor__policy_8h.html',1,'']]], ['starpu_2eh',['starpu.h',['../starpu_8h.html',1,'']]], ['starpu_5fbound_2eh',['starpu_bound.h',['../starpu__bound_8h.html',1,'']]], ['starpu_5fconfig_2eh',['starpu_config.h',['../starpu__config_8h.html',1,'']]], ['starpu_5fcublas_2eh',['starpu_cublas.h',['../starpu__cublas_8h.html',1,'']]], ['starpu_5fcuda_2eh',['starpu_cuda.h',['../starpu__cuda_8h.html',1,'']]], ['starpu_5fdata_2eh',['starpu_data.h',['../starpu__data_8h.html',1,'']]], ['starpu_5fdata_5ffilters_2eh',['starpu_data_filters.h',['../starpu__data__filters_8h.html',1,'']]], ['starpu_5fdata_5finterfaces_2eh',['starpu_data_interfaces.h',['../starpu__data__interfaces_8h.html',1,'']]], ['starpu_5fdeprecated_5fapi_2eh',['starpu_deprecated_api.h',['../starpu__deprecated__api_8h.html',1,'']]], ['starpu_5fdriver_2eh',['starpu_driver.h',['../starpu__driver_8h.html',1,'']]], ['starpu_5fexpert_2eh',['starpu_expert.h',['../starpu__expert_8h.html',1,'']]], ['starpu_5ffxt_2eh',['starpu_fxt.h',['../starpu__fxt_8h.html',1,'']]], ['starpu_5fhash_2eh',['starpu_hash.h',['../starpu__hash_8h.html',1,'']]], ['starpu_5fmpi_2eh',['starpu_mpi.h',['../starpu__mpi_8h.html',1,'']]], ['starpu_5fopencl_2eh',['starpu_opencl.h',['../starpu__opencl_8h.html',1,'']]], ['starpu_5fperfmodel_2eh',['starpu_perfmodel.h',['../starpu__perfmodel_8h.html',1,'']]], ['starpu_5fprofiling_2eh',['starpu_profiling.h',['../starpu__profiling_8h.html',1,'']]], ['starpu_5frand_2eh',['starpu_rand.h',['../starpu__rand_8h.html',1,'']]], ['starpu_5fsched_5fctx_2eh',['starpu_sched_ctx.h',['../starpu__sched__ctx_8h.html',1,'']]], ['starpu_5fsched_5fctx_5fhypervisor_2eh',['starpu_sched_ctx_hypervisor.h',['../starpu__sched__ctx__hypervisor_8h.html',1,'']]], ['starpu_5fscheduler_2eh',['starpu_scheduler.h',['../starpu__scheduler_8h.html',1,'']]], ['starpu_5fstdlib_2eh',['starpu_stdlib.h',['../starpu__stdlib_8h.html',1,'']]], ['starpu_5ftask_2eh',['starpu_task.h',['../starpu__task_8h.html',1,'']]], ['starpu_5ftask_5fbundle_2eh',['starpu_task_bundle.h',['../starpu__task__bundle_8h.html',1,'']]], ['starpu_5ftask_5flist_2eh',['starpu_task_list.h',['../starpu__task__list_8h.html',1,'']]], ['starpu_5ftask_5futil_2eh',['starpu_task_util.h',['../starpu__task__util_8h.html',1,'']]], ['starpu_5fthread_2eh',['starpu_thread.h',['../starpu__thread_8h.html',1,'']]], ['starpu_5fthread_5futil_2eh',['starpu_thread_util.h',['../starpu__thread__util_8h.html',1,'']]], ['starpu_5ftop_2eh',['starpu_top.h',['../starpu__top_8h.html',1,'']]], ['starpu_5futil_2eh',['starpu_util.h',['../starpu__util_8h.html',1,'']]], ['starpu_5fworker_2eh',['starpu_worker.h',['../starpu__worker_8h.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_73.html0000644000373600000000000000170612571536757016725 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_77.html0000644000373600000000000000171212571536757017577 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_6d.js0000644000373600000000000000051712571536757016674 00000000000000var searchData= [ ['miscellaneous_20helpers',['Miscellaneous Helpers',['../group__API__Miscellaneous__Helpers.html',1,'']]], ['mpi_20support',['MPI Support',['../group__API__MPI__Support.html',1,'']]], ['multiformat_20data_20interface',['Multiformat Data Interface',['../group__API__Multiformat__Data__Interface.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/pages_63.js0000644000373600000000000000030312571536757016364 00000000000000var searchData= [ ['c_20extensions',['C Extensions',['../cExtensions.html',1,'']]], ['compilation_20configuration',['Compilation Configuration',['../CompilationConfiguration.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_6d.js0000644000373600000000000000512112571536757016121 00000000000000var searchData= [ ['miscellaneous_20helpers',['Miscellaneous Helpers',['../group__API__Miscellaneous__Helpers.html',1,'']]], ['mpi_20support',['MPI Support',['../group__API__MPI__Support.html',1,'']]], ['multiformat_20data_20interface',['Multiformat Data Interface',['../group__API__Multiformat__Data__Interface.html',1,'']]], ['magic',['magic',['../group__API__Initialization__and__Termination.html#a6dab9683bf733062e75a46f91b04abd2',1,'starpu_conf::magic()'],['../group__API__Codelet__And__Tasks.html#a9e31b78009fc1e16cb909ffcd83610fa',1,'starpu_task::magic()']]], ['max_5fidle',['max_idle',['../group__API__SC__Hypervisor.html#a6a36830f17ce8f284c3543aafdc49b79',1,'sc_hypervisor_policy_config']]], ['max_5fnworkers',['max_nworkers',['../group__API__SC__Hypervisor.html#a9f31e224b7b8f06edfe2d31cafd40139',1,'sc_hypervisor_policy_config']]], ['max_5fparallelism',['max_parallelism',['../group__API__Codelet__And__Tasks.html#a8828a68f0322f26d2b6f4ed1244dee6f',1,'starpu_codelet']]], ['maxx',['maxx',['../group__API__Performance__Model.html#aa6f114dc3a7a3925604180a6e6c0f9ea',1,'starpu_perfmodel_regression_model']]], ['mean',['mean',['../group__API__Performance__Model.html#a2ffd5e6b2827c53defd1fca3d9ccce43',1,'starpu_perfmodel_history_entry']]], ['mf_5fskip',['mf_skip',['../group__API__Codelet__And__Tasks.html#ae119d876d9d9024e448e235c49edda16',1,'starpu_task']]], ['min_5fnworkers',['min_nworkers',['../group__API__SC__Hypervisor.html#a309596658ce45de36fc2871a6df4d282',1,'sc_hypervisor_policy_config']]], ['min_5fworking',['min_working',['../group__API__SC__Hypervisor.html#a4b4cf5e2b01c071cb5451bca3446c941',1,'sc_hypervisor_policy_config']]], ['minx',['minx',['../group__API__Performance__Model.html#acc228f5c071236ef0f0b6cfada7a232f',1,'starpu_perfmodel_regression_model']]], ['mode',['mode',['../group__API__Codelet__And__Tasks.html#addc6865102814bf740ec2ec14a227c4a',1,'starpu_data_descr']]], ['model',['model',['../group__API__Codelet__And__Tasks.html#a849d672b19f7d4a9499f69642ef51d79',1,'starpu_codelet']]], ['model_5frwlock',['model_rwlock',['../group__API__Performance__Model.html#a17f51ebd11348c8f614e1c9eda9bd4a1',1,'starpu_perfmodel']]], ['modes',['modes',['../group__API__Codelet__And__Tasks.html#ad078047d7845a4cf7a109e40cb5376ec',1,'starpu_codelet']]], ['moved_5fworkers',['moved_workers',['../group__API__SC__Hypervisor.html#acd68e423efe1271125432108dd44e13a',1,'sc_hypervisor_resize_ack']]], ['mpi_20support',['MPI Support',['../MPISupport.html',1,'']]], ['mutex',['mutex',['../group__API__SC__Hypervisor.html#ab0df538a6d83e44b6e9390fab1c0a7a5',1,'sc_hypervisor_wrapper']]] ]; starpu-1.1.5/doc/doxygen/html/search/enumvalues_74.html0000644000373600000000000000171312571536757020011 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_73.html0000644000373600000000000000171212571536757017573 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/classes_74.html0000644000373600000000000000171012571536757017257 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/variables_75.html0000644000373600000000000000171212571536757017575 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/pages_68.html0000644000373600000000000000170612571536757016731 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_70.html0000644000373600000000000000170712571536757017143 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/search/groups_76.js0000644000373600000000000000013512571536757016613 00000000000000var searchData= [ ['versioning',['Versioning',['../group__API__Versioning.html',1,'']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_69.js0000644000373600000000000000505712571536757017256 00000000000000var searchData= [ ['id',['id',['../group__API__Initialization__and__Termination.html#ad8d6e8261ac90dcdda4ec2704ee908d3',1,'starpu_driver::id()'],['../group__API__StarPUTop__Interface.html#aeb466ce65ed83d91c0d06bdcc32b1f76',1,'starpu_top_data::id()'],['../group__API__StarPUTop__Interface.html#a78d99fce4c885b7c3def42e22b737761',1,'starpu_top_param::id()']]], ['idle_5fstart_5ftime',['idle_start_time',['../group__API__SC__Hypervisor.html#a15b7572ea77ba649646ea7a2e618c708',1,'sc_hypervisor_wrapper']]], ['idle_5ftime',['idle_time',['../group__API__SC__Hypervisor.html#a8ddc223936bf073c6de110cf4cb9fcb3',1,'sc_hypervisor_wrapper']]], ['init',['init',['../group__API__Workers__Properties.html#aa0b9cbfd6d6a0e186385c034b8dd1112',1,'starpu_worker_collection']]], ['init_5fiterator',['init_iterator',['../group__API__Workers__Properties.html#a4b0467fc504cec52ffd7b297e4f39429',1,'starpu_worker_collection']]], ['init_5fsched',['init_sched',['../group__API__Scheduling__Policy.html#a41e6bddc19a16c514c3bd16df0c7d50f',1,'starpu_sched_policy']]], ['int_5fmax_5fvalue',['int_max_value',['../group__API__StarPUTop__Interface.html#ab6f65000e0bc138df2fb8a89bac4609c',1,'starpu_top_data::int_max_value()'],['../group__API__StarPUTop__Interface.html#abb33120024eeed47085170503792cc2e',1,'starpu_top_param::int_max_value()']]], ['int_5fmin_5fvalue',['int_min_value',['../group__API__StarPUTop__Interface.html#aef3ff2f1573929ceb2b43088892bdeb0',1,'starpu_top_data::int_min_value()'],['../group__API__StarPUTop__Interface.html#a9b1a3f02d68e34ca66619850ccf68cd6',1,'starpu_top_param::int_min_value()']]], ['interface_5fsize',['interface_size',['../group__API__Data__Interfaces.html#a5afa1ac2a0d8f8d6ac12ce1913bc7748',1,'starpu_data_interface_ops']]], ['interfaceid',['interfaceid',['../group__API__Data__Interfaces.html#a052d1a3cb569a08c206310ccfffa493c',1,'starpu_data_interface_ops']]], ['interfaces',['interfaces',['../group__API__Codelet__And__Tasks.html#ae66c4454e0a376d1fc7dc307b00a03fd',1,'starpu_task']]], ['is_5floaded',['is_loaded',['../group__API__Performance__Model.html#a39010052175b669071eceb6d5c5dad6d',1,'starpu_perfmodel']]], ['is_5fmultiformat',['is_multiformat',['../group__API__Data__Interfaces.html#a191bf441e84e8aca7ef8f53f163b089e',1,'starpu_data_interface_ops']]], ['ispeed_5fctx_5fsample',['ispeed_ctx_sample',['../group__API__SC__Hypervisor.html#a111f937e2d3126fe9fef849ac6796147',1,'sc_hypervisor_policy_config']]], ['ispeed_5fw_5fsample',['ispeed_w_sample',['../group__API__SC__Hypervisor.html#acacb7cb4b04509ac0f912f1cf65661d4',1,'sc_hypervisor_policy_config']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_6f.js0000644000373600000000000000337012571536757017327 00000000000000var searchData= [ ['offset',['offset',['../group__API__Data__Interfaces.html#a40dac9900cbc81a5a7cfac263827b66c',1,'starpu_matrix_interface::offset()'],['../group__API__Data__Interfaces.html#aa3c9580d9f18ef09d128eb61c49456d0',1,'starpu_block_interface::offset()'],['../group__API__Data__Interfaces.html#a0f3335c03646157c15973e58b784ad87',1,'starpu_vector_interface::offset()']]], ['opencl_5felemsize',['opencl_elemsize',['../group__API__Multiformat__Data__Interface.html#a13e0663adec6d682264f032af1d4458f',1,'starpu_multiformat_data_interface_ops']]], ['opencl_5ffunc',['opencl_func',['../group__API__Codelet__And__Tasks.html#a6abec07564f333e308e303e2caf54ec3',1,'starpu_codelet']]], ['opencl_5ffuncs',['opencl_funcs',['../group__API__Codelet__And__Tasks.html#af0d0d3ae164df9993d6d3fec09a1cf33',1,'starpu_codelet']]], ['opencl_5fto_5fcpu_5fcl',['opencl_to_cpu_cl',['../group__API__Multiformat__Data__Interface.html#aa0fde881278fc5ee08d14a2d8a1ccbd7',1,'starpu_multiformat_data_interface_ops']]], ['opencl_5fto_5fcuda',['opencl_to_cuda',['../group__API__Data__Interfaces.html#af737619bef64c788e349858821950705',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fopencl',['opencl_to_opencl',['../group__API__Data__Interfaces.html#a4b5f0bcb9dc7d95fa485059be5dbee5c',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fopencl_5fasync',['opencl_to_opencl_async',['../group__API__Data__Interfaces.html#a5c4d8605f0494f23ed4f3cb93f868e10',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fram',['opencl_to_ram',['../group__API__Data__Interfaces.html#a7779dfce0e5246fb09b34622097445e3',1,'starpu_data_copy_methods']]], ['opencl_5fto_5fram_5fasync',['opencl_to_ram_async',['../group__API__Data__Interfaces.html#ad7974847a7e12a8647e1da0082f480f0',1,'starpu_data_copy_methods']]] ]; starpu-1.1.5/doc/doxygen/html/search/all_70.js0000644000373600000000000001163412571536757016044 00000000000000var searchData= [ ['parallel_20tasks',['Parallel Tasks',['../group__API__Parallel__Tasks.html',1,'']]], ['performance_20model',['Performance Model',['../group__API__Performance__Model.html',1,'']]], ['profiling',['Profiling',['../group__API__Profiling.html',1,'']]], ['pack_5fdata',['pack_data',['../group__API__Data__Interfaces.html#ac0747128bd59d68e272a62aed9712a5d',1,'starpu_data_interface_ops']]], ['per_5farch',['per_arch',['../group__API__Performance__Model.html#a4e2c8fa277de5f8e8a9e20480383be5f',1,'starpu_perfmodel']]], ['per_5fworker_5fstats',['per_worker_stats',['../group__API__Codelet__And__Tasks.html#a56f9d73629bdcdd02b6d6498dce1770d',1,'starpu_codelet']]], ['performance_20feedback',['Performance Feedback',['../PerformanceFeedback.html',1,'']]], ['policy_5fdescription',['policy_description',['../group__API__Scheduling__Policy.html#af6133034b6d7ba8e4424659e485a23b0',1,'starpu_sched_policy']]], ['policy_5fname',['policy_name',['../group__API__Scheduling__Policy.html#a8d617a03c52e74e545bfa609b92f60fc',1,'starpu_sched_policy']]], ['pop_5fend_5ftime',['pop_end_time',['../group__API__Profiling.html#ab6dd82948508b552341be897aa7ceb7c',1,'starpu_profiling_task_info']]], ['pop_5fevery_5ftask',['pop_every_task',['../group__API__Scheduling__Policy.html#aaf958510a708152ea7b4186ce53bf7e7',1,'starpu_sched_policy']]], ['pop_5fstart_5ftime',['pop_start_time',['../group__API__Profiling.html#af86231619c7fe6190480c2ebd9e96cfb',1,'starpu_profiling_task_info']]], ['pop_5ftask',['pop_task',['../group__API__Scheduling__Policy.html#a2bc37d97b0badf9c7e63f4c6d855c806',1,'starpu_sched_policy']]], ['poped_5ftasks',['poped_tasks',['../group__API__SC__Hypervisor.html#a72579a0dddfd47b7908e1b362abb2818',1,'sc_hypervisor_wrapper']]], ['post_5fexec_5fhook',['post_exec_hook',['../group__API__Scheduling__Policy.html#a6cb147fd47ec0cca08c0b42466c6aff8',1,'starpu_sched_policy']]], ['power_5fconsumed',['power_consumed',['../group__API__Profiling.html#aefa78113ca5432c0b106141693b1915e',1,'starpu_profiling_task_info::power_consumed()'],['../group__API__Profiling.html#ae1876be6c7976dbf0f08cfc90ae539d7',1,'starpu_profiling_worker_info::power_consumed()']]], ['power_5fmodel',['power_model',['../group__API__Codelet__And__Tasks.html#ab1c6b049eb1704b0931994e71e676b44',1,'starpu_codelet']]], ['pre_5fexec_5fhook',['pre_exec_hook',['../group__API__Scheduling__Policy.html#a0fea4113de029d040d86aada7ad49900',1,'starpu_sched_policy']]], ['predicted',['predicted',['../group__API__Codelet__And__Tasks.html#aaec036b7926cdf902e95c8e71d8f77f3',1,'starpu_task']]], ['predicted_5ftransfer',['predicted_transfer',['../group__API__Codelet__And__Tasks.html#ac3d08f8846dcb53fc743a5a539840ef4',1,'starpu_task']]], ['prev',['prev',['../group__API__Codelet__And__Tasks.html#a8dc601a11f2dcc9bb62e9318573fa3da',1,'starpu_task']]], ['priority',['priority',['../group__API__Codelet__And__Tasks.html#afb7b183a017a673562a9a0524e3c38f8',1,'starpu_task::priority()'],['../group__API__SC__Hypervisor.html#aa0aa3bf7583a12c3346a3e06236a7d05',1,'sc_hypervisor_policy_config::priority()']]], ['profiling_5finfo',['profiling_info',['../group__API__Codelet__And__Tasks.html#a220ccbd10cf364ebe196015145c40a99',1,'starpu_task']]], ['programs',['programs',['../group__API__OpenCL__Extensions.html#a6f9978b868d57069606bc8c70032c160',1,'starpu_opencl_program']]], ['prologue_5fcallback_5farg',['prologue_callback_arg',['../group__API__Codelet__And__Tasks.html#a3d5eb1f2bb582beb45c0dbd8139d9356',1,'starpu_task']]], ['prologue_5fcallback_5farg_5ffree',['prologue_callback_arg_free',['../group__API__Codelet__And__Tasks.html#af2089cd9c6ffd9ca98c6934d594f7ae3',1,'starpu_task']]], ['prologue_5fcallback_5ffunc',['prologue_callback_func',['../group__API__Codelet__And__Tasks.html#a66da9a644d88e20ebe57e9a4df73b0a0',1,'starpu_task']]], ['ptr',['ptr',['../group__API__Data__Interfaces.html#ac39e5f817013517ae24a9e92270b25de',1,'starpu_matrix_interface::ptr()'],['../group__API__Data__Interfaces.html#a8aa8bc72befe6560d2419e6a93672344',1,'starpu_block_interface::ptr()'],['../group__API__Data__Interfaces.html#a9abd603717a8e189ebfdaa6941690ab1',1,'starpu_vector_interface::ptr()'],['../group__API__Data__Interfaces.html#aa783ee7d584e5aaa83335baa289a13c7',1,'starpu_variable_interface::ptr()']]], ['push_5fend_5ftime',['push_end_time',['../group__API__Profiling.html#a75d3a7821b79a692d3fc9a9f6ea06f4a',1,'starpu_profiling_task_info']]], ['push_5fstart_5ftime',['push_start_time',['../group__API__Profiling.html#a337d767dae00387b840c2bda30b73451',1,'starpu_profiling_task_info']]], ['push_5ftask',['push_task',['../group__API__Scheduling__Policy.html#a7e5b0390e94bb2ab28e1599126093659',1,'starpu_sched_policy']]], ['push_5ftask_5fnotify',['push_task_notify',['../group__API__Scheduling__Policy.html#acc2c85a33c9cd0821739edbbbc6a65c2',1,'starpu_sched_policy']]], ['pushed_5ftasks',['pushed_tasks',['../group__API__SC__Hypervisor.html#a93caf46bb69880d5da0548f056d77148',1,'sc_hypervisor_wrapper']]] ]; starpu-1.1.5/doc/doxygen/html/search/variables_6f.html0000644000373600000000000000171212571536757017655 00000000000000
Loading...
Searching...
No Matches
starpu-1.1.5/doc/doxygen/html/starpu__sched__ctx_8h.html0000644000373600000000000005065012571536757020311 00000000000000 StarPU Handbook: starpu_sched_ctx.h File Reference
starpu_sched_ctx.h File Reference
#include <starpu.h>

Go to the source code of this file.

Functions

unsigned starpu_sched_ctx_contains_type_of_worker (enum starpu_worker_archtype arch, unsigned sched_ctx_id)
int starpu_sched_get_min_priority (void)
int starpu_sched_get_max_priority (void)
int starpu_sched_set_min_priority (int min_prio)
int starpu_sched_set_max_priority (int max_prio)
int starpu_sched_ctx_min_priority_is_set (unsigned sched_ctx_id)
int starpu_sched_ctx_max_priority_is_set (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)
Scheduling Context Worker Collection
struct starpu_worker_collectionstarpu_sched_ctx_create_worker_collection (unsigned sched_ctx_id, enum starpu_worker_collection_type type)
void starpu_sched_ctx_delete_worker_collection (unsigned sched_ctx_id)
struct starpu_worker_collectionstarpu_sched_ctx_get_worker_collection (unsigned sched_ctx_id)
Scheduling Context Link with Hypervisor
void starpu_sched_ctx_set_policy_data (unsigned sched_ctx_id, void *policy_data)
void * starpu_sched_ctx_get_policy_data (unsigned sched_ctx_id)
void starpu_sched_ctx_call_pushed_task_cb (int workerid, unsigned sched_ctx_id)

Scheduling Contexts Basic API

#define STARPU_SCHED_CTX_POLICY_NAME
#define STARPU_SCHED_CTX_POLICY_STRUCT
#define STARPU_SCHED_CTX_POLICY_MIN_PRIO
#define STARPU_SCHED_CTX_POLICY_MAX_PRIO
unsigned starpu_sched_ctx_create (int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name,...)
unsigned starpu_sched_ctx_create_inside_interval (const char *policy_name, const char *sched_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap)
void starpu_sched_ctx_register_close_callback (unsigned sched_ctx_id, void(*close_callback)(unsigned sched_ctx_id, void *args), void *args)
void starpu_sched_ctx_add_workers (int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id)
void starpu_sched_ctx_remove_workers (int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id)
void starpu_sched_ctx_delete (unsigned sched_ctx_id)
void starpu_sched_ctx_set_inheritor (unsigned sched_ctx_id, unsigned inheritor)
void starpu_sched_ctx_set_context (unsigned *sched_ctx_id)
unsigned starpu_sched_ctx_get_context (void)
void starpu_sched_ctx_stop_task_submission (void)
void starpu_sched_ctx_finished_submit (unsigned sched_ctx_id)
unsigned starpu_sched_ctx_get_workers_list (unsigned sched_ctx_id, int **workerids)
unsigned starpu_sched_ctx_get_nworkers (unsigned sched_ctx_id)
unsigned starpu_sched_ctx_get_nshared_workers (unsigned sched_ctx_id, unsigned sched_ctx_id2)
unsigned starpu_sched_ctx_contains_worker (int workerid, unsigned sched_ctx_id)
unsigned starpu_sched_ctx_worker_get_id (unsigned sched_ctx_id)
unsigned starpu_sched_ctx_overlapping_ctxs_on_worker (int workerid)

Scheduling Context Priorities

#define STARPU_MIN_PRIO
#define STARPU_MAX_PRIO
#define STARPU_DEFAULT_PRIO
int starpu_sched_ctx_get_min_priority (unsigned sched_ctx_id)
int starpu_sched_ctx_get_max_priority (unsigned sched_ctx_id)
int starpu_sched_ctx_set_min_priority (unsigned sched_ctx_id, int min_prio)
int starpu_sched_ctx_set_max_priority (unsigned sched_ctx_id, int max_prio)

Detailed Description

starpu-1.1.5/doc/doxygen/html/group__API__Multiformat__Data__Interface.html0000644000373600000000000003734012571536763023765 00000000000000 StarPU Handbook: Multiformat Data Interface
StarPU Handbook
Multiformat Data Interface

Data Structures

struct  starpu_multiformat_data_interface_ops
struct  starpu_multiformat_interface

Macros

#define STARPU_MULTIFORMAT_GET_CPU_PTR(interface)
#define STARPU_MULTIFORMAT_GET_CUDA_PTR(interface)
#define STARPU_MULTIFORMAT_GET_OPENCL_PTR(interface)
#define STARPU_MULTIFORMAT_GET_NX(interface)

Functions

void starpu_multiformat_data_register (starpu_data_handle_t *handle, unsigned home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops)

Detailed Description


Data Structure Documentation

struct starpu_multiformat_data_interface_ops

The different fields are:

Data Fields
size_t cpu_elemsize the size of each element on CPUs
size_t opencl_elemsize the 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 the 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
struct starpu_multiformat_interface

todo

Data Fields
void * cpu_ptr
void * cuda_ptr
void * opencl_ptr
uint32_t nx
struct
starpu_multiformat_data_interface_ops *
ops

Macro Definition Documentation

#define STARPU_MULTIFORMAT_GET_CPU_PTR (   interface)

returns the local pointer to the data with CPU format.

#define STARPU_MULTIFORMAT_GET_CUDA_PTR (   interface)

returns the local pointer to the data with CUDA format.

#define STARPU_MULTIFORMAT_GET_OPENCL_PTR (   interface)

returns the local pointer to the data with OpenCL format.

#define STARPU_MULTIFORMAT_GET_NX (   interface)

returns the number of elements in the data.

Function Documentation

void starpu_multiformat_data_register ( starpu_data_handle_t handle,
unsigned  home_node,
void *  ptr,
uint32_t  nobjects,
struct starpu_multiformat_data_interface_ops format_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. nobjects is the number of elements in the data. format_ops describes the format.

starpu-1.1.5/doc/doxygen/html/ftv2mo.png0000644000373600000000000000062312571536757015102 00000000000000PNG  IHDR}\ZIDATx1K@iBҡ(h"EI'oک 8R- BTP]zB3 _㒻}]V}dIiJb+|K…,[P\ʘMƢ#F`JݤkA?Y4ck6"Z)0SHM@㋺Wmo4HJ+Qobt *~8_+3Y- PwA+^}+xhϕMAE]TD~EÞߴ^R)`A9pq-۾ۍ3tƛTH) ICxd#1 m@V?Zgo_3-\IENDB`starpu-1.1.5/doc/doxygen/html/group__API__Profiling.html0000644000373600000000000007765112571536763020215 00000000000000 StarPU Handbook: Profiling
StarPU Handbook

Data Structures

struct  starpu_profiling_task_info
struct  starpu_profiling_worker_info
struct  starpu_profiling_bus_info

Macros

#define STARPU_PROFILING_DISABLE
#define STARPU_PROFILING_ENABLE

Functions

int starpu_profiling_status_set (int status)
int starpu_profiling_status_get (void)
void starpu_profiling_init ()
void starpu_profiling_set_id (int new_id)
int starpu_profiling_worker_get_info (int workerid, struct starpu_profiling_worker_info *worker_info)
int starpu_bus_get_profiling_info (int busid, struct starpu_profiling_bus_info *bus_info)
int starpu_bus_get_count (void)
int starpu_bus_get_id (int src, int dst)
int starpu_bus_get_src (int busid)
int starpu_bus_get_dst (int busid)
double starpu_timing_timespec_delay_us (struct timespec *start, struct timespec *end)
double starpu_timing_timespec_to_us (struct timespec *ts)
void starpu_profiling_bus_helper_display_summary (void)
void starpu_profiling_worker_helper_display_summary (void)
void starpu_data_display_memory_stats ()

Detailed Description


Data Structure Documentation

struct starpu_profiling_task_info

This structure contains information about the execution of a task. It is accessible from the field starpu_task::profiling_info if profiling was enabled.

Data Fields
struct timespec submit_time Date of task submission (relative to the initialization of StarPU).
struct timespec push_start_time Time when the task was submitted to the scheduler.
struct timespec push_end_time Time when the scheduler finished with the task submission.
struct timespec pop_start_time Time when the scheduler started to be requested for a task, and eventually gave that task.
struct timespec pop_end_time Time when the scheduler finished providing the task for execution.
struct timespec acquire_data_start_time Time when the worker started fetching input data.
struct timespec acquire_data_end_time Time when the worker finished fetching input data.
struct timespec start_time Date of task execution beginning (relative to the initialization of StarPU).
struct timespec end_time Date of task execution termination (relative to the initialization of StarPU).
struct timespec release_data_start_time Time when the worker started releasing data.
struct timespec release_data_end_time Time when the worker finished releasing data.
struct timespec callback_start_time Time when the worker started the application callback for the task.
struct timespec callback_end_time Time when the worker finished the application callback for the task.
int workerid Identifier of the worker which has executed the task.
uint64_t used_cycles Number of cycles used by the task, only available in the MoviSim
uint64_t stall_cycles Number of cycles stalled within the task, only available in the MoviSim
double power_consumed Power consumed by the task, only available in the MoviSim
struct starpu_profiling_worker_info

This structure contains the profiling information associated to a worker. The timing is provided since the previous call to starpu_profiling_worker_get_info()

Data Fields
struct timespec start_time Starting date for the reported profiling measurements.
struct timespec total_time Duration of the profiling measurement interval.
struct timespec executing_time Time spent by the worker to execute tasks during the profiling measurement interval.
struct timespec sleeping_time Time spent idling by the worker during the profiling measurement interval.
int executed_tasks Number of tasks executed by the worker during the profiling measurement interval.
uint64_t used_cycles Number of cycles used by the worker, only available in the MoviSim
uint64_t stall_cycles Number of cycles stalled within the worker, only available in the MoviSim
double power_consumed Power consumed by the worker, only available in the MoviSim
struct starpu_profiling_bus_info

todo

Data Fields
struct timespec start_time Time of bus profiling startup.
struct timespec total_time Total time of bus profiling.
int long long transferred_bytes Number of bytes transferred during profiling.
int transfer_count Number of transfers during profiling.

Macro Definition Documentation

STARPU_PROFILING_DISABLE

This value is used when calling the function starpu_profiling_status_set() to disable profiling.

STARPU_PROFILING_ENABLE

This value is used when calling the function starpu_profiling_status_set() to enable profiling.

Function Documentation

int starpu_profiling_status_set ( int  status)

This function sets the profiling status. Profiling is activated by passing STARPU_PROFILING_ENABLE in status. Passing 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_get ( void  )

Return the current profiling status or a negative value in case there was an error.

int starpu_profiling_init ( void  )

This function resets performance counters and enable profiling if the environment variable STARPU_PROFILING is set to a positive value.

void starpu_profiling_set_id ( int  new_id)

This function sets the ID used for profiling trace filename. It needs to be called before starpu_init().

int starpu_profiling_worker_get_info ( int  workerid,
struct starpu_profiling_worker_info worker_info 
)

Get the profiling info associated to the worker identified by workerid, and reset the profiling measurements. If the argument worker_info is NULL, only reset the counters associated to worker workerid. Upon successful completion, this function returns 0. Otherwise, a negative value is returned.

int starpu_bus_get_profiling_info ( int  busid,
struct starpu_profiling_bus_info bus_info 
)

todo

int starpu_bus_get_count ( void  )

Return the number of buses in the machine

int starpu_bus_get_id ( int  src,
int  dst 
)

Return the identifier of the bus between src and dst

int starpu_bus_get_src ( int  busid)

Return the source point of bus busid

int starpu_bus_get_dst ( int  busid)

Return the destination point of bus busid

double starpu_timing_timespec_delay_us ( struct timespec *  start,
struct timespec *  end 
)

Returns the time elapsed between start and end in microseconds.

double starpu_timing_timespec_to_us ( struct timespec *  ts)

Converts the given timespec ts into microseconds

void starpu_profiling_bus_helper_display_summary ( void  )

Displays statistics about the bus on stderr. if the environment variable STARPU_BUS_STATS is defined. The function is called automatically by starpu_shutdown().

void starpu_profiling_worker_helper_display_summary ( void  )

Displays statistics about the workers on stderr if the environment variable STARPU_WORKER_STATS is defined. The function is called automatically by starpu_shutdown().

void starpu_data_display_memory_stats ( )

Display statistics about the current data handles registered within StarPU. StarPU must have been configured with the configure option --enable-memory-stats (see Memory Feedback).

starpu-1.1.5/doc/doxygen/html/MPISupport.html0000644000373600000000000012101612571536762016063 00000000000000 StarPU Handbook: MPI Support
MPI Support

The integration of MPI transfers within task parallelism is done in a very natural way by the means of asynchronous interactions between the application and StarPU. This is implemented in a separate libstarpumpi library which basically provides "StarPU" equivalents of MPI_* functions, where void * buffers are replaced with starpu_data_handle_t, and all GPU-RAM-NIC transfers are handled efficiently by StarPU-MPI. The user has to use the usual mpirun command of the MPI implementation to start StarPU on the different MPI nodes.

An MPI Insert Task function provides an even more seamless transition to a distributed application, by automatically issuing all required data transfers according to the task graph and an application-provided distribution.

Simple Example

The flags required to compile or link against the MPI layer are accessible with the following commands:

$ pkg-config --cflags starpumpi-1.1  # options for the compiler
$ pkg-config --libs starpumpi-1.1    # options for the linker

You also need pass the option –static if the application is to be linked statically.

void increment_token(void)
{
struct starpu_task *task = starpu_task_create();
task->cl = &increment_cl;
task->handles[0] = token_handle;
}
int main(int argc, char **argv)
{
int rank, size;
starpu_init(NULL);
starpu_vector_data_register(&token_handle, 0, (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)
{
token = 0;
fprintf(stdout, "Start with token value %d\n", token);
}
else
{
starpu_mpi_irecv_detached(token_handle, (rank+size-1)%size, tag,
MPI_COMM_WORLD, NULL, NULL);
}
increment_token();
if (loop == last_loop && rank == last_rank)
{
starpu_data_acquire(token_handle, STARPU_R);
fprintf(stdout, "Finished: token value %d\n", token);
starpu_data_release(token_handle);
}
else
{
starpu_mpi_isend_detached(token_handle, (rank+1)%size, tag+1,
MPI_COMM_WORLD, NULL, NULL);
}
}
if (rank == last_rank)
{
fprintf(stderr, "[%d] token = %d == %d * %d ?\n", rank, token, nloops, size);
STARPU_ASSERT(token == nloops*size);
}

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 is 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 any communication, the call of the function 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 available in main memory, a StarPU-MPI function is called to put the new request in the list of the ready requests.

The StarPU-MPI progression thread regularly polls this list of ready requests. For each new ready request, the appropriate function is called to post the corresponding MPI call. For example, calling starpu_mpi_isend() will result in posting MPI_Isend. If the request is marked as detached, the request will be put in the list of detached requests.

The StarPU-MPI progression thread also polls the list of detached requests. For each detached request, it regularly tests the 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.

Communication gives the list of all the point to point communications defined in StarPU-MPI.

Exchanging User Defined Data Interface

New data interfaces defined as explained in Defining A New Data Interface 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 along with its size where data to be conveyed to another node should be copied. The reversed operation is implemented in the function starpu_data_interface_ops::unpack_data which takes a contiguous memory buffer and recreates the data handle.

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);
*ptr = malloc(*count);
memcpy(*ptr, complex_interface->real, complex_interface->nx*sizeof(double));
memcpy(*ptr+complex_interface->nx*sizeof(double), complex_interface->imaginary,
complex_interface->nx*sizeof(double));
return 0;
}
static int complex_unpack_data(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count)
{
STARPU_ASSERT(starpu_data_test_if_allocated_on_node(handle, node));
struct starpu_complex_interface *complex_interface =
(struct starpu_complex_interface *) starpu_data_get_interface_on_node(handle, node);
memcpy(complex_interface->real, ptr, complex_interface->nx*sizeof(double));
memcpy(complex_interface->imaginary, ptr+complex_interface->nx*sizeof(double),
complex_interface->nx*sizeof(double));
return 0;
}
static struct starpu_data_interface_ops interface_complex_ops =
{
...
.pack_data = complex_pack_data,
.unpack_data = complex_unpack_data
};

MPI Insert Task Utility

To save the programmer from having to explicit all communications, StarPU provides an "MPI Insert Task Utility". The principe is that the application decides a distribution of the data over the MPI nodes by allocating it and notifying StarPU of that decision, i.e. tell StarPU which MPI node "owns" which data. It also decides, for each handle, an MPI tag which will be used to exchange the content of the handle. All MPI nodes then process the whole task graph, and StarPU automatically determines which node actually execute which task, and trigger the required MPI transfers.

The list of functions is described in MPI Insert Task.

Here an stencil example showing how to use starpu_mpi_insert_task(). 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.

/* 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;
}

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.

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], 0,
(uintptr_t)&(matrix[x][y]), sizeof(unsigned));
else if (my_rank == my_distrib(x+1, y, size) || my_rank == my_distrib(x-1, y, size)
|| my_rank == my_distrib(x, y+1, size) || my_rank == my_distrib(x, y-1, size))
/* I don't own that index, but will need it for my computations */
starpu_variable_data_register(&data_handles[x][y], -1,
(uintptr_t)NULL, sizeof(unsigned));
else
/* I know it's useless to allocate anything for this */
data_handles[x][y] = NULL;
if (data_handles[x][y]) {
starpu_mpi_data_register(data_handles[x][y], x*X+y, mpi_rank);
}
}
}

Now starpu_mpi_insert_task() can be called for the different steps of the application.

for(loop=0 ; loop<niter; loop++)
for (x = 1; x < X-1; x++)
for (y = 1; y < Y-1; y++)
starpu_mpi_insert_task(MPI_COMM_WORLD, &stencil5_cl,
STARPU_RW, data_handles[x][y],
STARPU_R, data_handles[x-1][y],
STARPU_R, data_handles[x+1][y],
STARPU_R, data_handles[x][y-1],
STARPU_R, data_handles[x][y+1],
0);

I.e. all MPI nodes process the whole task graph, but as mentioned above, for each task, only the MPI node which owns the data being written to (here, data_handles[x][y]) will actually run the task. The other MPI nodes will automatically send the required data.

This can be a concern with a growing number of nodes. To avoid this, the application can prune the task for loops according to the data distribution, so as to only submit tasks on nodes which have to care about them (either to execute them, or to send the required data).

A way to do some of this quite easily can be to just add an if like this:

for(loop=0 ; loop<niter; loop++)
for (x = 1; x < X-1; x++)
for (y = 1; y < Y-1; y++)
if (my_distrib(x,y,size) == 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) == my_rank)
starpu_mpi_insert_task(MPI_COMM_WORLD, &stencil5_cl,
STARPU_RW, data_handles[x][y],
STARPU_R, data_handles[x-1][y],
STARPU_R, data_handles[x+1][y],
STARPU_R, data_handles[x][y-1],
STARPU_R, data_handles[x][y+1],
0);

This permits to drop the cost of function call argument passing and parsing.

If the my_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.

MPI cache support

StarPU-MPI automatically optimizes duplicate data transmissions: if an MPI node B needs a piece of data D from MPI node A for several tasks, only one transmission of D will take place from A to B, and the value of D will be kept on B as long as no task modifies D.

If a task modifies D, B will wait for all tasks which need the previous value of D, before invalidating the value of D. As a consequence, it releases the memory occupied by D. Whenever a task running on B needs the new value of D, allocation will take place again to receive it.

Since tasks can be submitted dynamically, StarPU-MPI can not know whether the current value of data D will again be used by a newly-submitted task before being modified by another newly-submitted task, so until a task is submitted to modify the current value, it can not decide by itself whether to flush the cache or not. The application can however explicitly tell StarPU-MPI to flush the cache by calling starpu_mpi_cache_flush() or starpu_mpi_cache_flush_all_data(), for instance in case the data will not be used at all any more (see for instance the cholesky example in mpi/examples/matrix_decomposition), or at least not in the close future. If a newly-submitted task actually needs the value again, another transmission of D will be initiated from A to B.

The whole caching behavior can be disabled thanks to the ::STARPU_MPI_CACHE environment variable. The variable ::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.

MPI Data migration

The application can dynamically change its mind about the data distribution, to balance the load over MPI nodes for instance. This can be done very simply by requesting an explicit move and then change the registered rank. For instance, we here switch to a new distribution function my_distrib2: we first register any data that wasn't registered already and will be needed, then migrate the data, and register the new location.

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_get_data_on_node_detached(MPI_COMM_WORLD, data_handles[x][y], mpi_rank, NULL, NULL);
/* And register the new rank of the matrix */
starpu_mpi_data_set_rank(data_handles[x][y], mpi_rank);
}
}
}

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.

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]);
}
}
}

MPI Collective Operations

The functions are described in MPI Collective Operations.

if (rank == root)
{
/* Allocate the vector */
vector = malloc(nblocks * sizeof(float *));
for(x=0 ; x<nblocks ; x++)
{
starpu_malloc((void **)&vector[x], block_size*sizeof(float));
}
}
/* Allocate data handles and register data to StarPU */
data_handles = malloc(nblocks*sizeof(starpu_data_handle_t *));
for(x = 0; x < nblocks ; x++)
{
int mpi_rank = my_distrib(x, nodes);
if (rank == root) {
starpu_vector_data_register(&data_handles[x], 0, (uintptr_t)vector[x],
blocks_size, sizeof(float));
}
else if ((mpi_rank == rank) || ((rank == mpi_rank+1 || rank == mpi_rank-1))) {
/* I own that index, or i will need it for my computations */
starpu_vector_data_register(&data_handles[x], -1, (uintptr_t)NULL,
block_size, sizeof(float));
}
else {
/* I know it's useless to allocate anything for this */
data_handles[x] = NULL;
}
if (data_handles[x]) {
starpu_mpi_data_register(data_handles[x], x*nblocks+y, mpi_rank);
}
}
/* Scatter the matrix among the nodes */
starpu_mpi_scatter_detached(data_handles, nblocks, root, MPI_COMM_WORLD);
/* Calculation */
for(x = 0; x < nblocks ; x++) {
if (data_handles[x]) {
int owner = starpu_data_get_rank(data_handles[x]);
if (owner == rank) {
starpu_insert_task(&cl, STARPU_RW, data_handles[x], 0);
}
}
}
/* Gather the matrix on main node */
starpu_mpi_gather_detached(data_handles, nblocks, 0, MPI_COMM_WORLD);
starpu-1.1.5/doc/doxygen/html/jquery.js0000644000373600000000000026726112571536757015051 00000000000000/*! jQuery v1.7.1 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")), f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c) {if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); starpu-1.1.5/doc/doxygen/html/SOCLOpenclExtensions.html0000644000373600000000000001667112571536762020034 00000000000000 StarPU Handbook: SOCL OpenCL Extensions
StarPU Handbook
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.

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 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

export SOCL_OCL_LIB_OPENCL=/usr/lib/x86_64-linux-gnu/libOpenCL.so

You can then run the test suite in the directory socl/examples.

$ make check
...
PASS: basic/basic
PASS: testmap/testmap
PASS: clinfo/clinfo
PASS: matmul/matmul
PASS: mansched/mansched
==================
All 5 tests passed
==================

The environment variable OCL_ICD_VENDORS has to point to the directory where the ICD files are 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,

$ 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
....
$

To enable the use of CPU cores via OpenCL, one can set the STARPU_OPENCL_ON_CPUS environment variable to 1 and STARPU_NCPUS to 0 (to avoid using CPUs both via the OpenCL driver and the normal CPU driver).

starpu-1.1.5/doc/doxygen/html/group__API__SC__Hypervisor__usage.html0000644000373600000000000010737312571536763022500 00000000000000 StarPU Handbook: Scheduling Context Hypervisor - Regular usage
StarPU Handbook
Scheduling Context Hypervisor - Regular usage

Macros

#define SC_HYPERVISOR_MAX_IDLE
#define SC_HYPERVISOR_PRIORITY
#define SC_HYPERVISOR_MIN_WORKERS
#define SC_HYPERVISOR_MAX_WORKERS
#define SC_HYPERVISOR_GRANULARITY
#define SC_HYPERVISOR_FIXED_WORKERS
#define SC_HYPERVISOR_MIN_TASKS
#define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE
#define SC_HYPERVISOR_TIME_TO_APPLY
#define SC_HYPERVISOR_ISPEED_W_SAMPLE
#define SC_HYPERVISOR_ISPEED_CTX_SAMPLE
#define SC_HYPERVISOR_NULL

Functions

void * sc_hypervisor_init (struct sc_hypervisor_policy *policy)
void sc_hypervisor_shutdown (void)
void sc_hypervisor_register_ctx (unsigned sched_ctx, double total_flops)
void sc_hypervisor_unregister_ctx (unsigned sched_ctx)
void sc_hypervisor_stop_resize (unsigned sched_ctx)
void sc_hypervisor_start_resize (unsigned sched_ctx)
const char * sc_hypervisor_get_policy ()
void sc_hypervisor_add_workers_to_sched_ctx (int *workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx)
void sc_hypervisor_remove_workers_from_sched_ctx (int *workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now)
void sc_hypervisor_move_workers (unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *workers_to_move, unsigned nworkers_to_move, unsigned now)
void sc_hypervisor_size_ctxs (unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
void sc_hypervisor_set_type_of_task (struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size)
void sc_hypervisor_update_diff_total_flops (unsigned sched_ctx, double diff_total_flops)
void sc_hypervisor_update_diff_elapsed_flops (unsigned sched_ctx, double diff_task_flops)
void sc_hypervisor_ctl (unsigned sched_ctx,...)

Detailed Description

Macro Definition Documentation

#define SC_HYPERVISOR_MAX_IDLE

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_PRIORITY

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_MIN_WORKERS

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_MAX_WORKERS

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_GRANULARITY

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 Resizing Strategies), the number of workers that have to be moved is calculated by the strategy.

#define SC_HYPERVISOR_FIXED_WORKERS

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_MIN_TASKS

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 Resizing Strategies) where the user indicates exactly when the resize should be done.

#define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE

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_TIME_TO_APPLY

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_ISPEED_W_SAMPLE

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_CTX_SAMPLE

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_NULL

This macro is used when calling sc_hypervisor_ctl() and must be followed by 1 arguments

Function Documentation

void * sc_hypervisor_init ( struct sc_hypervisor_policy policy)

There is a single hypervisor that is in charge of resizing contexts and the resizing strategy is chosen at the initialization of the hypervisor. A single resize can be done at a time.

The Scheduling Context Hypervisor Plugin provides a series of performance counters to StarPU. By incrementing them, StarPU can help the hypervisor in the resizing decision making process.

This function initializes the hypervisor to use the strategy provided as parameter and creates the performance counters (see starpu_sched_ctx_performance_counters). These performance counters represent actually some callbacks that will be used by the contexts to notify the information needed by the hypervisor.

Note: The Hypervisor is actually a worker that takes this role once certain conditions trigger the resizing process (there is no additional thread assigned to the hypervisor).

void sc_hypervisor_shutdown ( void  )

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_register_ctx ( unsigned  sched_ctx,
double  total_flops 
)

Scheduling Contexts that have to be resized by the hypervisor must be first registered to the hypervisor. This function registers the context to the hypervisor, and indicate the number of flops the context will execute (used for Gflops rate based strategy or any other custom strategy needing it, for the others we can pass 0.0)

void sc_hypervisor_unregister_ctx ( unsigned  sched_ctx)

Whenever we want to exclude contexts from the resizing process we have to unregister them from the hypervisor.

void sc_hypervisor_stop_resize ( unsigned  sched_ctx)

The user can totally forbid the resizing of a certain context or can then change his mind and allow it (in this case the resizing is managed by the hypervisor, that can forbid it or allow it)

void sc_hypervisor_start_resize ( unsigned  sched_ctx)

Allow resizing of a context. The user can then provide information to the hypervisor concerning the conditions of resizing.

char * sc_hypervisor_get_policy ( )

Returns the name of the resizing policy the hypervisor uses

void sc_hypervisor_add_workers_to_sched_ctx ( int *  workers_to_add,
unsigned  nworkers_to_add,
unsigned  sched_ctx 
)

Ask the hypervisor to add workers to 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 remove workers from a sched_ctx

void sc_hypervisor_move_workers ( unsigned  sender_sched_ctx,
unsigned  receiver_sched_ctx,
int *  workers_to_move,
unsigned  nworkers_to_move,
unsigned  now 
)

Moves workers from one context to another

void sc_hypervisor_size_ctxs ( unsigned *  sched_ctxs,
int  nsched_ctxs,
int *  workers,
int  nworkers 
)

Ask the hypervisor to chose a distribution of workers in the required contexts

void sc_hypervisor_set_type_of_task ( struct starpu_codelet cl,
unsigned  sched_ctx,
uint32_t  footprint,
size_t  data_size 
)

Indicate the types of tasks a context will execute in order to better decide the sizing of ctxs

void sc_hypervisor_update_diff_total_flops ( unsigned  sched_ctx,
double  diff_total_flops 
)

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_elapsed_flops ( unsigned  sched_ctx,
double  diff_task_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_ctl ( unsigned  sched_ctx,
  ... 
)

Inputs conditions to the context sched_ctx with the following arguments. The argument list must be zero-terminated.

starpu-1.1.5/doc/doxygen/html/functions_vars_0x65.html0000644000373600000000000002204612571536763017672 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/dir_e820806119b96767069d3efbde8c274a.html0000644000373600000000000001256012571536763021144 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/sc_hypervisor/ Directory Reference
sc_hypervisor Directory Reference

Directories

directory  include
starpu-1.1.5/doc/doxygen/html/group__API__Task__Lists.html0000644000373600000000000005420512571536763020471 00000000000000 StarPU Handbook: Task Lists
StarPU Handbook
Task Lists

Data Structures

struct  starpu_task_list

Functions

static STARPU_INLINE void starpu_task_list_init (struct starpu_task_list *list)
static STARPU_INLINE void starpu_task_list_push_front (struct starpu_task_list *list, struct starpu_task *task)
static STARPU_INLINE void starpu_task_list_push_back (struct starpu_task_list *list, struct starpu_task *task)
static STARPU_INLINE struct
starpu_task
starpu_task_list_front (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_back (struct starpu_task_list *list)
static STARPU_INLINE int starpu_task_list_empty (struct starpu_task_list *list)
static STARPU_INLINE void starpu_task_list_erase (struct starpu_task_list *list, struct starpu_task *task)
static STARPU_INLINE struct
starpu_task
starpu_task_list_pop_front (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_pop_back (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_begin (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_next (struct starpu_task *task)

Detailed Description


Data Structure Documentation

struct starpu_task_list

Stores a double-chained list of tasks

Data Fields
struct starpu_task * head head of the list
struct starpu_task * tail tail of the list

Function Documentation

void starpu_task_list_init ( struct starpu_task_list list)
static

Initialize a list structure

void starpu_task_list_push_front ( struct starpu_task_list list,
struct starpu_task task 
)
static

Push task at the front of list

void starpu_task_list_push_back ( struct starpu_task_list list,
struct starpu_task task 
)
static

Push task at the back of list

struct starpu_task * starpu_task_list_front ( struct starpu_task_list list)
staticread

Get the front of list (without removing it)

struct starpu_task * starpu_task_list_back ( struct starpu_task_list list)
staticread

Get the back of list (without removing it)

int starpu_task_list_empty ( struct starpu_task_list list)
static

Test if list is empty

void starpu_task_list_erase ( struct starpu_task_list list,
struct starpu_task task 
)
static

Remove task from list

struct starpu_task * starpu_task_list_pop_front ( struct starpu_task_list list)
staticread

Remove the element at the front of list

struct starpu_task * starpu_task_list_pop_back ( struct starpu_task_list list)
staticread

Remove the element at the back of list

struct starpu_task * starpu_task_list_begin ( struct starpu_task_list list)
staticread

Get the first task of list.

struct starpu_task * starpu_task_list_next ( struct starpu_task task)
staticread

Get the next task of list. This is not erase-safe.

starpu-1.1.5/doc/doxygen/html/starpu__task_8h_source.html0000644000373600000000000020670212571536757020531 00000000000000 StarPU Handbook: starpu_task.h Source File
starpu_task.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  * Copyright (C) 2011 Télécom-SudParis
6  * Copyright (C) 2011 INRIA
7  *
8  * StarPU is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2.1 of the License, or (at
11  * your option) any later version.
12  *
13  * StarPU is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  *
17  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
18  */
19 
20 #ifndef __STARPU_TASK_H__
21 #define __STARPU_TASK_H__
22 
23 #include <starpu.h>
24 #include <starpu_data.h>
25 #include <starpu_util.h>
26 #include <starpu_task_bundle.h>
27 #include <errno.h>
28 
29 #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS
30 # include <cuda.h>
31 #endif
32 
33 #ifdef __cplusplus
34 extern "C"
35 {
36 #endif
37 
38 #define STARPU_NOWHERE ((1ULL)<<0)
39 #define STARPU_CPU ((1ULL)<<1)
40 #define STARPU_CUDA ((1ULL)<<3)
41 #define STARPU_OPENCL ((1ULL)<<6)
42 
44 {
48 };
49 
51 {
53 #define STARPU_TASK_INVALID 0
61 };
62 
63 typedef uint64_t starpu_tag_t;
64 
65 typedef void (*starpu_cpu_func_t)(void **, void*);
66 typedef void (*starpu_cuda_func_t)(void **, void*);
67 typedef void (*starpu_opencl_func_t)(void **, void*);
68 
69 #define STARPU_MULTIPLE_CPU_IMPLEMENTATIONS ((starpu_cpu_func_t) -1)
70 #define STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS ((starpu_cuda_func_t) -1)
71 #define STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS ((starpu_opencl_func_t) -1)
72 
73 struct starpu_task;
75 {
76  uint32_t where;
77  int (*can_execute)(unsigned workerid, struct starpu_task *task, unsigned nimpl);
80 
81  starpu_cpu_func_t cpu_func STARPU_DEPRECATED;
82  starpu_cuda_func_t cuda_func STARPU_DEPRECATED;
83  starpu_opencl_func_t opencl_func STARPU_DEPRECATED;
84 
85  starpu_cpu_func_t cpu_funcs[STARPU_MAXIMPLEMENTATIONS];
86  starpu_cuda_func_t cuda_funcs[STARPU_MAXIMPLEMENTATIONS];
87  starpu_opencl_func_t opencl_funcs[STARPU_MAXIMPLEMENTATIONS];
88 
89  unsigned nbuffers;
92 
93  unsigned specific_nodes;
95  int *dyn_nodes;
96 
99 
101 
102  const char *name;
103 };
104 
106 {
108 
109  struct starpu_data_descr buffers[STARPU_NMAXBUFS] STARPU_DEPRECATED;
112 
115 
116  void *cl_arg;
117  size_t cl_arg_size;
118  /* must StarPU release cl_arg ? - 0 by default */
119  unsigned cl_arg_free;
120 
121  void (*callback_func)(void *);
123  /* must StarPU release callback_arg ? - 0 by default */
125 
126  void (*prologue_callback_func)(void *);
128  /* must StarPU release prologue_callback_arg ? - 0 by default */
130 
131  unsigned use_tag;
132  starpu_tag_t tag_id;
133 
135 
136  unsigned synchronous;
137  int priority;
138 
140  unsigned workerid;
141 
143 
144  int detach;
145  int destroy;
147 
149 
151 
152  double predicted;
154 
155  unsigned int mf_skip;
156 
157  struct starpu_task *prev;
158  struct starpu_task *next;
160  int magic;
161 
162  unsigned sched_ctx;
164  double flops;
165 
166  unsigned scheduled;
167 };
168 
169 #define STARPU_TASK_INITIALIZER \
170 { \
171  .cl = NULL, \
172  .cl_arg = NULL, \
173  .cl_arg_size = 0, \
174  .callback_func = NULL, \
175  .callback_arg = NULL, \
176  .priority = STARPU_DEFAULT_PRIO, \
177  .use_tag = 0, \
178  .synchronous = 0, \
179  .execute_on_a_specific_worker = 0, \
180  .bundle = NULL, \
181  .detach = 1, \
182  .destroy = 0, \
183  .regenerate = 0, \
184  .status = STARPU_TASK_INVALID, \
185  .profiling_info = NULL, \
186  .predicted = -1.0, \
187  .predicted_transfer = -1.0, \
188  .starpu_private = NULL, \
189  .magic = 42, \
190  .sched_ctx = 0, \
191  .hypervisor_tag = 0, \
192  .flops = 0.0, \
193  .scheduled = 0, \
194  .dyn_handles = NULL, \
195  .dyn_interfaces = NULL \
196 }
197 
198 #define STARPU_TASK_GET_HANDLE(task, i) ((task->dyn_handles) ? task->dyn_handles[i] : task->handles[i])
199 #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)
200 
201 #define STARPU_CODELET_GET_MODE(codelet, i) ((codelet->dyn_modes) ? codelet->dyn_modes[i] : codelet->modes[i])
202 #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)
203 
204 #define STARPU_CODELET_GET_NODE(codelet, i) ((codelet->dyn_nodes) ? codelet->dyn_nodes[i] : codelet->nodes[i])
205 #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)
206 
207 void starpu_tag_declare_deps(starpu_tag_t id, unsigned ndeps, ...);
208 void starpu_tag_declare_deps_array(starpu_tag_t id, unsigned ndeps, starpu_tag_t *array);
209 
210 void starpu_task_declare_deps_array(struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[]);
211 
212 int starpu_tag_wait(starpu_tag_t id);
213 int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id);
214 
215 void starpu_tag_notify_from_apps(starpu_tag_t id);
216 
217 void starpu_tag_restart(starpu_tag_t id);
218 
219 void starpu_tag_remove(starpu_tag_t id);
220 
221 void starpu_task_init(struct starpu_task *task);
222 void starpu_task_clean(struct starpu_task *task);
223 
224 struct starpu_task *starpu_task_create(void);
225 
226 void starpu_task_destroy(struct starpu_task *task);
228 int starpu_task_submit_to_ctx(struct starpu_task *task, unsigned sched_ctx_id);
229 
231 
232 int starpu_task_wait_for_all(void);
233 int starpu_task_wait_for_n_submitted(unsigned n);
234 
235 int starpu_task_wait_for_all_in_ctx(unsigned sched_ctx_id);
236 int starpu_task_wait_for_n_submitted_in_ctx(unsigned sched_ctx_id, unsigned n);
237 
239 
240 int starpu_task_nready(void);
241 int starpu_task_nsubmitted(void);
242 
244 
246 
248 
250 void starpu_parallel_task_barrier_init_n(struct starpu_task *task, int worker_size);
251 
252 struct starpu_task *starpu_task_dup(struct starpu_task *task);
253 
254 void starpu_task_set_implementation(struct starpu_task *task, unsigned impl);
255 unsigned starpu_task_get_implementation(struct starpu_task *task);
256 
257 #ifdef __cplusplus
258 }
259 #endif
260 
261 #endif /* __STARPU_TASK_H__ */
starpu-1.1.5/doc/doxygen/html/dir_3e1bb110c9e60697bac62a1ecfefbf94.html0000644000373600000000000001360612571536763021556 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/doc/doxygen/chapters/api/sc_hypervisor/ Directory Reference
sc_hypervisor Directory Reference

Files

file  sc_hypervisor.doxy
file  sc_hypervisor_usage.doxy
starpu-1.1.5/doc/doxygen/html/starpu__stdlib_8h.html0000644000373600000000000002300312571536757017457 00000000000000 StarPU Handbook: starpu_stdlib.h File Reference
starpu_stdlib.h File Reference
#include <starpu.h>

Go to the source code of this file.

Macros

#define STARPU_MALLOC_PINNED
#define STARPU_MALLOC_COUNT

Functions

void starpu_malloc_set_align (size_t align)
int starpu_malloc (void **A, size_t dim)
int starpu_free (void *A)
int starpu_malloc_flags (void **A, size_t dim, int flags)
int starpu_free_flags (void *A, size_t dim, int flags)
int starpu_memory_pin (void *addr, size_t size)
int starpu_memory_unpin (void *addr, size_t size)
starpu_ssize_t starpu_memory_get_total (unsigned node)
starpu_ssize_t starpu_memory_get_available (unsigned node)
void starpu_memory_wait_available (unsigned node, size_t size)

Detailed Description

starpu-1.1.5/doc/doxygen/html/HowToOptimizePerformanceWithStarPU.html0000644000373600000000000014160212571536761022741 00000000000000 StarPU Handbook: How To Optimize Performance With StarPU
How To Optimize Performance With StarPU

TODO: improve!

Simply encapsulating application kernels into tasks already permits to seamlessly support CPU and GPUs at the same time. To achieve good performance, a few additional changes are needed.

Data Management

When the application allocates data, whenever possible it should use the starpu_malloc() function, which will ask CUDA or OpenCL to make the allocation itself and pin the corresponding allocated memory, or to use the starpu_memory_pin() function to pin memory allocated by other ways, such as local arrays. This is needed to permit asynchronous data transfer, i.e. permit data transfer to overlap with computations. Otherwise, the trace will show that the DriverCopyAsync state takes a lot of time, this is because CUDA or OpenCL then reverts to synchronous transfers.

By default, StarPU leaves replicates of data wherever they were used, in case they will be re-used by other tasks, thus saving the data transfer time. When some task modifies some data, all the other replicates are invalidated, and only the processing unit which ran that task will have a valid replicate of the data. If the application knows that this data will not be re-used by further tasks, it should advise StarPU to immediately replicate it to a desired list of memory nodes (given through a bitmask). This can be understood like the write-through mode of CPU caches.

starpu_data_set_wt_mask(img_handle, 1<<0);

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.

starpu_data_set_wt_mask(img_handle, ~0U);

will request to always automatically broadcast the updated data to all memory nodes.

Setting the write-through mask to ~0U can also be useful to make sure all memory nodes always have a copy of the data, so that it is never evicted when memory gets scarse.

Implicit data dependency computation can become expensive if a lot of tasks access the same piece of data. If no dependency is required on some piece of data (e.g. because it is only accessed in read-only mode, or because write accesses are actually commutative), use the function starpu_data_set_sequential_consistency_flag() to disable implicit dependencies on that data.

In the same vein, accumulation of results in the same data can become a bottleneck. The use of the mode STARPU_REDUX permits to optimize such accumulation (see Data Reduction).

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:

starpu_vector_data_register(&handle, -1, 0, n, sizeof(float));

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:

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:

the buffers containing the current value will then be freed, and reallocated only when another task writes some value to the handle.

Task Granularity

Like any other runtime, StarPU has some overhead to manage tasks. Since it does smart scheduling and data management, that overhead is not always neglectable. The order of magnitude of the overhead is typically a couple of microseconds, which is actually quite smaller than the CUDA overhead itself. The amount of work that a task should do should thus be somewhat bigger, to make sure that the overhead becomes neglectible. The offline performance feedback can provide a measure of task length, which should thus be checked if bad performance are observed. To get a grasp at the scalability possibility according to task size, one can run tests/microbenchs/tasks_size_overhead.sh which draws curves of the speedup of independent tasks of very small sizes.

The choice of scheduler also has impact over the overhead: for instance, the scheduler dmda takes time to make a decision, while eager does not. tasks_size_overhead.sh can again be used to get a grasp at how much impact that has on the target machine.

Task Submission

To let StarPU make online optimizations, tasks should be submitted asynchronously as much as possible. Ideally, all the tasks should be submitted, and mere calls to starpu_task_wait_for_all() or starpu_data_unregister() be done to wait for termination. StarPU will then be able to rework the whole schedule, overlap computation with communication, manage accelerator local memory usage, etc.

Task Priorities

By default, StarPU will consider the tasks in the order they are submitted by the application. If the application programmer knows that some tasks should be performed in priority (for instance because their output is needed by many other tasks and may thus be a bottleneck if not executed early enough), the field starpu_task::priority should be set to transmit the priority information to StarPU.

Task Scheduling Policy

The basics of the scheduling policy are that

  • The scheduler gets to schedule tasks (push operation) when they become ready to be executed, i.e. they are not waiting for some tags, data dependencies or task dependencies.
  • Workers pull tasks (pop operation) one by one from the scheduler.

This means scheduling policies usually contain at least one queue of tasks to store them between the time when they become available, and the time when a worker gets to grab them.

By default, StarPU uses the simple greedy scheduler eager. This is because it provides correct load balance even if the application codelets do not have performance models. If your application codelets have performance models (PerformanceModelExample), you should change the scheduler thanks to the environment variable STARPU_SCHED. For instance export STARPU_SCHED=dmda . Use help to get the list of available schedulers.

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 prio scheduler also uses a central task queue, but sorts tasks by priority (between -5 and 5).

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 dm (deque model) scheduler uses task execution performance models into account to perform a HEFT-similar scheduling strategy: it schedules tasks where their termination time will be minimal. The difference with HEFT is that dm schedules tasks as soon as they become available, and thus in the order they become available, without taking priorities into account.

The dmda (deque model data aware) scheduler is similar to dm, but it also takes into account data transfer time.

The dmdar (deque model data aware ready) scheduler is similar to dmda, but it also sorts tasks on per-worker queues by number of already-available data buffers on the target device.

The dmdas (deque model data aware sorted) scheduler is similar to dmdar, except that it sorts tasks by priority order, which allows to become even closer to HEFT by respecting priorities after having made the scheduling decision (but it still schedules tasks in the order they become available).

The 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.

How to limit memory per node

By default, StarPU makes sure to use at most 90% of the memory of GPU devices, moving data in and out of the device as appropriate and with prefetch and writeback optimizations. Concerning the main memory, by default it will not limit its consumption, since by default it has nowhere to push the data to when memory gets tight. This also means that by default StarPU will not cache buffer allocations in main memory, since it does not know how much of the system memory it can afford.

In the case of GPUs, the STARPU_LIMIT_CUDA_MEM, STARPU_LIMIT_CUDA_devid_MEM, STARPU_LIMIT_OPENCL_MEM, and STARPU_LIMIT_OPENCL_devid_MEM environment variables can be used to control how much (in MiB) of the GPU device memory should be used at most by StarPU (their default values are 90% of the available memory).

In the case of the main memory, the STARPU_LIMIT_CPU_MEM environment variable can be used to specify how much (in MiB) of the main memory should be used at most by StarPU for buffer allocations. This way, StarPU will be able to cache buffer allocations (which can be a real benefit if a lot of bufferes are involved, or if allocation fragmentation can become a problem).

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 STARPU_MALLOC_COUNT flag (i.e. through starpu_malloc_flags(STARPU_MALLOC_COUNT)) are taken into account.

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.

How To Reduce The Memory Footprint Of Internal Data Structures

It is possible to reduce the memory footprint of the task and data internal structures of StarPU by describing the shape of your machine and/or your application at the configure step.

To reduce the memory footprint of the data internal structures of StarPU, one can set the --enable-maxcpus, --enable-maxcudadev, --enable-maxopencldev and --enable-maxnodes configure parameters to give StarPU the architecture of the machine it will run on, thus tuning the size of the structures to the machine.

To reduce the memory footprint of the task internal structures of StarPU, one can set the --enable-maxbuffers configure parameter to give StarPU the maximum number of buffers that a task can use during an execution. For example, in the Cholesky factorization (dense linear algebra application), the GEMM task uses up to 3 buffers, so it is possible to set the maximum number of task buffers to 3 to run a Cholesky factorization on StarPU.

How to reuse memory

When your application needs to allocate more data than the available amount of memory usable by StarPU (given by starpu_memory_get_available() ), the allocation cache system can reuse data buffers used by previously executed tasks. For that system to work with MPI tasks, you need to submit tasks progressively instead of as soon as possible, because in the case of MPI receives, the allocation cache check for reusing data buffers will be done at submission time, not at execution time.

You have two options to control the task submission flow. The first one is by controlling the number of submitted tasks during the whole execution. This can be done whether by setting the environment variables STARPU_LIMIT_MAX_NSUBMITTED_TASKS and STARPU_LIMIT_MIN_NSUBMITTED_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.

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 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. To share the models between machines (e.g. for a homogeneous cluster), use export STARPU_HOSTNAME=some_global_name. To force continuing calibration, use export STARPU_CALIBRATE=1 . This may be necessary if your application has not-so-stable performance. StarPU will force calibration (and thus ignore the current result) until 10 (_STARPU_CALIBRATION_MINIMUM) measurements have been made on each architecture, to avoid badly scheduling tasks just because the first measurements were not so good. Details on the current performance model status can be obtained from the command starpu_perfmodel_display: the -l option lists the available performance models, and the -s option permits to choose the performance model to be displayed. The result looks like:

$ 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
...

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:

$ 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
starpu_starpu_slu_lu_model_11.png

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.

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:

static struct starpu_perfmodel perf_model = {
.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;
task.cl = &cl;
for (measure = &measures[0]; measure < measures[last]; measure++) {
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);
}
}

Measurement has to be provided in milliseconds for the completion time models, and in Joules for the energy consumption models.

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 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.

Data Prefetch

The scheduling policies heft, dmda and pheft perform data prefetch (see 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.

Power-based Scheduling

If the application can provide some power performance model (through the field starpu_codelet::power_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 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 power consumption.

This is however not sufficient to correctly optimize power: 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 for 200W, for instance. This value can often be obtained from the machine power supplier.

The power actually consumed by the total execution can be displayed by setting export STARPU_PROFILING=1 STARPU_WORKER_STATS=1 .

On-line task consumption measurement is currently only supported through the CL_PROFILING_POWER_CONSUMED OpenCL extension, implemented in the MoviSim simulator. Applications can however provide explicit measurements by using the function starpu_perfmodel_update_history() (examplified in PerformanceModelExample with the power_model performance model). Fine-grain measurement is often not feasible with the feedback provided by the hardware, so the user can for instance run a given task a thousand times, measure the global consumption for that series of tasks, divide it by a thousand, repeat for varying kinds of tasks and task sizes, and eventually feed StarPU with these manual measurements through starpu_perfmodel_update_history(). For instance, for CUDA devices, nvidia-smi -q -d POWER can be used to get the current consumption in Watt. Multiplying that value by the average duration of a single task gives the consumption of the task in Joules, which can be given to starpu_perfmodel_update_history().

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:

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.

Profiling

A quick view of how many tasks each worker has executed can be obtained by setting export STARPU_WORKER_STATS=1 This is a convenient way to check that execution did happen on accelerators without penalizing performance with the profiling overhead.

A quick view of how much data transfers have been issued can be obtained by setting export STARPU_BUS_STATS=1 .

More detailed profiling information can be enabled by using export STARPU_PROFILING=1 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 by the next chapter.

Detection Stuck Conditions

It may happen that for some reason, StarPU does not make progress for a long period of time. Reason are sometimes due to contention inside StarPU, but sometimes this is due to external reasons, such as stuck MPI driver, or CUDA driver, etc.

export STARPU_WATCHDOG_TIMEOUT=10000

allows to make StarPU print an error message whenever StarPU does not terminate any task for 10ms. In addition to that,

export STARPU_WATCHDOG_CRASH=1

raises SIGABRT in that condition, thus allowing to catch the situation in gdb. It can also be useful to type "handle SIGABRT nopass" in gdb to be able to let the process continue, after inspecting the state of the process.

CUDA-specific Optimizations

Due to CUDA limitations, StarPU will have a hard time overlapping its own communications and the codelet computations if the application does not use a dedicated CUDA stream for its computations instead of the default stream, which synchronizes all operations of the GPU. StarPU provides one by the use of starpu_cuda_get_local_stream() which can be used by all CUDA codelet operations to avoid this issue. For instance:

func <<<grid,block,0,starpu_cuda_get_local_stream()>>> (foo, bar);
cudaStreamSynchronize(starpu_cuda_get_local_stream());

Calling starpu_cublas_init() makes StarPU already do appropriate calls for the CUBLAS library. Some libraries like Magma may however change the current stream, 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.

Unfortunately, some CUDA libraries do not have stream variants of kernels. That will lower the potential for overlapping.

Performance Debugging

To get an idea of what is happening, a lot of performance feedback is available, detailed in the next chapter. The various informations should be checked for.

  • What does the Gantt diagram look like? (see Creating a Gantt Diagram)
    • 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 Performance Of Codelets.
    • 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 Creating a DAG With Graphviz).
    • 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 Performance Of Codelets). 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 Using The Temanejo Task Debugger) to visualize the task graph more easily.

Simulated Performance

StarPU can use Simgrid in order to simulate execution on an arbitrary platform.

your application for simulation.

There are a few technical details which need to be handled for an application to be simulated through Simgrid.

If the application uses gettimeofday to make its performance measurements, the real time will be used, which will be bogus. To get the simulated time, it has to use starpu_timing_now() which returns the virtual timestamp in us.

For some technical reason, the application's .c file which contains main() has to be recompiled with starpu_simgrid_wrap.h, which in the simgrid case will # define main() into starpu_main(), and it is libstarpu which will provide the real main() and will call the application's main().

To be able to test with crazy data sizes, one may want to only allocate application data if STARPU_SIMGRID is not defined. Passing a NULL pointer to starpu_data_register functions is fine, data will never be read/written to by StarPU in Simgrid mode anyway.

To be able to run the application with e.g. CUDA simulation on a system which does not have CUDA installed, one can fill the cuda_funcs with (void*)1, to express that there is a CUDA implementation, even if one does not actually provide it. StarPU will never actually run it in Simgrid mode anyway.

Calibration

The idea is to first compile StarPU normally, and run the application, so as to automatically benchmark the bus and the codelets.

$ ./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

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.

Simulation

Then, recompile StarPU, passing --enable-simgrid to ./configure.

$ ./configure --enable-simgrid

To specify the location of SimGrid, you can either set the environment variables SIMGRID_CFLAGS and SIMGRID_LIBS, or use the configure options --with-simgrid-dir, --with-simgrid-include-dir and --with-simgrid-lib-dir, for example

$ ./configure --with-simgrid-dir=/opt/local/simgrid

You can then re-run the application.

$ make
$ STARPU_SCHED=dmda ./examples/matvecmult/matvecmult
TEST FAILED !!!

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

$ 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

The number of devices can be chosen as usual with STARPU_NCPU, STARPU_NCUDA, and STARPU_NOPENCL, and the amount of GPU memory with STARPU_LIMIT_CUDA_MEM, STARPU_LIMIT_CUDA_devid_MEM, STARPU_LIMIT_OPENCL_MEM, and STARPU_LIMIT_OPENCL_devid_MEM.

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 STARPU_HOSTNAME to the name of the actual machine, to make StarPU use the performance models of the simulated machine even on the desktop machine.

If the desktop machine does not have CUDA or OpenCL, StarPU is still able to use simgrid to simulate execution with CUDA/OpenCL devices, but the application source code will probably disable the CUDA and OpenCL codelets in thatcd sc case. Since during simgrid execution, the functions of the codelet are actually not called, one can use dummy functions such as the following to still permit CUDA or OpenCL execution:

Simulation examples

StarPU ships a few performance models for a couple of systems: attila and mirage. See section Simulated benchmarks for the details.

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 STARPU_SIMGRID_CUDA_MALLOC_COST and STARPU_SIMGRID_CUDA_QUEUE_COST environment variables.

applications

By default, simgrid uses its own implementation of threads, which prevents gdb from being able to inspect stacks of all threads. To be able to fully debug an application running with simgrid, pass the –cfg=contexts/factory:thread option to the application, to make simgrid use system threads, which gdb will be able to manipulate as usual.

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
};
starpu-1.1.5/doc/doxygen/html/group__API__Data__Partition.html0000644000373600000000000017374312571536763021324 00000000000000 StarPU Handbook: Data Partition
StarPU Handbook
Data Partition

Data Structures

struct  starpu_data_filter

Basic API

void starpu_data_partition (starpu_data_handle_t initial_handle, struct starpu_data_filter *f)
void starpu_data_unpartition (starpu_data_handle_t root_data, unsigned gathering_node)
int starpu_data_get_nb_children (starpu_data_handle_t handle)
starpu_data_handle_t starpu_data_get_child (starpu_data_handle_t handle, unsigned i)
starpu_data_handle_t starpu_data_get_sub_data (starpu_data_handle_t root_data, unsigned depth,...)
starpu_data_handle_t starpu_data_vget_sub_data (starpu_data_handle_t root_data, unsigned depth, va_list pa)
void starpu_data_map_filters (starpu_data_handle_t root_data, unsigned nfilters,...)
void starpu_data_vmap_filters (starpu_data_handle_t root_data, unsigned nfilters, va_list pa)

Predefined Vector Filter Functions

This section gives a partial list of the predefined partitioning functions for vector data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h.

void starpu_vector_filter_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_vector_filter_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_vector_filter_list (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_vector_filter_divide_in_2 (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)

Predefined Matrix Filter Functions

This section gives a partial list of the predefined partitioning functions for matrix data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h.

void starpu_matrix_filter_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_matrix_filter_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_matrix_filter_vertical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_matrix_filter_vertical_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)

Predefined Block Filter Functions

This section gives a partial list of the predefined partitioning functions for block data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h. A usage example is available in examples/filters/shadow3d.c

void starpu_block_filter_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_vertical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_vertical_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_depth_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_block_filter_depth_block_shadow (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)

Predefined BCSR Filter Functions

This section gives a partial list of the predefined partitioning functions for BCSR data. Examples on how to use them are shown in Partitioning Data. The complete list can be found in the file starpu_data_filters.h.

void starpu_bcsr_filter_canonical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)
void starpu_csr_filter_vertical_block (void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts)

Detailed Description


Data Structure Documentation

struct starpu_data_filter

The filter structure describes a data partitioning operation, to be given to the starpu_data_partition() function.

Data Fields

void(* filter_func )(void *father_interface, void *child_interface, struct starpu_data_filter *, unsigned id, unsigned nparts)
unsigned nchildren
unsigned(* get_nchildren )(struct starpu_data_filter *, starpu_data_handle_t initial_handle)
struct
starpu_data_interface_ops *(* 
get_child_ops )(struct starpu_data_filter *, unsigned id)
unsigned filter_arg
void * filter_arg_ptr

Field Documentation

starpu_data_filter::filter_func

This function fills the child_interface structure with interface information for the id-th child of the parent father_interface (among nparts).

starpu_data_filter::nchildren

This is the number of parts to partition the data into.

starpu_data_filter::get_nchildren

This returns the number of children. This can be used instead of nchildren when the number of children depends on the actual data (e.g. the number of blocks in a sparse matrix).

starpu_data_filter::get_child_ops
read

In case the resulting children use a different data interface, this function returns which interface is used by child number id.

starpu_data_filter::filter_arg

Allow to define an additional parameter for the filter function.

starpu_data_filter::filter_arg_ptr

Allow to define an additional pointer parameter for the filter function, such as the sizes of the different parts.

Function Documentation

void starpu_data_partition ( starpu_data_handle_t  initial_handle,
struct starpu_data_filter f 
)

This requests partitioning one StarPU data initial_handle into several subdata according to the filter f.

Here an example of how to use the function.

struct starpu_data_filter f = {
.nchildren = nslicesx,
.get_nchildren = NULL,
.get_child_ops = NULL
};
starpu_data_partition(A_handle, &f);
void starpu_data_unpartition ( starpu_data_handle_t  root_data,
unsigned  gathering_node 
)

This unapplies one filter, thus unpartitioning the data. The pieces of data are collected back into one big piece in the gathering_node (usually 0). Tasks working on the partitioned data must be already finished when calling starpu_data_unpartition().

Here an example of how to use the function.

int starpu_data_get_nb_children ( starpu_data_handle_t  handle)

This function returns the number of children.

starpu_data_handle_t starpu_data_get_child ( starpu_data_handle_t  handle,
unsigned  i 
)

Return the ith child of the given handle, which must have been partitionned beforehand.

starpu_data_handle_t starpu_data_get_sub_data ( starpu_data_handle_t  root_data,
unsigned  depth,
  ... 
)

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. root_data is the parent data that was partitioned. 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.

h = starpu_data_get_sub_data(A_handle, 1, taskx);
starpu_data_handle_t starpu_data_vget_sub_data ( starpu_data_handle_t  root_data,
unsigned  depth,
va_list  pa 
)

This function is similar to starpu_data_get_sub_data() but uses a va_list for the parameter list.

void starpu_data_map_filters ( starpu_data_handle_t  root_data,
unsigned  nfilters,
  ... 
)

Applies nfilters filters to the handle designated by root_handle recursively. nfilters pointers to variables of the type starpu_data_filter should be given.

void starpu_data_vmap_filters ( starpu_data_handle_t  root_data,
unsigned  nfilters,
va_list  pa 
)

Applies nfilters filters to the handle designated by root_handle recursively. It uses a va_list of pointers to variables of the type starpu_data_filter.

void starpu_vector_filter_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

Return in child_interface the id th element of the vector represented by father_interface once partitioned in nparts chunks of equal size.

void starpu_vector_filter_block_shadow ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

Return in child_interface the id th element of the vector represented by father_interface once partitioned in 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 f must be the shadow size casted into void*. IMPORTANT: This can only be used for read-only access, as no coherency is enforced for the shadowed parts. An usage example is available in examples/filters/shadow.c

void starpu_vector_filter_list ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

Return in child_interface the id th element of the vector represented by father_interface once partitioned into nparts chunks according to the filter_arg_ptr field of f. The filter_arg_ptr field must point to an array of nparts uint32_t elements, each of which specifies the number of elements in each chunk of the partition.

void starpu_vector_filter_divide_in_2 ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

Return in child_interface the id th element of the vector represented by father_interface once partitioned in 2 chunks of equal size, ignoring nparts. Thus, id must be 0 or 1.

void starpu_matrix_filter_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a dense Matrix along the x dimension, thus getting (x/nparts ,y) matrices. If nparts does not divide x, the last submatrix contains the remainder.

void starpu_matrix_filter_block_shadow ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a dense Matrix along the x dimension, with a shadow border filter_arg_ptr, thus getting ((x-2*shadow)/nparts +2*shadow,y) matrices. If 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_vertical_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a dense Matrix along the y dimension, thus getting (x,y/nparts) matrices. If nparts does not divide y, the last submatrix contains the remainder.

void starpu_matrix_filter_vertical_block_shadow ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a dense Matrix along the y dimension, with a shadow border filter_arg_ptr, thus getting (x,(y-2*shadow)/nparts +2*shadow) matrices. If 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_block_filter_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block along the X dimension, thus getting (x/nparts ,y,z) 3D matrices. If nparts does not divide x, the last submatrix contains the remainder.

void starpu_block_filter_block_shadow ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block along the X dimension, with a shadow border filter_arg_ptr, thus getting ((x-2*shadow)/nparts +2*shadow,y,z) blocks. If 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_vertical_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block along the Y dimension, thus getting (x,y/nparts ,z) blocks. If nparts does not divide y, the last submatrix contains the remainder.

void starpu_block_filter_vertical_block_shadow ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block along the Y dimension, with a shadow border filter_arg_ptr, thus getting (x,(y-2*shadow)/nparts +2*shadow,z) 3D matrices. If 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_depth_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block along the Z dimension, thus getting (x,y,z/nparts) blocks. If nparts does not divide z, the last submatrix contains the remainder.

void starpu_block_filter_depth_block_shadow ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block along the Z dimension, with a shadow border filter_arg_ptr, thus getting (x,y,(z-2*shadow)/nparts +2*shadow) blocks. If 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_bcsr_filter_canonical_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block-sparse matrix into dense matrices.

void starpu_csr_filter_vertical_block ( void *  father_interface,
void *  child_interface,
struct starpu_data_filter f,
unsigned  id,
unsigned  nparts 
)

This partitions a block-sparse matrix into vertical block-sparse matrices.

starpu-1.1.5/doc/doxygen/html/dir_0c28d98c6957c19220c97a6def116a79.html0000644000373600000000000003170112571536763021143 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/include/ Directory Reference
include Directory Reference
starpu-1.1.5/doc/doxygen/html/functions_vars_0x76.html0000644000373600000000000001640112571536763017672 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/files.html0000644000373600000000000004073312571536763015152 00000000000000 StarPU Handbook: File List
StarPU Handbook
File List
starpu-1.1.5/doc/doxygen/html/starpu_8h.html0000644000373600000000000003076112571536757015770 00000000000000 StarPU Handbook: starpu.h File Reference
starpu.h File Reference
#include <stdlib.h>
#include <stdint.h>
#include <starpu_config.h>
#include <starpu_opencl.h>
#include <starpu_thread.h>
#include <starpu_thread_util.h>
#include <starpu_util.h>
#include <starpu_data.h>
#include <starpu_data_interfaces.h>
#include <starpu_data_filters.h>
#include <starpu_stdlib.h>
#include <starpu_perfmodel.h>
#include <starpu_worker.h>
#include <starpu_task.h>
#include <starpu_task_list.h>
#include <starpu_task_util.h>
#include <starpu_sched_ctx.h>
#include <starpu_expert.h>
#include <starpu_rand.h>
#include <starpu_cuda.h>
#include <starpu_cublas.h>
#include <starpu_bound.h>
#include <starpu_hash.h>
#include <starpu_profiling.h>
#include <starpu_top.h>
#include <starpu_fxt.h>
#include <starpu_driver.h>
#include <starpu_simgrid_wrap.h>
#include "starpu_deprecated_api.h"

Go to the source code of this file.

Data Structures

struct  starpu_conf

Functions

int starpu_conf_init (struct starpu_conf *conf)
int starpu_init (struct starpu_conf *conf) STARPU_WARN_UNUSED_RESULT
void starpu_pause ()
void starpu_resume ()
void starpu_shutdown (void)
void starpu_topology_print (FILE *f)
int starpu_asynchronous_copy_disabled (void)
int starpu_asynchronous_cuda_copy_disabled (void)
int starpu_asynchronous_opencl_copy_disabled (void)
void starpu_display_stats ()
void starpu_get_version (int *major, int *minor, int *release)

Detailed Description

starpu-1.1.5/doc/doxygen/html/sc__hypervisor_8h.html0000644000373600000000000003441312571536757017506 00000000000000 StarPU Handbook: sc_hypervisor.h File Reference
sc_hypervisor.h File Reference
#include <starpu.h>
#include <starpu_sched_ctx_hypervisor.h>
#include <sc_hypervisor_config.h>
#include <sc_hypervisor_monitoring.h>
#include <math.h>

Go to the source code of this file.

Data Structures

struct  sc_hypervisor_policy

Functions

void * sc_hypervisor_init (struct sc_hypervisor_policy *policy)
void sc_hypervisor_shutdown (void)
void sc_hypervisor_register_ctx (unsigned sched_ctx, double total_flops)
void sc_hypervisor_unregister_ctx (unsigned sched_ctx)
void sc_hypervisor_post_resize_request (unsigned sched_ctx, int task_tag)
void sc_hypervisor_resize_ctxs (unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
void sc_hypervisor_stop_resize (unsigned sched_ctx)
void sc_hypervisor_start_resize (unsigned sched_ctx)
const char * sc_hypervisor_get_policy ()
void sc_hypervisor_add_workers_to_sched_ctx (int *workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx)
void sc_hypervisor_remove_workers_from_sched_ctx (int *workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now)
void sc_hypervisor_move_workers (unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *workers_to_move, unsigned nworkers_to_move, unsigned now)
void sc_hypervisor_size_ctxs (unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
unsigned sc_hypervisor_get_size_req (unsigned **sched_ctxs, int *nsched_ctxs, int **workers, int *nworkers)
void sc_hypervisor_save_size_req (unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
void sc_hypervisor_free_size_req (void)
unsigned sc_hypervisor_can_resize (unsigned sched_ctx)
void sc_hypervisor_set_type_of_task (struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size)
void sc_hypervisor_update_diff_total_flops (unsigned sched_ctx, double diff_total_flops)
void sc_hypervisor_update_diff_elapsed_flops (unsigned sched_ctx, double diff_task_flops)
void sc_hypervisor_update_resize_interval (unsigned *sched_ctxs, int nsched_ctxs)

Variables

starpu_pthread_mutex_t act_hypervisor_mutex

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__util_8h_source.html0000644000373600000000000020064112571536757020540 00000000000000 StarPU Handbook: starpu_util.h Source File
starpu_util.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2015 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_UTIL_H__
19 #define __STARPU_UTIL_H__
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <assert.h>
25 
26 #include <starpu_config.h>
27 
28 #ifdef __GLIBC__
29 #include <execinfo.h>
30 #endif
31 
32 #ifdef __cplusplus
33 extern "C"
34 {
35 #endif
36 
37 #if defined __GNUC__ && defined __GNUC_MINOR__
38 # define STARPU_GNUC_PREREQ(maj, min) \
39  ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
40 #else
41 # define STARPU_GNUC_PREREQ(maj, min) 0
42 #endif
43 
44 #ifdef __GNUC__
45 # define STARPU_UNLIKELY(expr) (__builtin_expect(!!(expr),0))
46 # define STARPU_LIKELY(expr) (__builtin_expect(!!(expr),1))
47 # define STARPU_ATTRIBUTE_UNUSED __attribute__((unused))
48 # define STARPU_ATTRIBUTE_NORETURN __attribute__((noreturn))
49 # define STARPU_ATTRIBUTE_INTERNAL __attribute__ ((visibility ("internal")))
50 # define STARPU_ATTRIBUTE_MALLOC __attribute__((malloc))
51 # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
52 # define STARPU_ATTRIBUTE_PURE __attribute__((pure))
53 # define STARPU_ATTRIBUTE_ALIGNED(size) __attribute__((aligned(size)))
54 #else
55 # define STARPU_UNLIKELY(expr) (expr)
56 # define STARPU_LIKELY(expr) (expr)
57 # define STARPU_ATTRIBUTE_UNUSED
58 # define STARPU_ATTRIBUTE_NORETURN
59 # define STARPU_ATTRIBUTE_INTERNAL
60 # define STARPU_ATTRIBUTE_MALLOC
61 # define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT
62 # define STARPU_ATTRIBUTE_PURE
63 # define STARPU_ATTRIBUTE_ALIGNED(size)
64 #endif
65 
66 /* Note that if we're compiling C++, then just use the "inline"
67  keyword, since it's part of C++ */
68 #if defined(c_plusplus) || defined(__cplusplus)
69 # define STARPU_INLINE inline
70 #elif defined(_MSC_VER) || defined(__HP_cc)
71 # define STARPU_INLINE __inline
72 #else
73 # define STARPU_INLINE __inline__
74 #endif
75 
76 #if STARPU_GNUC_PREREQ(3, 1) && !defined(BUILDING_STARPU) && !defined(STARPU_USE_DEPRECATED_API) && !defined(STARPU_USE_DEPRECATED_ONE_ZERO_API)
77 #define STARPU_DEPRECATED __attribute__((__deprecated__))
78 #else
79 #define STARPU_DEPRECATED
80 #endif /* __GNUC__ */
81 
82 #if STARPU_GNUC_PREREQ(3,3)
83 #define STARPU_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
84 #else
85 #define STARPU_WARN_UNUSED_RESULT
86 #endif /* __GNUC__ */
87 
88 #define STARPU_POISON_PTR ((void *)0xdeadbeef)
89 
90 #define STARPU_MIN(a,b) ((a)<(b)?(a):(b))
91 #define STARPU_MAX(a,b) ((a)<(b)?(b):(a))
92 
93 #define STARPU_BACKTRACE_LENGTH 32
94 #ifdef __GLIBC__
95 # define STARPU_DUMP_BACKTRACE() do { \
96  void *__ptrs[STARPU_BACKTRACE_LENGTH]; \
97  int __n = backtrace(__ptrs, STARPU_BACKTRACE_LENGTH); \
98  backtrace_symbols_fd(__ptrs, __n, 2); \
99 } while (0)
100 #else
101 # define STARPU_DUMP_BACKTRACE() do { } while (0)
102 #endif
103 
104 #ifdef STARPU_NO_ASSERT
105 #define STARPU_ASSERT(x) do { } while(0)
106 #define STARPU_ASSERT_MSG(x, msg, ...) do { } while(0)
107 #else
108 # if defined(__CUDACC__) && defined(STARPU_HAVE_WINDOWS)
109 # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) *(int*)NULL = 0; } while(0)
110 # define STARPU_ASSERT_MSG(x, msg, ...) do { if (STARPU_UNLIKELY(!(x))) { fprintf(stderr, "[starpu][%s][assert failure] " msg "\n", __starpu_func__, ## __VA_ARGS__); *(int*)NULL = 0; }} while(0)
111 # else
112 # define STARPU_ASSERT(x) do { if (STARPU_UNLIKELY(!(x))) { STARPU_DUMP_BACKTRACE(); assert(x); } } while (0)
113 # define STARPU_ASSERT_MSG(x, msg, ...) do { if (STARPU_UNLIKELY(!(x))) { fprintf(stderr, "[starpu][%s][assert failure] " msg "\n", __starpu_func__, ## __VA_ARGS__); STARPU_DUMP_BACKTRACE(); assert(x); } } while(0)
114 
115 # endif
116 #endif
117 
118 #define STARPU_ABORT() do { \
119  fprintf(stderr, "[starpu][abort][%s()@%s:%d]\n", __starpu_func__, __FILE__, __LINE__); \
120  abort(); \
121 } while(0)
122 
123 #define STARPU_ABORT_MSG(msg, ...) do { \
124  fprintf(stderr, "[starpu][abort][%s()@%s:%d] " msg "\n", __starpu_func__, __FILE__, __LINE__, ## __VA_ARGS__); \
125  abort(); \
126 } while(0)
127 
128 #if defined(STARPU_HAVE_STRERROR_R)
129 # define STARPU_CHECK_RETURN_VALUE(err, message, ...) {if (STARPU_UNLIKELY(err != 0)) { \
130  char xmessage[256]; strerror_r(-err, xmessage, 256); \
131  fprintf(stderr, "[starpu] Unexpected value: <%d:%s> returned for " message "\n", err, xmessage, ## __VA_ARGS__); \
132  STARPU_ABORT(); }}
133 # define STARPU_CHECK_RETURN_VALUE_IS(err, value, message, ...) {if (STARPU_UNLIKELY(err != value)) { \
134  char xmessage[256]; strerror_r(-err, xmessage, 256); \
135  fprintf(stderr, "[starpu] Unexpected value: <%d!=%d:%s> returned for " message "\n", err, value, xmessage, ## __VA_ARGS__); \
136  STARPU_ABORT(); }}
137 #else
138 # define STARPU_CHECK_RETURN_VALUE(err, message, ...) {if (STARPU_UNLIKELY(err != 0)) { \
139  fprintf(stderr, "[starpu] Unexpected value: <%d> returned for " message "\n", err, ## __VA_ARGS__); \
140  STARPU_ABORT(); }}
141 # define STARPU_CHECK_RETURN_VALUE_IS(err, value, message, ...) {if (STARPU_UNLIKELY(err != value)) { \
142  fprintf(stderr, "[starpu] Unexpected value: <%d != %d> returned for " message "\n", err, value, ## __VA_ARGS__); \
143  STARPU_ABORT(); }}
144 #endif /* STARPU_HAVE_STRERROR_R */
145 
146 #if defined(__i386__) || defined(__x86_64__)
147 
148 static __starpu_inline unsigned starpu_cmpxchg(unsigned *ptr, unsigned old, unsigned next)
149 {
150  __asm__ __volatile__("lock cmpxchgl %2,%1": "+a" (old), "+m" (*ptr) : "q" (next) : "memory");
151  return old;
152 }
153 static __starpu_inline unsigned starpu_xchg(unsigned *ptr, unsigned next)
154 {
155  /* Note: xchg is always locked already */
156  __asm__ __volatile__("xchgl %1,%0": "+m" (*ptr), "+q" (next) : : "memory");
157  return next;
158 }
159 #define STARPU_HAVE_XCHG
160 #endif
161 
162 #define STARPU_ATOMIC_SOMETHING(name,expr) \
163 static __starpu_inline unsigned starpu_atomic_##name(unsigned *ptr, unsigned value) \
164 { \
165  unsigned old, next; \
166  while (1) \
167  { \
168  old = *ptr; \
169  next = expr; \
170  if (starpu_cmpxchg(ptr, old, next) == old) \
171  break; \
172  }; \
173  return expr; \
174 }
175 
176 #ifdef STARPU_HAVE_SYNC_FETCH_AND_ADD
177 #define STARPU_ATOMIC_ADD(ptr, value) (__sync_fetch_and_add ((ptr), (value)) + (value))
178 #elif defined(STARPU_HAVE_XCHG)
179 STARPU_ATOMIC_SOMETHING(add, old + value)
180 #define STARPU_ATOMIC_ADD(ptr, value) starpu_atomic_add(ptr, value)
181 #endif
182 
183 #ifdef STARPU_HAVE_SYNC_FETCH_AND_OR
184 #define STARPU_ATOMIC_OR(ptr, value) (__sync_fetch_and_or ((ptr), (value)))
185 #elif defined(STARPU_HAVE_XCHG)
186 STARPU_ATOMIC_SOMETHING(or, old | value)
187 #define STARPU_ATOMIC_OR(ptr, value) starpu_atomic_or(ptr, value)
188 #endif
189 
190 #ifdef STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP
191 #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (__sync_bool_compare_and_swap ((ptr), (old), (value)))
192 #elif defined(STARPU_HAVE_XCHG)
193 #define STARPU_BOOL_COMPARE_AND_SWAP(ptr, old, value) (starpu_cmpxchg((ptr), (old), (value)) == (old))
194 #endif
195 
196 #ifdef STARPU_HAVE_SYNC_LOCK_TEST_AND_SET
197 #define STARPU_TEST_AND_SET(ptr, value) (__sync_lock_test_and_set ((ptr), (value)))
198 #define STARPU_RELEASE(ptr) (__sync_lock_release ((ptr)))
199 #elif defined(STARPU_HAVE_XCHG)
200 #define STARPU_TEST_AND_SET(ptr, value) (starpu_xchg((ptr), (value)))
201 #define STARPU_RELEASE(ptr) (starpu_xchg((ptr), 0))
202 #endif
203 
204 #ifdef STARPU_HAVE_SYNC_SYNCHRONIZE
205 #define STARPU_SYNCHRONIZE() __sync_synchronize()
206 #elif defined(__i386__)
207 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory")
208 #elif defined(__x86_64__)
209 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("mfence" ::: "memory")
210 #elif defined(__ppc__) || defined(__ppc64__)
211 #define STARPU_SYNCHRONIZE() __asm__ __volatile__("sync" ::: "memory")
212 #endif
213 
214 #if defined(__i386__) || defined(__KNC__) || defined(__KNF__)
215 #define STARPU_RMB() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory")
216 #define STARPU_WMB() __asm__ __volatile__("lock; addl $0,0(%%esp)" ::: "memory")
217 #elif defined(__x86_64__)
218 #define STARPU_RMB() __asm__ __volatile__("lfence" ::: "memory")
219 #define STARPU_WMB() __asm__ __volatile__("sfence" ::: "memory")
220 #elif defined(__ppc__) || defined(__ppc64__)
221 #define STARPU_RMB() __asm__ __volatile__("sync" ::: "memory")
222 #define STARPU_WMB() __asm__ __volatile__("sync" ::: "memory")
223 #else
224 #define STARPU_RMB() STARPU_SYNCHRONIZE()
225 #define STARPU_WMB() STARPU_SYNCHRONIZE()
226 #endif
227 
228 #ifdef __cplusplus
229 }
230 #endif
231 
232 /* Include this only here so that <starpu_data_interfaces.h> can use the
233  * macros above. */
234 #include <starpu_task.h>
235 
236 #ifdef __cplusplus
237 extern "C"
238 {
239 #endif
240 
241 extern int _starpu_silent;
242 
243 char *starpu_getenv(const char *str);
244 
245 
246 static __starpu_inline int starpu_get_env_number(const char *str)
247 {
248  char *strval;
249 
250  strval = starpu_getenv(str);
251  if (strval)
252  {
253  /* the env variable was actually set */
254  long int val;
255  char *check;
256 
257  val = strtol(strval, &check, 10);
258  if (*check) {
259  fprintf(stderr,"The %s environment variable must contain an integer\n", str);
260  STARPU_ABORT();
261  }
262 
263  /* fprintf(stderr, "ENV %s WAS %d\n", str, val); */
264  return (int)val;
265  }
266  else
267  {
268  /* there is no such env variable */
269  /* fprintf("There was no %s ENV\n", str); */
270  return -1;
271  }
272 }
273 
274 static __starpu_inline int starpu_get_env_number_default(const char *str, int defval)
275 {
276  int ret = starpu_get_env_number(str);
277  if (ret == -1)
278  ret = defval;
279  return ret;
280 }
281 
282 /* Add an event in the execution trace if FxT is enabled */
283 void starpu_trace_user_event(unsigned long code);
284 
285 void starpu_execute_on_each_worker(void (*func)(void *), void *arg, uint32_t where);
286 
287 /* Same as starpu_execute_on_each_worker, except that the task name is specified in the "name" parameter. */
288 void starpu_execute_on_each_worker_ex(void (*func)(void *), void *arg, uint32_t where, const char * name);
289 
290 /* Call func(arg) on every worker in the "workers" array. "num_workers"
291  * indicates the number of workers in this array. This function is
292  * synchronous, but the different workers may execute the function in parallel.
293  * */
294 void starpu_execute_on_specific_workers(void (*func)(void*), void * arg, unsigned num_workers, unsigned * workers, const char * name);
295 
296 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);
297 
298 /* Return the current date in us */
299 double starpu_timing_now(void);
300 
301 #ifdef _WIN32
302 /* Try to fetch the system definition of timespec */
303 #include <sys/types.h>
304 #include <sys/stat.h>
305 #ifdef HAVE_UNISTD_H
306 #include <unistd.h>
307 #endif
308 #include <time.h>
309 #if !defined(_MSC_VER) || defined(BUILDING_STARPU)
310 #include <pthread.h>
311 #endif
312 #if !defined(STARPU_HAVE_STRUCT_TIMESPEC) || defined(_MSC_VER)
313 /* If it didn't get defined in the standard places, then define it ourself */
314 #ifndef STARPU_TIMESPEC_DEFINED
315 #define STARPU_TIMESPEC_DEFINED 1
316 struct timespec {
317  time_t tv_sec; /* Seconds */
318  long tv_nsec; /* Nanoseconds */
319 };
320 #endif /* STARPU_TIMESPEC_DEFINED */
321 #endif /* STARPU_HAVE_STRUCT_TIMESPEC */
322 /* Fetch gettimeofday on mingw/cygwin */
323 #if defined(__MINGW32__) || defined(__CYGWIN__)
324 #include <sys/time.h>
325 #endif
326 #else
327 #include <sys/time.h>
328 #endif /* _WIN32 */
329 
330 #ifdef __cplusplus
331 }
332 #endif
333 
334 #endif /* __STARPU_UTIL_H__ */
starpu-1.1.5/doc/doxygen/html/ExecutionConfigurationThroughEnvironmentVariables.html0000644000373600000000000011264312571536763026162 00000000000000 StarPU Handbook: Execution Configuration Through Environment Variables
Execution Configuration Through Environment Variables

The behavior of the StarPU library and tools may be tuned thanks to the following environment variables.

Configuring Workers

STARPU_NCPU

Specify the number of CPU workers (thus not including workers dedicated to control accelerators). Note that by default, StarPU will not allocate more CPU workers than there are physical CPUs, and that some CPUs are used to control the accelerators.

STARPU_NCPUS

This variable is deprecated. You should use STARPU_NCPU.

STARPU_NCUDA

Specify the number of CUDA devices that StarPU can use. If 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 STARPU_WORKERS_CUDAID. By default, StarPU will create as many CUDA workers as there are CUDA devices.

STARPU_NOPENCL

OpenCL equivalent of the environment variable STARPU_NCUDA.

STARPU_OPENCL_ON_CPUS

By default, the OpenCL driver only enables GPU and accelerator devices. By setting the environment variable STARPU_OPENCL_ON_CPUS to 1, the OpenCL driver will also enable CPU devices.

STARPU_OPENCL_ONLY_ON_CPUS

By default, the OpenCL driver enables GPU and accelerator devices. By setting the environment variable STARPU_OPENCL_ONLY_ON_CPUS to 1, the OpenCL driver will ONLY enable CPU devices.

STARPU_WORKERS_NOBIND

Setting it to non-zero will prevent StarPU from binding its threads to CPUs. This is for instance useful when running the testsuite in parallel.

STARPU_WORKERS_CPUID

Passing an array of integers (starting from 0) in 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.

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 STARPU_WORKERS_CPUID, the workers are bound to the logical CPUs in a round-robin fashion: if STARPU_WORKERS_CPUID = "0 1", the first and the third (resp. second and fourth) workers will be put on CPU #0 (resp. CPU #1).

This variable is ignored if the field starpu_conf::use_explicit_workers_bindid passed to starpu_init() is set.

STARPU_WORKERS_CUDAID

Similarly to the 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

OpenCL equivalent of the 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_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. STARPU_MIN_WORKERSIZE and STARPU_MAX_WORKERSIZE can be used to change this default.

STARPU_MIN_WORKERSIZE

STARPU_MIN_WORKERSIZE permits to specify the minimum size of the combined workers (instead of the default 2)

STARPU_MAX_WORKERSIZE

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

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 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

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

Disable asynchronous copies between CPU and CUDA devices.

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_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

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.

Configuring The Scheduling Engine

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_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

This defines the minimum number of calibration measurements that will be made before considering that the performance model is calibrated. The default value is 10.

STARPU_BUS_CALIBRATE

If this variable is set to 1, the bus is recalibrated during intialization.

STARPU_PREFETCH

This variable indicates whether data prefetching should be enabled (0 means that it is disabled). If prefetching is enabled, when a task is scheduled to be executed e.g. on a GPU, StarPU will request an asynchronous transfer in advance, so that data is already present on the GPU when the task starts. As a result, computation and data transfers are overlapped. Note that prefetching is enabled by default in StarPU.

STARPU_SCHED_ALPHA

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

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

Define the execution time penalty of a joule (Power-based Scheduling).

STARPU_IDLE_POWER

Define the idle power of the machine (Power-based Scheduling).

STARPU_PROFILING

Enable on-line performance monitoring (Enabling On-line Performance Monitoring).

Extensions

SOCL_OCL_LIB_OPENCL

THE SOCL test suite is only run when the environment variable SOCL_OCL_LIB_OPENCL is defined. It should contain the location of the file libOpenCL.so of the OCL ICD implementation.

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

Communication statistics for starpumpi (MPI Support) will be enabled when the environment variable STARPU_COMM_STATS is defined to an value other than 0.

STARPU_MPI_CACHE

Communication cache for starpumpi (MPI Support) will be disabled when the environment variable STARPU_MPI_CACHE is set to 0. It is enabled by default or for any other values of the variable STARPU_MPI_CACHE.

STARPU_MPI_CACHE_STATS

When set to 1, statistics are enabled for the communication cache (MPI Support). For now, it prints messages on the standard output when data are added or removed from the received communication cache.

Miscellaneous And Debug

STARPU_HOME

This specifies the main directory in which StarPU stores its configuration files. The default is $HOME on Unix environments, and $USERPROFILE on Windows environments.

STARPU_PERF_MODEL_DIR

This specifies the main directory in which StarPU stores its performance model files. The default is $STARPU_HOME/.starpu/sampling.

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

This specifies the directory where the OpenCL codelet source files are located. The function starpu_opencl_load_program_source() looks for the codelet in the current directory, in the directory specified by the environment variable 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

This variable allows to disable verbose mode at runtime when StarPU has been configured with the option --enable-verbose. It also disables the display of StarPU information and warning messages.

STARPU_LOGFILENAME

This variable specifies in which file the debugging output should be saved to.

STARPU_FXT_PREFIX

This variable specifies in which directory to save the trace generated if FxT is enabled. It needs to have a trailing '/' character.

STARPU_LIMIT_CUDA_devid_MEM

This variable specifies the maximum number of megabytes that should be available to the application on the CUDA device with the identifier devid. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory. When defined, the variable overwrites the value of the variable STARPU_LIMIT_CUDA_MEM.

STARPU_LIMIT_CUDA_MEM

This variable specifies the maximum number of megabytes that should be available to the application on each CUDA devices. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory.

STARPU_LIMIT_OPENCL_devid_MEM

This variable specifies the maximum number of megabytes that should be available to the application on the OpenCL device with the identifier devid. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory. When defined, the variable overwrites the value of the variable STARPU_LIMIT_OPENCL_MEM.

STARPU_LIMIT_OPENCL_MEM

This variable specifies the maximum number of megabytes that should be available to the application on each OpenCL devices. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory.

STARPU_LIMIT_CPU_MEM

This variable specifies the maximum number of megabytes that should be available to the application on each CPU device. This variable is intended to be used for experimental purposes as it emulates devices that have a limited amount of memory. Setting it enables allocation cache in main memory

STARPU_LIMIT_MAX_NSUBMITTED_TASKS

This variable allows the user to control the task submission flow by specifying to StarPU a maximum number of submitted tasks allowed at a given time, i.e. when this limit is reached task submission becomes blocking until enough tasks have completed, specified by STARPU_LIMIT_MIN_NSUBMITTED_TASKS. Setting it enables allocation cache buffer reuse in main memory.

STARPU_LIMIT_MIN_NSUBMITTED_TASKS

This variable allows the user to control the task submission flow by specifying to StarPU a submitted task threshold to wait before unblocking task submission. This variable has to be used in conjunction with STARPU_LIMIT_MAX_NSUBMITTED_TASKS which puts the task submission thread to sleep. Setting it enables allocation cache buffer reuse in main memory.

STARPU_TRACE_BUFFER_SIZE

This sets the buffer size for recording trace events in MiB. Setting it to a big size allows to avoid pauses in the trace while it is recorded on the disk. This however also consumes memory, of course. The default value is 64.

STARPU_GENERATE_TRACE

When set to 1, this variable indicates that StarPU should automatically generate a Paje trace when starpu_shutdown() is called.

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 (Memory Feedback).

STARPU_BUS_STATS

When defined, statistics about data transfers will be displayed when calling starpu_shutdown() (Profiling).

STARPU_WORKER_STATS

When defined, statistics about the workers will be displayed when calling starpu_shutdown() (Profiling). When combined with the environment variable STARPU_PROFILING, it displays the power consumption (Power-based Scheduling).

STARPU_STATS

When set to 0, data statistics will not be displayed at the end of the execution of an application (Data Statistics).

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). Should be used in combination with STARPU_WATCHDOG_CRASH (see Detection Stuck Conditions).

STARPU_WATCHDOG_CRASH

When set to a value other than 0, it triggers a crash when the watch dog is reached, thus allowing to catch the situation in gdb, etc (see Detection Stuck Conditions)

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_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). STARPU_RAND_SEED allows to set the seed to a specific value.

Configuring The Hypervisor

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

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

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

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

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

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

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.1.5/doc/doxygen/html/Files.html0000644000373600000000000001141212571536763015102 00000000000000 StarPU Handbook: Files
Files
starpu-1.1.5/doc/doxygen/html/globals_enum.html0000644000373600000000000001612312571536763016513 00000000000000 StarPU Handbook: Globals
StarPU Handbook
 
starpu-1.1.5/doc/doxygen/html/group__API__Scheduling__Contexts.html0000644000373600000000000015243612571536763022372 00000000000000 StarPU Handbook: Scheduling Contexts
StarPU Handbook
Scheduling Contexts

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. More...

Data Structures

struct  starpu_sched_ctx_performance_counters

Scheduling Contexts Basic API

#define STARPU_SCHED_CTX_POLICY_NAME
#define STARPU_SCHED_CTX_POLICY_STRUCT
#define STARPU_SCHED_CTX_POLICY_MIN_PRIO
#define STARPU_SCHED_CTX_POLICY_MAX_PRIO
unsigned starpu_sched_ctx_create (int *workerids_ctx, int nworkers_ctx, const char *sched_ctx_name,...)
unsigned starpu_sched_ctx_create_inside_interval (const char *policy_name, const char *sched_name, int min_ncpus, int max_ncpus, int min_ngpus, int max_ngpus, unsigned allow_overlap)
void starpu_sched_ctx_register_close_callback (unsigned sched_ctx_id, void(*close_callback)(unsigned sched_ctx_id, void *args), void *args)
void starpu_sched_ctx_add_workers (int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id)
void starpu_sched_ctx_remove_workers (int *workerids_ctx, int nworkers_ctx, unsigned sched_ctx_id)
void starpu_sched_ctx_delete (unsigned sched_ctx_id)
void starpu_sched_ctx_set_inheritor (unsigned sched_ctx_id, unsigned inheritor)
void starpu_sched_ctx_set_context (unsigned *sched_ctx_id)
unsigned starpu_sched_ctx_get_context (void)
void starpu_sched_ctx_stop_task_submission (void)
void starpu_sched_ctx_finished_submit (unsigned sched_ctx_id)
unsigned starpu_sched_ctx_get_workers_list (unsigned sched_ctx_id, int **workerids)
unsigned starpu_sched_ctx_get_nworkers (unsigned sched_ctx_id)
unsigned starpu_sched_ctx_get_nshared_workers (unsigned sched_ctx_id, unsigned sched_ctx_id2)
unsigned starpu_sched_ctx_contains_worker (int workerid, unsigned sched_ctx_id)
unsigned starpu_sched_ctx_worker_get_id (unsigned sched_ctx_id)
unsigned starpu_sched_ctx_overlapping_ctxs_on_worker (int workerid)

Scheduling Context Priorities

#define STARPU_MIN_PRIO
#define STARPU_MAX_PRIO
#define STARPU_DEFAULT_PRIO
int starpu_sched_ctx_set_min_priority (unsigned sched_ctx_id, int min_prio)
int starpu_sched_ctx_set_max_priority (unsigned sched_ctx_id, int max_prio)
int starpu_sched_ctx_get_min_priority (unsigned sched_ctx_id)
int starpu_sched_ctx_get_max_priority (unsigned sched_ctx_id)

Scheduling Context Worker Collection

struct starpu_worker_collectionstarpu_sched_ctx_create_worker_collection (unsigned sched_ctx_id, enum starpu_worker_collection_type type)
void starpu_sched_ctx_delete_worker_collection (unsigned sched_ctx_id)
struct starpu_worker_collectionstarpu_sched_ctx_get_worker_collection (unsigned sched_ctx_id)

Scheduling Context Link with Hypervisor

void starpu_sched_ctx_set_perf_counters (unsigned sched_ctx_id, void *perf_counters)
void starpu_sched_ctx_call_pushed_task_cb (int workerid, unsigned sched_ctx_id)
void starpu_sched_ctx_notify_hypervisor_exists (void)
unsigned starpu_sched_ctx_check_if_hypervisor_exists (void)
void starpu_sched_ctx_set_policy_data (unsigned sched_ctx_id, void *policy_data)
void * starpu_sched_ctx_get_policy_data (unsigned sched_ctx_id)

Detailed Description

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.


Data Structure Documentation

struct starpu_sched_ctx_performance_counters

Performance counters used by the starpu to indicate the hypervisor how the application and the resources are executing.

Data Fields

void(* notify_idle_cycle )(unsigned sched_ctx_id, int worker, double idle_time)
void(* notify_poped_task )(unsigned sched_ctx_id, int worker)
void(* notify_pushed_task )(unsigned sched_ctx_id, int worker)
void(* notify_post_exec_task )(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops)
void(* notify_submitted_job )(struct starpu_task *task, uint32_t footprint, size_t data_size)
void(* notify_empty_ctx )(unsigned sched_ctx_id, struct starpu_task *task)
void(* notify_delete_context )(unsigned sched_ctx)

Field Documentation

starpu_sched_ctx_performance_counters::notify_idle_cycle

Informs the hypervisor for how long a worker has been idle in the specified context

starpu_sched_ctx_performance_counters::notify_poped_task

Informs the hypervisor that a task executing a specified number of instructions has been poped from the worker

starpu_sched_ctx_performance_counters::notify_pushed_task

Notifies the hypervisor that a task has been scheduled on the queue of the worker corresponding to the specified context

starpu_sched_ctx_performance_counters::notify_submitted_job

Notifies the hypervisor that a task has just been submitted

starpu_sched_ctx_performance_counters::notify_delete_context

Notifies the hypervisor that the context was deleted

Macro Definition Documentation

#define STARPU_SCHED_CTX_POLICY_NAME

This macro is used when calling starpu_sched_ctx_create() to specify a name for a scheduling policy

#define STARPU_SCHED_CTX_POLICY_STRUCT

This macro is used when calling starpu_sched_ctx_create() to specify a pointer to a scheduling policy

#define STARPU_SCHED_CTX_POLICY_MIN_PRIO

This macro is used when calling starpu_sched_ctx_create() to specify a minimum scheduler priority value.

#define STARPU_SCHED_CTX_POLICY_MAX_PRIO

This macro is used when calling starpu_sched_ctx_create() to specify a maximum scheduler priority value.

#define STARPU_MIN_PRIO

Provided for legacy reasons.

#define STARPU_MAX_PRIO

Provided for legacy reasons.

#define STARPU_DEFAULT_PRIO

By convention, the default priority level should be 0 so that we can statically allocate tasks with a default priority.

Function Documentation

unsigned starpu_sched_ctx_create ( int *  workerids_ctx,
int  nworkers_ctx,
const char *  sched_ctx_name,
  ... 
)

This function creates a scheduling context with the given parameters (see below) and assigns the workers in 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:

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 
)

Create a context indicating an approximate interval of resources

void starpu_sched_ctx_register_close_callback ( unsigned  sched_ctx_id,
void(*)(unsigned sched_ctx_id, void *args)  close_callback,
void *  args 
)

Execute the callback whenever the last task of the context finished executing, it is called with the pramaters: sched_ctx and any other paramter needed by the application (packed in a void*)

void starpu_sched_ctx_add_workers ( int *  workerids_ctx,
int  nworkers_ctx,
unsigned  sched_ctx_id 
)

This function adds dynamically the workers in workerids_ctx to the context sched_ctx_id. The last argument cannot be greater than STARPU_NMAX_SCHED_CTXS.

void starpu_sched_ctx_remove_workers ( int *  workerids_ctx,
int  nworkers_ctx,
unsigned  sched_ctx_id 
)

This function removes the workers in workerids_ctx from the context sched_ctx_id. The last argument cannot be greater than STARPU_NMAX_SCHED_CTXS.

void starpu_sched_ctx_delete ( unsigned  sched_ctx_id)

Delete scheduling context sched_ctx_id and transfer remaining workers to the inheritor scheduling context.

void starpu_sched_ctx_set_inheritor ( unsigned  sched_ctx_id,
unsigned  inheritor 
)

Indicate which context whill inherit the resources of this context when he will be deleted.

void starpu_sched_ctx_set_context ( unsigned *  sched_ctx_id)

Set the scheduling context the subsequent tasks will be submitted to

unsigned starpu_sched_ctx_get_context ( void  )

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().

void starpu_sched_ctx_stop_task_submission ( 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_finished_submit ( unsigned  sched_ctx_id)

Indicate starpu that the application finished submitting to this context in order to move the workers to the inheritor as soon as possible.

unsigned starpu_sched_ctx_get_workers_list ( unsigned  sched_ctx_id,
int **  workerids 
)

Returns the list of workers in the array workerids, the returned value is the number of workers. The user should free the workerids table after finishing using it (it is allocated inside the function with the proper size)

unsigned starpu_sched_ctx_get_nworkers ( unsigned  sched_ctx_id)

Return the number of workers managed by the specified contexts (Usually needed to verify if it manages any workers or if it should be blocked)

unsigned starpu_sched_ctx_get_nshared_workers ( unsigned  sched_ctx_id,
unsigned  sched_ctx_id2 
)

Return the number of workers shared by two contexts.

unsigned starpu_sched_ctx_contains_worker ( int  workerid,
unsigned  sched_ctx_id 
)

Return 1 if the worker belongs to the context and 0 otherwise

unsigned starpu_sched_ctx_worker_get_id ( 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_overlapping_ctxs_on_worker ( int  workerid)

Check if a worker is shared between several contexts

int starpu_sched_ctx_set_min_priority ( unsigned  sched_ctx_id,
int  min_prio 
)

Defines the minimum task priority level supported by the scheduling policy of the given scheduler context. The default minimum priority level is the same as the default priority level which is 0 by convention. The application may access that value by calling the function starpu_sched_ctx_get_min_priority(). This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application.

int starpu_sched_ctx_set_max_priority ( unsigned  sched_ctx_id,
int  max_prio 
)

Defines the maximum priority level supported by the scheduling policy of the given scheduler context. The default maximum priority level is 1. The application may access that value by calling the starpu_sched_ctx_get_max_priority function. This function should only be called from the initialization method of the scheduling policy, and should not be used directly from the application.

int starpu_sched_ctx_get_min_priority ( unsigned  sched_ctx_id)

Returns the current minimum priority level supported by the scheduling policy of the given scheduler context.

int starpu_sched_ctx_get_max_priority ( unsigned  sched_ctx_id)

Returns the current maximum priority level supported by the scheduling policy of the given scheduler context.

struct starpu_worker_collection * starpu_sched_ctx_create_worker_collection ( unsigned  sched_ctx_id,
enum starpu_worker_collection_type  type 
)
read

Create a worker collection of the type indicated by the last parameter for the context specified through the first parameter.

void starpu_sched_ctx_delete_worker_collection ( unsigned  sched_ctx_id)

Delete the worker collection of the specified scheduling context

struct starpu_worker_collection * starpu_sched_ctx_get_worker_collection ( unsigned  sched_ctx_id)
read

Return the worker collection managed by the indicated context

void starpu_sched_ctx_set_perf_counters ( unsigned  sched_ctx_id,
void *  perf_counters 
)

Indicates to starpu the pointer to the performance counter

void starpu_sched_ctx_call_pushed_task_cb ( int  workerid,
unsigned  sched_ctx_id 
)

Callback that lets the scheduling policy tell the hypervisor that a task was pushed on a worker

void starpu_sched_ctx_notify_hypervisor_exists ( void  )

Allow the hypervisor to let starpu know he's initialised

unsigned starpu_sched_ctx_check_if_hypervisor_exists ( void  )

Ask starpu if he is informed if the hypervisor is initialised

void starpu_sched_ctx_set_policy_data ( unsigned  sched_ctx_id,
void *  policy_data 
)

Allocate the scheduling policy data (private information of the scheduler like queues, variables, additional condition variables) the context

void * starpu_sched_ctx_get_policy_data ( unsigned  sched_ctx_id)

Return the scheduling policy data (private information of the scheduler) of the contexts previously assigned to.

starpu-1.1.5/doc/doxygen/html/starpu__rand_8h.html0000644000373600000000000001727212571536757017135 00000000000000 StarPU Handbook: starpu_rand.h File Reference
starpu_rand.h File Reference
#include <stdlib.h>
#include <starpu_config.h>

Go to the source code of this file.

Macros

#define starpu_seed(seed)
#define starpu_srand48(seed)
#define starpu_drand48()
#define starpu_erand48(xsubi)
#define starpu_srand48_r(seed, buffer)
#define starpu_erand48_r(xsubi, buffer, result)

Typedefs

typedef int starpu_drand48_data

Detailed Description

starpu-1.1.5/doc/doxygen/html/functions_vars_0x77.html0000644000373600000000000002031712571536763017674 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- w -

starpu-1.1.5/doc/doxygen/html/annotated.html0000644000373600000000000004476612571536763016037 00000000000000 StarPU Handbook: Data Structures
StarPU Handbook
Data Structures
starpu-1.1.5/doc/doxygen/html/dir_ddf76dd7974e2ed67091c781b00c4bca.html0000644000373600000000000002660112571536763021432 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/doc/doxygen/chapters/api/ Directory Reference
api Directory Reference

Directories

directory  sc_hypervisor

Files

file  codelet_and_tasks.doxy
file  cuda_extensions.doxy
file  data_interfaces.doxy
file  data_management.doxy
file  data_partition.doxy
file  expert_mode.doxy
file  explicit_dependencies.doxy
file  fft_support.doxy
file  fxt_support.doxy
file  implicit_dependencies.doxy
file  initialization.doxy
file  insert_task.doxy
file  lower_bound.doxy
file  misc_helpers.doxy
file  mpi.doxy
file  multiformat_data_interface.doxy
file  opencl_extensions.doxy
file  parallel_tasks.doxy
file  performance_model.doxy
file  profiling.doxy
file  running_driver.doxy
file  scheduling_contexts.doxy
file  scheduling_policy.doxy
file  standard_memory_library.doxy
file  task_bundles.doxy
file  task_lists.doxy
file  threads.doxy
file  toolbox.doxy
file  top.doxy
file  versioning.doxy
file  workers.doxy
starpu-1.1.5/doc/doxygen/html/doxygen.png0000644000373600000000000000730312571536757015344 00000000000000PNG  IHDRh ;IDATx]y\պ~45%TL QPE"q11]8aw*(*" z`8 m,p$%B(8k6lk[߷;?kPx'tz3_Q4g@m ci{~4:Hc'PP7^h zbcP 3}OqNkT(?d ~z<4ǡ؞vz٦Zd,6k]Fz< Zs?sU2Sw1c`[}%ѽ.Լ6BLZ!F8[ T #g]:vu?vbR?wgb$kF~;عƕX?lNʪ,HCgAzlӺg ]jM3oҳ'=$f}GS_co.ȹ:ds:1={9?zqviDp moaEqҵw}~{j{ºFNë[OqOSXO]>muľe5{Jկ(bl}`UyacCAklysA7oJ .Be. Z'-PyF.lp&.j7rez19HG%qz׈c_k_")HJn~֘5 q5#+9T Rܸrzϴ̝ =υ{áOfwg|/$;֙ƭ]W"/< DఽB}yIEc^=[VhM$l];Kr¦* t$]M;I1!M (f<5~z mՠ>کIz;u[ie^ӳNF6B\}7+,'a -yHY,^f~?Hc{Z+4\sٷnߣFơsغD?<vkx0MlذIxdEEAMg*YE7ۙ^[uv[wG=Edn׶l'pGk+C82 dz3H BS[wŘ ~xptmţiQ歉AB1fى4uI]6% 1t.NJphz̠R1"3-"&1[:N mW0_œ 6&)ꦬ}~{m]zMP~^:eQT_*798ˍ 347E¿uSɻU_ NWeNӏ|;;d"ȉ޵ᆴ"ĴMM+bY_E]PXKНIޥoE<_(EP|m,өZߺk,kM`jzeU t36˷r}w:Χ |TܵQK_pໃYd0!a –W$$/\$ 2mLH dHV,:RZJaz*>_NT(‚^SVFU8E܈nd;8\C]=m:bDd=ߞUU5O|]Pv\]2"y[yzg{Y{Ù5;w{N3nĨwKݭ29Id y)P8ũ@mPwjl,6 hWd ump.DžtwR xBδYcxg*vo y򑕓[?V0NO난~󒯷h#Hk8kӍ^q@]ӓ,56-κUn[>]@nϜp[6# 4tn:}8T9_Y$/GK(ђM`dѺ;OB &P{qhJ+閧l2M_1ӫtlya L^y.۽[ u/]iS}N>e1qjf&iT\=kϛX-.84V5u!TE .OH4zwTr. xքHHg hT$yqzp< qrwI]I鲘s":ՖbզL69VW<;3?M3AV#ޯKUr9!qtH+6V/TS^pqgLP'5E ޺ n"2|;W"֬TwtO' +W+Z̖<&nO,I06.Z.h*INڒOegBXZ9hDSʍ A/c`A"z|ş;H#|%OOD mcƤqmu&~n πZj =_n[nN$_bE)8?6l}#bW( d-p&a"9ņ$ڛA!;{~8ޣ10`#kuN Qbh 8Mawhq(bK Z%m֍(J)@> 7% {y ohf>{p.­_%glZ\B2B #Һphݚ[<#SpA7Ht4:|gtL*($Ʃ$;b`=MM5ǾHH.HeA5}rd)T};Q5i2O00;,냔}g]79_{C>h{.II?[Kswz6u;OJa˶zvd l舊yc'rTWӰL |ʽhB T'ò]K(=Kx  L,Pʵu׈ž1ݫ;pGDxZY kf676oھH~޸ 8Up6(? K+?%ݷ/19U?B)l @=ޞkIENDB`starpu-1.1.5/doc/doxygen/html/temanejo.png0000644000373600000000000030554012571536761015470 00000000000000PNG  IHDR!ZgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  ~IDATxuXKw-mRwwww[wu[wu*5PZJqHH$ 5igggϜݜh@ A{P@ Vw1@ !>@ !>@ !>@ !>@ !>oD"!F Oi>00(8Sv~dff^~иf o}@QˍR1cn}p;T,W߯e&ĀĆ??+>=*{TP݌̬77obllz?.N==KIM}Oze4-ԈtXblcekcNâ(txZҕ_j۪ye7i *:˗CGNkբu& F{&6!MlxvWvw+Wޑ%7jruJw3M {"4UCo{kcKS=UpPH WBvL\dʵ"p洩66bH,bD$3}'̝6͉M YӦXD$D,{'6ps3SWJL&Ŝ?~RbqrjjT\LTdqiYYBf4$=޹sU^,[ϟtd2LMM?|`gkfKkVߵܥ^l:ޅ=Lx)k|fy{8Tpx쩵KLsA c0"6ȈiblKDY%44,**s)%6!l0 6fXLX"E{zV &6|icc3[ȰM(_|>wUDtRjrʞNdeeݾݻLccEӴX,qyr@kMKOJ>y+| .?XͽbF2Ŷf\j}XV6HJϾ>^ώ6|6[{?|>_"qpFEǜ:{a)R`0(Ɓ69k9оSL\;wH缋D^֧o/64}~YYY^ay<ї_gg//) bb+@fVfRbj“߆ Uo>Ƨ&&Y [kS;;'fFӵW@F1?'ԭڴjnog+HpO=п_z<}Hduރ^:wJ(SmRlؾu4=|p.1`!6l&55ʧҥ9ROx]#g,FVm"߿ӫZC_Oݫ-~~Ĥ-wؠyM@QAVV&O_n:^~LQ`{===i1Hxcoꦦ&O>ykUajbR*B7QF˶|Q = ;V׍ j˔D`oƋHKĥ b l_~RtFtPd0CþwJ䡬لP,9zHZZ4sێ=,3LG[bCn]{zܹ [H\6~-wtرBff #..&*6Tރ*nkܤ?/_hΫe]3Lw{70srut8 !Hfe=;4ae b C ㏍.9,|rbd?鳧rjL&VZ}e2Yfa_»(6);lߺ]BK arbhGW>5l0if2YeކRi -Ii)ٙ;VP͛Wn\wTb PXiݪK%6' K=044~:j*Qk+8:M7aujնr oZeAxtz7?zU) <.Of D"F?~mhiɐPl ƟҀ ɤP~ 6ʽ# cD bC1(Pb8-=U]G\uJ*6VV4MOw񱒒¿EDGGGER FVmEGGI$4@K$;zjxy=xMۻ+2 _eǵE-vvl&b8Œpgޚbƻ"1?V(ĢK`I%{ 1ɊV|) \MPlRl;&W÷lB X ʮە,ZB3LbCP &EA>H$JOOm֤ybR7BBBUjh`P65>@ |g'$V]ROO/""<44DR|&Wr.WꕫV5}j\t \E"8E)z[bBёcW28Οbr_/瘙7 2Dd0}X\Yh*mfbP]bm^#?3˸ ](!s( 3Sn]z\|m7Kn2[DƶVZffYٙ> _XYY3KS .5X[[_rg_8/qRZv2Dym-a3O.h!Y,C##===[T߯޼+j֬ԪYK^@.{s.SڀJ(SmRl"w|j16\^˧:GGgQQg\\Pڏ`2@ɼ,Y[GWp שC4>o޾}@ pqqiڤ)IJNgB!!ʖcQ喑v*32N>MҥBx^[#=5%5-$$$++խ_Ri4@WWg> -iZlᎣ7|233uuuY,X,Hh)_S;:qX[kbCM D=~߾})Pb/Zթ}2?JX, Mۀ Kh j-Ā۰#P$`1٠@K͛6Q\٩CY+d>EQl6ege]q%&:j6V,8XmTg_SýYc!TR95%B'ss ss s3skR;KTI„ڕ[9uױb[7fJZ⤉0iڴQ11w+}Fi4}yg$<${:0bdr\##C33SSSsOb%6RZhH" 3RS32B#G0)!)Ź\YxM#;pD$D´Ԍ>?] ̢i:22z̄I Ćc1(d2Lb u8/_8|}.yVb,-{8;y888X찰/wIQݫKǎժVutp07stpx +8UtYZXf lm^|Qґrc֊ ) wQpυtY?wg0)5SӒ3UT=}ꌻk%.v}٫zlҳl*E[zbo{Kci?ESusvv1PՠN wZZSf !!n޾n [h~N *nDlB 0:*vVb1YقO!n޾vF =%v6 k)L&݇k &tuCC_VfV+RSS==--bX,*gXFDNWw/ESۧ7EQ4Mgde~Z!I7qAmyW%NɗkU(fWZ:|?z6nݼx>(¦< H-1]אˤXӫ[lG؄AΝA>V[D,࣭^n]G 2eĂ>ܻRv9IJ .OGK+X2)Yi`FVhzƕ $X,E"tQ +!)ȸsFzzzXA+ {]j".ީWP/)=;9C IDbi #>j9[r\# }Wzos6KlB Hl˱42۶lMQH((5k QQ_Tl߮I  0I)D"D"P(ق쬬̬lP( bD"a2YY٥]R6]KKMmaySJTYVfV&?3244~@ z굔dc#.[*hr,tG}{3wɫ3RS! )߿}p7Ma0{_N|rJ%6!$6DMW\%lpV,]kŚ|~ Q漁5lAQ`4MT{67`0,d2Bub ɰTh~aSb0ã!]ny;3ss3.WWWh{as.\ֶEӲyM g$ .d[60h؛7ժUݲy=BO~ޕԥ#OKb0(! 'M KogB{l!-cDX,(0 I[144d,SjXܻscq?Hۄt0AtvvvFFFzzF/hdp8<=@ ~?u]vHLL2mLMM5av?m"e+IKRBmͥX,HR3077P(Yl&!u)J#& J4p8BH,K;5Y,bXL&`cjjg"] bVW6%NHSֶ$ŸK) D !>@ !>@ !>/ 1p+U&"N.`/?A^n.m#|Oeߍם2bCG"5;6W  18v]Xk37Ǥ0yf}v7o? ~W]}*u[-\9ՙ֒y`0_yι[)5zigsow~]2L6d1Y,iILlFP GodcGxG~mtCռnBp ՝t1^x i1=itGɔ̤#+Ft}e$؀I\@lx?z#W`xrgHZgo|J)[[<rp=Kd$9hBQ;V}i=\LYLMݖ=>`+4SJ%*^,̃K'6qa&uᵽܽ =EL˟'lݨ_! W@J.k\<^ԼoL!!`j!ʫ/D*NH}=Z5pZaǕGqKnq5{cR##U~rް5yUncK\ZmR.y* nm뻹yk7'wl٠͐+koqWj~_C^⬯fKYLeQiPyC=h+#Ph;z6+\*ȓDuq`yfmg_(F *}Ӫoyڛ&+Vv5(+߂[گRZ[I{m!nooap/v@]oZ>iK8vxD乼ܗ_ypqYNJ_9(;ݗn)OhBT֕G% )J:!ǭk:kˋwo]i~`|sJoLM:Z 3dѝg}x~}Ha+si\[3阵}sԵzkM2.}xYO7ib&iG>˄eno<߈n[x@oZyiHwHFk0కW|fAEm)POoZr[ U' Ho.Ϫm%}ݗJW(Ύ8qO?}XvAe[{ t*מ<5&:ʙ]F~o ;/prPA TEPYindu:xzF23_5z[hG{R@]r4ԧb*Mt5suW?VF|| 7,< [h?zB*^pYQ~LS@e{  U`$E]N̏|aL:B)PL}ZUp:TV/aV|*hb( )J4:!.[5*vD{WdepSV,/ :\)uV-six:ja;/K_({'Qz 6I[0YږET-u 箨nPyCUߒ?{ EYG{(wFc\ ;X%a)%P4!IJdCo|L[pymv4i ޴J `4<{ϼ\SY}?5;OG+ 5[=b*Oiu ( XzL1Vi uB+\% }rQ#ޜ/X U:~A#sSf^0bR)].qVܻ.-NK[ ㉿&>pu[ڹF财sVܜkqgb*ojLJvm\( SWWl=d᠑osCI Zlɚ(_ U5y]k}| #ZԟXML=|t1-I ;faST;~$D_>q>e2b*͜a)YY)6OXnBVJtc2 GI]STUBN׿'HL&߭>uo^rʼno:˧̾bɛvqXydDq9qwZ*?VK+:BGk`c 3ooVZLCMŇxͦGvm\/@uID{.oS'7}^8JNbKDbZ[p jrK}#?>1 ^޵WΣ$UX)gVOҧO9y0-T3|4,z zdn)N.?|X嵅&uiOQVi uB7.ݣFyoܡϾsK_=ީOUgîj̗ ٽz9yx6:!mF:\Zi&~yۭtv_jŰǚBkiMu\e-Lԩ#^*:57fw_AYWXPw[&x~A-ODw@ hkOAo%Ҋt;K@ ~*izdk"& I [LC@ zE ?O+$@>"@>"@>"@>, @ @ P!+:ZHߍ!¯U`\GI(@ E"z k@ RI|,ƍ@ A|,D Ǣi ^Zgn'ϗFףU5v\ysժZͷߴmib:䈗QͫRev|n;A0E 6ro@ ^,4ݧO42?5Ż74z^?徫^=p׊Wyj1tϐEw!U‡ `N].n͙4f6Zujm4j}d+fkѢQ.W;y4~yz[n6jeԛĪנ7^ώݩ_urhqڞœ[4mެ]eN5@ J]h5vx *!2<*>y|UzrM\ֶkfq/w0q߉hhw3ߩP?t0zNmrO:!|qX-]>R1W3\[Lm[1i7iXn*g_dz߱wo,HfK{O*wH BiB/g#M_`eq7h_ݿ۶|j yJ 87gռ\<\닳¤ct2mƥ)<4c>Klϓ `c,ڍ^)z5b_} ut ~ux 6fWԉkjgP"Nζ+Sgu113g"i@ &T{3'OLQMY&G(3T~A)MP -V'֍DZP''8ST=#pH[$4ǚֱܼ)dgDl N׿'HL@Wm|IyJKt<yjLYܿ.gR]z.ȓe=Ke ҟ BQTs*r\9AE@ J}u1z֮Oc|/0w5λ4}yQ}իZ3Nfyjꑧ ٨hʧ@ !>s 2G  eC# C_#0!!HLDV ..+_:ױ{`YBIвxq)ieD;ӧ122 *ii ѣZ"u$,B"J+elwug~A;-F8Xbcq8:uE\1!!w /EB c$i=85ZܬRW\ ;ȗ'$`b/K!s^7S>F"nPlr3;7H=]~I"̳٬^n]G 2eX=yy<ԩ5 ;;x/_G%bE ̞p0 %hiЊN}_hK bk=)߈_n=WAMUVZ3S@x|唆|*UcܚDLI{ $O/EVT9(''l_ͻ^^'9cS?w7m\ O/$G7Gj^*8#_,uzn~m\ K٥9xW)*TR ճ1y҄l߮I~TG޹,mi$&u,Yд)օZo<{Xl݊5r B:غ%'a~Ƞ!Pn`@V䏯O穻Gu!741B5ɳP~q՛jz*VP:x\yen5TԕV ?D^}`sR*䤻T2Wp uS'^woAZZڀA޼ V=; ]8h=;6>>|>4NJ ecbbӹ\ [H"->|"shlDebV(0KK+?ydА@G){4oͥzot:BirAyWA>"_ѻ a}ü?UytH,SJYĀs3}kJ gOJrTRi:u`1-ga``s)f^LURbj L}}=~X?@b(a3l*-׾_Z9n ƌAÆ >27o=f 3B`Y²z2$=$"zոfwo1Z6RY].d}5{hI(*Møp&%h;wlW/+w:O6%VDTP`#~{:\]h)++\*Ud Al,1^RÆIaaa}fI<f[ `\!tVVٺ|&Sᨾ"nP\E h{3ӰO9&ڨ #ȉkodi&:XRE cJ?I5}`enݤϟ[hol4N= t:XRE cJ?>5/+=zȃ5]<6~I6+E[W)KGFr R`I!nPTE h]Gк/_G/UjH߾MnZu7@(,bý;7J?^l6֕&\,Mu#(5226ҥSJBF5a9sx@(c ("F(dd "BP<4yь ,4WLhp}P|LFg/IGUr6p'0pӷڏ ճdc~ɲj4< ֣Sb2Rgq@cPPbh PtЖ)T|J34;~Ҍ{jT4<r|G*+MuV>x5_,#S* A 3vExLL. vHb^_F9"Ўfr? D^ZSjkKrUis5)FQIHɓ)i)0LP_mo1ff2+ M YxYW œA BBPoS貳iyRkty,Wu)P\/!3߲IBaX,`oqVb~c6Ť zG D(DWoݼ}U&{{|ȐluoڕkZido*N8;P L.-wxyX3]_*4N^5.4 C$"ៜ @PBo-cn̏s\< 4M߼u766@D{L*޲HGɖ[\w0L5 p 5e sbx?dؖ-i* FJVq5e by'%oSZݩCzr4hƍ"(ɵHܫ7VDF%H{闯A/^߲~J.^ohhXްאvhCq|"݈L4&?"P$T&L3#ͶT1mYmfҟ\:0s7/>W$A 2]4'`׭ݩcGC#Ԕب☵E L$K=5kBoܖǵ-t̶M5UvbժN4^7n 2@ϞET8XBQۏ%/韧@~䟕suk;Rd\:̝ TBS^ݫSt Z=)߈l&ҭ6:dyoi"$תgt)bB?}P+ իұ8vLQFTZә7D}}}Ms=zAbh78XB1. ~_hܗ_ypqYK3߬5no`-(/nyג 'h}gZ)ɻmǫ]+T<)^MĖZ2˳jXv@EzreHwm9|mTg' ; Ǿ}4EaҼ y[e,`ţw/\B֫g ?4sƺXzYg,Z7Xk0fܰ,]L<Sufܸ6`s+B5Yk `'g[BϠA߽ÎdNZkɏeˋ{/9v2oVrmM Pl78XB)~| Sˆeh(#_X/a!J Zg7RJuY3z WIh[\$%2xء7>/.uy r1u*MΚVwb*q"8,n<,pN) s@PCs*.w qPˠŴ> +T\e=&ƹ,hU ]yF:yPLŇjqr;;üLW ;EZS,ɵ`ٺٷηAY6ͨA4axك@HNF{cfm97~o<h Ig#)JZH&@ns{Q5W/]E BXz)}>ctp7nӧ QF̱C:1*6a)YY)6OXn?Uӽ+V7^W䚁OjP%1W75Sͳg:|F h<hSYKo ŗٳG` D#>!B֔[cp!SN6pt{S11h?< <F :7ZyJVV8XBQ1V<Š\}[gy!~@9!&| ;-/H?|&e?zwұAv5@35l<6Ku}%V.+g̛ׯq`f` ?7oܽ{㑏%+E"Jf14nF Wf\߽Cǎ Q,Y&MH&hAv-b*bx " PSo:Ӯ- 08rMcYΕ+Ʈ]h*JGcƌRoNf]Ow܅fzq~,]y@(&"A.o^wזx<\Νq,'<͚sg,\ww岖@\3UYx1i!wrkwYjp1ƩNXQ#\oz~gs"M HqϕyTA۶8yY&ǖ-^-Zrtuu+,Ev"!=LW|luOOen|u<>Μs OC]E ҏE ` 6ȑHNeJ$x/BWufMzz_5$2+Uѣ$%X F;nՎ#.,(fJjhРE[.  ݸ(G;! Sc ۗg­[=&)f"x^ p> z`%0"4l6C4C(E1˕9H(b4E}^TA= G&6[-%S ; ލ)Sr%Avv.73èQ71,''3  @X` $Gnp}YG\-A2"S:J;?kKr,w 憽{f Nx"F-Z@G? aAt4*| UL.ZDr 2C{o)С5dddT"{LaYxi2H ~#BA69 bS:;I#=HrRq.`:(`U4х+ 8\ޘUG. ؟ْt)PjNfr coMOP})}鴿˧5N{S]+;% 3{?sCХ/47wACŸ>3sk@t@co JJJH$k 3Z)z $$\hP ( dZxR'+IKYC]yY)UDzH "C س4 @;D#F&`8xU4 tb /s HG#FF`(\ P >VaP9 (2@ \顟Sʫ%X(,M,CMN5ШX'd"LA:@ Q}oYH({6I]+h;tdԮv&<}i{$RN. vl4dbV >0 $K4|#iI "C4uut/- =yU{Aq:I^~zV%rH{~ x EMOzz P2jD W"^߃> OOksb0 īW Bx8e644J 4M\`*`]l{/Lb`` +r2"D(S `@$|#@`B>=@h S5bssi΅ۜ]T0x@?@TX:.GF)cӆBh餠ن~<BKVX(mٱP(& By3P.C ݵ+},Klz~ 6i_={>ϧҘ9t>Kh,sYD)_$_ -=h}-GMPic``;88 l/ `VN~[ە)@J&߀0 &*z<2A@@t*,g%M*nr * @ 0L\z6wa~i:8UrH ?? kc&|\%II8q:K . سnn툈(XZFrX J lڄѴ)CttB"#gmېEZ"C4郓Gl3 Xit ,6B<RjOL' @JL>@U ^#G`ہT)JBe:.^:/8uI (iMa22DF,}8#!4$X̩ν;7 / :h<Vtv' 1xbs̻)T:ܥ̀еx,Qbx'"$BcMƊ?b#Ե9R @D188`:tסf;-K]!-9Vr |\s hVS* 0+'_3.;0ߙ_%'~,|>&MŽ ~krvkSܻ H!++q(ʗך:Ǐͧ(xxaCT gg)Az:=˗+Cѿ??Fkš_?\06}0ZU4lHMEj*۷(އsgt]`fF'ᗠ́΀e |X @ H3rPmRÑ~0NQ{8b 8EHݧP_$PD!wSzXv~M[b Ne_%'POQ|. ss >} _h..f^ R"S <=qڷׂaa2mm1b]IErP,'* GbV|(vUhP >~.])$18/5ButA/ dp>[8{,^ĩSdKP/AMGT;H@oj':9Co* t4`6" T.0 $@ C< (ԝq`1`0WI@_X~LIyCm5Ku1Ϗ8˶*9y$xurj~2+)펹cq*XgϣR%ETt%]rͱu+>ܹu`DQ88(ТN(/I% Á`Z:Xif·f@HvյFpikPhp@7@?`h/ `UNM`jj (f -8vbY`<~yw%OTTpS`maE2Oĩ;95odJN i'޾EÆ&ek0e x +& ⻸,ٱ#yָ}-[".NVgOzU) E`Q|PPܑ#wO\ 5@FL̵+fZy@ϞAbHIAx FF ~ &甪,D+:Ryx,@aek5ݼ?~=6Xn5hJHVk*u XXSSѳ'D"h8v,sjQEsը1ҥ ]8XJip|Gf4j4W,yPxQĠo_irA 'r+;;{С4vvy,%4}&.n֝9zHn q 89aa>\OTB:E'wfp<-< zzx혘MwtǷr/_dNN8sF1' lڤc>uhVӺu kU.:sW|Y͚8tH16z&TógqpJ-}|X֦+];Y>۔;F~E  c*0w4)7iRܹŘA(ֽ~yNݺX@Q⯿_ ر.N0J:P @кv6n-IM-@UAAQLo&(JLk:86 ݻK)))ԙj|7oZת"$8PwXPD>ĝ;o/>bD/kd2͚BMCʲtj*֯/\xF64ƍ3úv3;֢_j\,Jx"Ct4v,\@VҨX<]i4O3h=5Sh~"ippVAC|,@("V)ңF#Zٻ7ԩI%˯:MytϜ,VV޴ XR1KXܽۯ{K$m?~*a2ksM06&NRŋ%gj.5z~Ɍc33̙>Cc䯴KdiSd%ٚ'\Sq鑝-|Çʓq\A#Y#GJ7n\.A+c?|ȉҭ F di[[  M=8|xzfLȸq9ᭇW, x_Lѐ~,@( ǎ)ft("ZhѰY0wъѣ]y"ݻh)3pq\, S;r+*_ט1 7\Ξ\ܙ+\CA@ >}ggg۷ &9[ א@",ƍɛ7ozLމgw^d\y粴j֔&/=YyK{??[[T"KGF"8X5߿#$Dvr0=rG{AׄNV,-~@u2" SlW:{<'e|Gi<(2Փw,]طmf5lFWϜQ˗yJeǏj7v"T(!%𻋢KBuLeB%o暗Ůvx!8pJL|_jXiz|YۨBiuwT׶ a ]D<F#^)@@aAZZRRIc)Y&U Ω9T%%XP(RMI&8~193{Bmx'l23nmt킷-&YQ'_xHw^f]ry/fffhnj80 .JC+o: +TmWXE_@H_~X"G@@1B%0Oݿ;776yJvOjgwGRATZф4r(q+ĉ1S"9ii']J1`<`TլUffll C3J),&#lD"?96)HCAKKMLTyV6ĥ&7NTZӴ%9PWͮ]32.hB9A OC$ZX/K$G]Q嵍::49 o5+/d&؈:T9?'>~bbImPZOOw@(>-p4(ý UˁFj8@aXB- Ip{<+@y`<gXB N?L`h!˔UǮi`6⻀b:8!5i5vgڒk֭'[Y/?9_ցGr Z k)> *(Ou< 7X...yj%Z [ZZFjV]JRf\9Ң ?>֋44WR>tNhSX%=&e:2U.4M 3/oޫ̤࿵"Ӗ.;0ߙ_hBn7A l\;(L/=ow/񚗅rkD $_ceƽWDy}2nnR'wOϷUmDea+TPxA9?'F<2spնN2yT4$] pUMZNdp:^/>&4$ 5m;nGÒlCם<˞фk`m-K: pDZTV=/nnȨxP>&y5Q}b fk]ËmH$lxyMVǨnxavN-DIJLpM _#sTƵSѭ;^A,A{ JZ$(J ~W7qڒVe0Vۀ!u#mNxho[X{EyYX]ˁoXuӴ"y<Ѱlhٵ>[UO~/mIv}jyNffN㛯8٫bEɃc/JVMN[+9[1̑fSv|([4ofP__!{WUAGG$يIQ`m- `[D/~b溭G5!>SWO suunn^ rb"# s8sv!C1W666 GGN?}v4]w&]߶r{11Z2X[_ 422x+'JQ Qn@$)@ t!Ht4bo>L+f6x:u9XQ8X5+b[[&`,!Ǜ|-`np`VUrAwwԮ-K''cfiܼߴicɥ]1G,OXh~2Oe4Px ۵IfRJcnXỏ3'OFsç)mle zaߦO~?T>e|q\-RA=2˗˷9iRTzV.7A#GʎCCnⴲ= K~2O t4a$׮qQgbtMܑ~34sf;3"K \zT1u(vPZV.:yظQ䉼d_]MM%ahx~+vٰO+ mޜkBuP6mR %\˥IsΝ͚76.fpc׭Zqu{BE&6K9@ )m?Ε>}íei&"Yʊ5a¹ {ܺZVL+WW̚8\[JE]mtu5rc,V++ǿ:v|}4IQnka5Jq8{6&9޳g-^\ IC1GGm5kv8yǜ4 XP,ƌAǎŋ!4nާO7mdL0`nC+k={ p""͛A˲=/sa\ oTt־k{!!ӦZY-00xFF0ǫkizذk#=3gн"kVVi ÊN}+88dVVޫ,ӫce9~͠ރݳC(&ԬŋI%4rb7 2?n hԯo9c۷o߳2ӗaHgH liMڵ37app&j*qqS'6&arY|> x\q 8B*#%nm)/iY3=RO9{Q,Ү^|~Ϟo( E$Vt8^5جys}db1 K*^}xXmdT"& bbdWѠ‰ٽObny-d}Np%pDj &,0 * '1E-::88 \z#Ybny*׮}vLJRAZrS)luX0>1/+jDž q894h 5OӘ7wb6@.ݺu @\bܽ{kLפ0)d;mY+FEx ^0DP SS/q?cB {hBwE=;1܈EF#x6y- C+}I6kb q,5*NNx-Z 4T)<=1r$M=-Am| ٗ#q\|Dl tM#>_!ĩ| ^*TXX%jB*{-Z *Js&T 8e-L-:vfQþxCHh~ߕy^ipppPτXP2llp.cS=_ v[fE= V~8tH jsvFUU҈[NNx=z(lqcC=%wrb Rs]JQ(/Qa( Uޡ}گc?N 5ZK<.ذݺwo oFF>޾uW}wUp L[==>yA~&"clg~puԯ.Ew^M萦Qckۊӓ|b62e aK]8>8¦:*UlTHXZu,Ze ģkt^Vz6]`BIGo;?zTc!`)Bc]k'\k ks\1H H0*wO!к(]N~$qH>)_ ~fROrWy[š ]FU 6lȵ$ U`{7* B|Y OAYᨙC܈[,\jAjaÆ<G?A" ʰUMƍ5*Kgb2էx>pgb~n&[O(9@ru'Uԩh^yU-[iZ[^œ`}oVTG(NH k܃zxQc F0u*ZPyβCa9E9aSBCzy}ܼ+p&$"h`ϧQv=F0m&Mha{I n KX؃U$hc`p:(}@ύңbX6KvO>oץ$A_&'eCkN"BţgP?#rAHLɓx!%E 65kiS  kgJި${*GCx@9Y1\2]]Ԯѳ'5P>pș QQƍѸ1}ѣr#3Sme<E˖(4|v].M PA@o_w|T VU$c@g`6`F@2ת͏Uo}6A'~\;uɡ:Oju/(_'7iTϊDN z4u23] rw\U-`AP}rʂ 9Ί)zaX/ OiiR>Ji)&\fqu`꾐 q?hX: Yl?C$§O K|,NJLI_LӮ(_Ց]4jh4} TjJMZgT153/(.32a>  0DD =#h ao9 wXp-S]._ʷ1Mhs$$޼:?'U4@ PNЁ.tA(EU@ %- -Sx)HHM><*0x Xk :@tv+յ X |jG; QFq>m~4Qt*zf:1]b 9xc3:˒_"'4"Hُgbk.B  "\0PMbO_݈25>eӊK2!b(54r0n'`SEI(!bR"XWP@E7{FHGBZ4VWB}^:'CP-[QU& L0j*!B(H \Rh,`3@13EҊ~2*S@xK? @g76\@KYN lhX UOcG\ju ,Ӳރ<˿([in80-yrHH g:r7eEee0)a   D}|̿;ξmªy!°ߕ`R'`|3,lVrח (3vNA)/,ʎ!$MPCݺz Gw(d)&ۜw2DF]ХBq4XP4QH*zL ";V`1]M:2z?3Szql)Ә޺`OBS˒`[KrElr$>:dǴI$ZD2)\&LG{px\ X&BOϝ/gt@x͑ 4/v#8.52MZБG>brĂ_%'B@XO W=/.tt* BGm/HZ$m c[ՐSX @!EVp( JBhl/iU+ͣi} C'PCB4h.J ('ʢYz\ h҅䕀Β}dʑOPvS fP 품BD- 2} f<hbP $)dc%-%P\P&Quh*Rs@. иnw%i@\Dzh/12c9@}`6к xL~AZla~uĂLͯGy y\Yt$3@YD:YOT͑{0 0\h?Tk@"B7d<:J=KrMY);T)MK-0IcuX|]ڜ f&:Z)LqS)~4Bvhٍ&gҬ)~}>^(Qd!.1܃\8wk"w,d!"8}GǪ\k&p-fNp#RZX7лl>Vz ?YzXv~M΂JgW#9^@|Q/&JQ[@{h2hU_^5;t[-Ƀ25:˶˞*9y$L9E|, {W֧V?}{Dʶ 5dDF)&P[독N6YJ70obi.xǬݍEt+~ (e7Z֋&Xqa<_h*TW"Ci4>'p }>U)%q>|4,HRj60 h !/ 4jU?uo@#j XS41RN` @iQ(5O#35[y$;>UNfI0i3l^<NP !%)!%;O2/IiE˂MGWRQ\QO  h9-RI>͛A9C9 oBAԟ"4E aڈ-(J:͕PI_ 0t#.UAjz5ZZ)^:?NtP%$vßѰ߽Ó'Fh(Ґ .zz3TAz0PsoHa+&0v(tRqB,ƛ7x 3.ۯvvpq'|}BdE9Â*x!J$At4Scb!e|61N)`cf;/xr"'-쫨ϞK!<K;: ==88R%xyfFˑ*)dT1?bGcr""DA(@]04)ae*`#Qc4G@El C"fd#y`DD 302*T jB**7 P(2G"\B X]ݻGC FK""5룚cKB$µk8t\;vEE^F. %˂8x7nȷ|λ_atNd)]]OtӴa9P*b(#3g!ܾ >?ש YФ zF6,b~Ǥr\T>Çq gkh-ЫZVG.m}H|I @@wQ*zûȣ8q#D65EVMw c|cJ RǪA|~ `J|Tkut~nT}S{kXиlaf&vڵUTXFOÆetXЩaIUm۰n)|OhccaQ'龊ᾊ2q#6nDb ѣabJPQ" >_Qv=ݍmiäI6,0 :( I*ĝr/dTY={򺧚PNŀ%1K+,3XW1vJꁻ醶s2Wt!ɳeg1iRgݖzZ)Lbcţkt5l1Zxߏ3|>̟q*`Hᣊ"oǜ9y;rS%K`Ȑ~>(|=xZ\{/llz5z*4Kr%h׎x ">MFƎ| a>&u(B| wMnjn=S9ԩ5 1hsJLԮ gg̴<,'RR3޿ǽ{!? =q\iÇ5 ѧn̛__4l*U³eХ+0Jx}d)GٹIG?lT1V{jrQ>4@pvRmG % կÇao_̷ rF٭kx@NvF ?@Gz Q>*WFŊ04t$'4}C([GػP/etb$"*G ןlAccA|yBWiiHLDp0^Ɲ;x bqjwǎ0$bcE|?m=vv3{pޯV+wS>x>"统<(cj&LЂh.` JFIDAT={*LXՂ"gNRwrHŖ-8P >x]aSSiF3d¥ b>"6U:LOǙ3ؼOsGQ14ľ}ر ]zdk'w;ˌjqQ>MMRzimRRp86mB@p7ւNE Y=- Vx{t"{vz8;%>5KlT{ E`аI"9ռjrbFFlܨ%_w+2*3X(/^u\c[ffXCy(Jcz'x.׃.^ƤIۏ<V$ EƶlllzV9&T|&c( atLENrX;JScɹq&[E-[0lX4Rr۶I*a1ĦFS1ܿc暪HxOImooogg/uv6 V)\"&N}bju+FRr8X&=ԜQE;N'"?VriZ1tL-[rɼ|p|,X8a x*K?|s3$N]]ʕ+g859cС\2oBZ䵤9*+XEDyv9r8Lb 4+m>jJ۷ؾ=KK'ikfJLZd ?~DHHr8ر+ ~迷og ]\ҭ%TZ76ZW5V֩S-r9[_];EWEA.^_ϞQ# <ӧOw ;0N:uj$wGСwm[d oB˖ 'Oq5ݻ; ]\+fX m)ϟڵnի sѣG1QGv׮:s"lG,SIOt}k7[ի|8W8FFUYmr9E=Dr…νxN\jIАY?4׺aa=zT\91f™ǨXeC߃_#^ =;_.#tݺ,"9h>rDׯ_ `Ѻ5u<|D6F(՟7\GOH$5L޽iAWї/+ ͼK\l˗FS:׫w)tx8榐oMDQ!Ȉ~H7ojmk֯n݂PZ=Ow7h{{|cci;mn`eE(qMMǃUk(=kl\?-,ml蘘iH+$/O*q󦛟 ?H$5pyϞ:v|>H!ٙNM-Gs8 td3W]pl~ffeNK {{!">VYXs*^E7Z6h@ݹh|,_|є)՚4BJl,]{{:9E;wN~F"L]ТI<{Ci2rd֭cccU|ˉqs33a׮\@%I$ :ռm[}_߼W$EZhHS$? `׼gO|;w:4##CQ˓'֭`@V\kaA$?׹TW[~utٳgAaÌǍR%?kO(* Ջ0n>yB3 ׭Shڽyj{51޵yWh]]EE jKe'5))VVzkMºx\͚}9w޲ES FLDD/ԩbhJEEE)*:}(E]'Nhڵlc`իАeKƍؑni̙g>|X&"k(-[V}\e~QzERP (}*jZTX%hZBwdggjՊcFFTeݺܬÇuXǏiXfQȌ~~NjYըV\5e̷oj֤?/ԓ'k#hW\mhj2O>T! g_d~uUJ+k#44O;g^~mU6BB!ĉ-Z(,nDQWÆ- dG.]Y,!:ȑeZ|ֱgt8˗/=Ѭ,-a…\gdi[HWo4ݦO&v-9j8tQP,c…8ofղabدS D͛_ʕ#v#M6sLE$҄lV]k233uagzxQk~}˖ZKٸQ1_reL"M&''77![Cqag7S,J5 .ejE1x4rР'J29]Х>}: $;(l٢u< B!>N{A S{ta!*ْSڙx&ݦGp%MH3cP0dr:8v69|xI[XDmf@|aڵ0Q)V2cRӉ 3n-/*UС:9E\QJ2XNqvvw&Ι33ir…ڵ;@*UϘwx١VP]^E@\k(.O;)SM8@VО=Gʉeh+A:ys9R1o*U*֭?4hNY[ Q طOqn<[ہc6o.vt{9޽o޽[v+$X1}2֏Qwq!iOfC_5tʴGB*~&*ag]rvjVGe;F")ڈܸ!KxX)))kO/((iյe~}Y:=Ot۷xR67G۷iECaǎSS_+9qZA߽$^<:n|*(F Ud z͛МWǀÅ hB|KCT`9OܹXQ06=F5?ǎ)6on3χҵkkEÔŋؑ.;:Uҥ\AJ PcI20+ `dW&:A9QEI0Ɛ%ii2*Xͅal8ۀMZpq 7_XZi=`a1N@2y-q`Q+BK/fqr#n% Mgp"\P j愾}a`zRNByw"Tr"e.hsWJ0l4L믱)~)@*XÇ]D.;Dsx9sdˆ:С.s-Zpyd|4 @!Jkܹ c9sҥC##Y6$ɔ˓gҚ#G.O(~8u êg5›r'U|dǡȈ 4aUGX" |+&Ӵ;~}gdduKYrlmcjּr5Wnח^FEEnT~x[79ܸQ]r ) zI?~ d0Ei_Wii?ԕJyq,uߏtvFZPܶWeM ,mb"߄sԢ}^-lëW&r]3U,,ɕ uS8 }5Z C.-5T0yWO8X9@W+ںa₨ Mu@%/g)NQQ\Dy]u?y8(ݿtܸB s׹>}˦NTPYYg,\':eKo09YIR϶{='ϱO)O׭$oCBTi7'/]*̞t}ΩwY]$TxN Nv)O2lw߰J%o%OAyx$ _Q|<,o:k#̖e 74NKSVj1#qTק R zk ͻzZ+XSǗJeULs]~}ZJ-U'(fel.Q`3>D(mQr85ѥun1*D㭪>W 6FYCOHx<&#EA(TWt%_NNZ/=ѷ.~$ y( . zXcJ]Bz||\U>rCPjz>ZNi[[B_Gs:t0Hﲺ;u%?_R]+a&fՊի^ښU+L7|Gg.L8clk _Tn'jZPK,FZ{G p WIn:f6F08D +`/ /V=O?P_hT1H5#"Ts4p/YqEF˝T`xMt,l+ OXm{lߺq4|92!Mw/[o7V]v]İa0ԸW[\zkxI-[(Y޼=գnիŴ3.-wjSyʘ1ߏӊl6% Ul2_'h#![ge@hu Q\.*_+$:~"O˻ܴ)җ:EǙ%,T}nCCeN؛6B< %0QOw ~E {wJ RC|Cϰ\0%z7)_O1&9bA%0{EL#!x$O\\Ti5Om4Y:t)+01Nٳ%QG2 PzϞ<銸8;G6bQC&XDׯ(]Z{WEn{PA{ MLL,Thu-a~s(塬ߥ Nd$BUHAAz4mlbʃbTrɡGǎs}i֯w%`o/Oz49R8]JdR%؃J!:+H>^>hj*1@?{IP5\ZIjj23u#azzڵ333FE$|@u-( F¸2uD"o |P:5U* iE'>|jRn$b&RewUZXK3d1a H?2]C,\9fNv8۶utt49u 㭭94~TYEQ{W2D0ڪUi=/NN9vTRf b1|}eI6iCurd4!C,ׯGJ<]v/ʕ$[x}>*Uׯ,w|yhJ\y˗7=':tCfUntZÇJ+ gWl}Vx8*UR9mJʕàA%F 21ȫYV޶ ر*9 a:C(YSf&oƌ"fq7l} mT //Ujh jrgFϟ--zQ Z~yy^(*K}h );ii>\6cEٹ#mۊ(Tj])J`edKuG)XZʊQkL'+]>qDfy/Rr5F$ 6@ ?||T.Ч}[ zxXjU6ż ny'q_4J,Q1C*wyVϟ?Z5˶mU{Z"L~]׆ 8%|jm7hVR{˒E_nE(lp C;ys x1\wl-7[|wrd?pg\y>lѳS;wvMS9DڵZubazzd@֬%lS}GC?+pz'6.XA_߅ 1kV!$1* D`׬I2$GAcMEQ4HCٸs+WؠQ3-D6 8gϝб#]o7hn\&C /\ڤɒ3LuWѭ*ʲ?u$<{Gc:MӇY_Fbǎt24?s._1gD#u] uvӧ Ks9sW blwsK M^$Hpi@zM=~ ;wB}WZ,FӦsG^ŪU*#@(ݶm͞=Y:aܪX[ ޝ:taX.Jl Wa̧>KyVO;wYYYm?qBТEͭqߟq{zvi9Vw{LsiiisV8r2mOZy7eJ.]TC$ ]ё#s[б 4~}3yB~Ưױ|hG"k>qp.!!!Gϝzt{b,CHH1lҥuV76`d k4>-[=UQKtppAkġ4Ȃ!eԩYsGӦMUHܹ* 7o%nIj*5RǦM WRÇ޹ɖfY[fpMHH̦$ yx4nX X3lvx'6 \3+W/\I$۷o?wڽ{, g%rX|FJhްဎ1Օ'cvUݓzU) fa\u]M(޼ysٳ<YFŔJ͙1ohӨQNj׮PWd6^GJ+E%5R2꺔@ ' Y.X|!`H,L^5f2=7۱c͚5stp񢪤Y3\HjѱXJ ֯~PMg+,ӄ5?Vn.dY@ٲU #* &@=>PIx*qp-*j4xb I 0]G#ʈ@Fu*`V4n}]ݩ['Gn *^HÇssܸTX>~DFQb<+~DGⓁ1mhG`JJµk9=/Ѥ U% b-Cq8X25S ] y>_#rh..s(*ѡ4.6miQ!!K,886ywѣsYׯ>\_YDhT8.WWbcѳ'5í[WO౯ִZ٥LkٳKϞaԪg ).^,ׯCݼ&<{wETY&5t_# CT&OF9,\^t =Sy{ѻ+LʬTr y(X_`HԪC*]w]䄻ws(@psС9011)W {w0h4ȡ`U۷`Zn8IwjMYiL#SaK<8y(XϟkW4o~Hд)U0\ʕ1}:bceѐ@Dy{ӹtѦ :uʡ`5m7UXձb/_%D#سwʈ(CC=aDr:4֭Cxxh pvFǎU II8!!9XW/|;wTYE Wv:uи1lQ}+X#XF(a;gѻ7ʕêU9$]\4pʹѣV -[bFةT7wjե1t gglݪrqcܻe"SޅzlvBtÇs!}Ob"@v\{zؾ=܁қkRC=H$:/ S,]SUbN4m WW>gOO\C q^e7+ ˖Lxz,~ O ,B7xzP{OEEaFԯORȑtI#5>!.]`bjCfGpq۷n4S3!aj4m#s+OLGGt\>"#Ѹ1=ÙEat_~I]`nl *}oc(T5 @?1@X7:͛1m224@P --I +}5\ ybY gBkk\Kp갧DspLTU^a A|w OZX0$." ųg!iw'BE#k7n,صc+ 4mq#rV~Tg 2tFO:X6ǂMG<{P< Pll`fʕꪭž}Ѫf®]`;UVy ԵMz5~tȨQSJ Mg x} 0Evf3`0^0e ΜɡH$x Ϟ!uc (~w*BOo_L 5IůW.~mka0`|} }@ ~=Ƹqꆌ[Gx=p?Pή~*^U@?l6…{!hy6sotNDaŀ5\G+V`d^ݻW335e0м9LQzRAQpvVi ^ijgą 8v ll`eWWTɁ%l7V~̀@2Ц Maݥsp8rDEÌBٻGN>=OktQN‹X O'=1u**WV˗/G@Zl^wޚWxaUmcDy<郩S%tuݻq+Vҥ+2~P5ĸ3ښc LXSckνo޼%sDhݪ~9>lܽ?n{C17F˖%Jhտ&sbWti_+p<ΟǍ ]3P(d 7Gi:0lߎkq,.^DMD`sgMU+t_ _:Dj*ΜŋqCv;GiSmΝ +ɓ߾?]NCn:vpwĘ/fmVYweYж-Π+58(4jP׸Pʠ}1$BԿڷGӑ }}dIL5B˖rslͻι>kBZ3II Cx8|dd\.l`~ƷHq66?w\>}4U 8Da.FFpp ufTXLL0p |F,Q.< 3ۢ|ymg]b S]Ō*E0Dx823FF(S*~OP;!ea|V_S(@Fx02Rk 0QRjJ&3$^&V? ͻOk0`0=U)E픖Fht~֩CJqԨ.o%P<= 4*=)Â+؆ϢK CL"Mx2f(S|`2 >8CBUçOiʋ1RL ؆m)|Cu@,.@m1g6 t]E(UݹXMpqfmtNeeH)k;0;9t[7l}MBEB1HjbH抳R@Hi6_s?s ==C.{lxAtDVm񕍴_M=@MMGn6B)Sv4ܝYlU ,W߀JǢn~<@EBqEj=+J4)$0 ΈG<*@[?Hd [ADO1=u fLDlY"Lr{,==HKT*wO0K=mXճCvTnK;; āȞ^_ !ױ.+!qQkZ2{) 1J/m3Slk b#TW4Ja$Bh( tZei?GQ<+`$ /\-JlA34H#&2y#Lŧ7d~؋Pd)(!4;Sneeu ::F  w!<<#w*,jaxj[P V (_QK< i0f0@ t+ƌVP-ZkQDP_M\\<|M-4z!lBz: cլ&M`i…*c/Pцl[$\ڀ-_|n NBæxeªAP=+z\EOPQapwǝ +ÇEvmON }Da|b'id9UzA _D :Gؽ (LCU_oTO6qUUTW@ HExbt+ܓxBjIE zqbg a8` }gGIc {'l?fe"/Gy3]Ea э[ ;cQX{¾}h.GP4h]:=eaMwѹ Uр/&r 9HX 7|B+_~xM]zU2M Vj`T,b?b@D,E7/e s1{662&L;iƉ8H  sFSpuōض \1k*xEY$`?0V0(v"mEI˲Knw"Xzߗ1ld~ xY0{H u Z4ef}> hKC^sI?7l=T¤}^޹[ݺd|qQP:vׯ}|}omLzD/vNo! px 9νX^emNOݭnzlJDkWYYobYK;;nX|*hI꺩]U^U ă7mXb&$4k*6~W^(I4sD5+lP.DYY-DdQ=[OK4kVUɓ/>zݪUL b1}^wF4iRR]Zw"DM oӻ|!Vߤ}ZPb)ҳ[Rbf.dNz5}#Vœk9S OHznVWxmsƣo\V5|ʗ*_xdЉ:>.xA6]w됻 #*܋U6+WO#+|xGz@娣}?ժ ߣ.y.|<|˻K=>^x :6^s_oc|*k:~uKMO_=:uad?V7#nlciVZ}(% E._~~ilA O| t}!XyTMvv~ۻͪU)Ujsf=v6mbbb/e˳|>zRmJ4]68z 6xl Np&x `Ҧ˜CWQ)vL ptjw-8鳘Ưަ|iբ&q/ 7100|nl]2ʈgذb~+`8#=C3{>eM 8cW|fMVVusmHc&ދ$-~^Ί,?測=oleY:*pmssTbTxtBpG1~ώn=6hFmK.,zzz6^իmڸVO1fd#5oZ:~?( Z5 ԌӰI7w'9hmmi+R}ֱc/_Kq,ly+[GO^a#4.G(v.CLX؁}.j&tɷ|[:G|#tUKeJ$ʗ Eyr_u᠘FD}WFE ='+lQ<NU2J2?qsmAw?ȣYf=F7b~=jJy<Q~7n}FcF%~Ny'(3QP_(Ĕ)14]n[#"I~x>PsĴJ[|ؒk&fhh-N~=P ;i/#檖u[ɧ@f@x<]ܷBdʤWE;Ja -,eȑ%&&ʋ5jRVHBе$!(ZIx B +8Qd2!G;*OH 8\.cW~ͧt*=kԈmM齝)Ό=T>T9 6ZW5wYiF|ct83U7adTt^+%]' H & m;3nfxwmRmnjzOKy1W&L (ȝk`*Uz\xp4hÆ}fNLY5rdyҥׯWgC& āad(%vuj֐k4_LUs AdžnnFT`r0V{;j۸Z>!eufiҽI}&}Clz];W*L7bn*5{LN=OXyNZSu\٭umjkխR真^+æ%CMjU_yL/5Uz~#7F-GU-/%(Z:gM0hI_8h`6~TjBܹh ))8wW~AO «^1qJt=2|`,3x11#hrWk:v2?s%ظܺXзn>a׶COu@ѹXo ;kQex=՗;iV}|lZvnP}Ҙh}*}aԷd Z%(HamFuÉ?c"q樓G"٠ŏ92=ȍ*cvʶKYHF6`C pːX? _l[2Ch=(HV8Mr)3~}lV:LDݽ8ؽ;Gt]TZ\'1 U_MSEzopm܎' ձl̵c^}\tbi%Hyn:) ~Q2|$-[$Qbh]ҳg psEˠPа,F : id9UzA O?Wn0xs,BQȎ &rVxIl7(X@j]!s«ZquXaCSy 5 / BhW 0G12R2xBjIE zqbg a8` }gGdɑ3k<ɷcx$"Da:Wa"_ Υv[Ec#Eur[\!.#b%-L9jjAO#_+wݝf?` (0ГBHu``U7ϗR>۞auzIb!Z TH"×D$!: єM1LkMLJUec`Iko6c7Y0(zPrI2V2zOTϰ.iO0 jȷ KcpSKbD1[[S!}M$Y6efs'ٸm/`J(9-Mg2 տDEwsTwSb=d^0 qmR]!@C PRH),t) u^YZTnU5q*Ds1ndQ"_1 H!Z g DR|$Ȋ`څcuzHsD1[!_M!HC egBֱ0n$@ +00j5UIN5gb`T!_aw+8v!OsD(0iB:W%$ yM"|ܐQtәjLf5b0`DTb}XhCp*[Xōh w"H@?cI;{Sɦ;es%)R)3~;dP Zb :G0|I 94z,R$Pь==V"5T6ka{uXg4/vW QB&!A{:ֿP(8DW:=s 'Lf2HX.l+? 'c}K76Tb&v=;-D$瑵عֱ`v1fkӐ f3BK= LCdJV3IqLS J'+T8"K ϴ6U'/VtgΙIO9^QD)SW=N钠/c &%bq =5,f6NBLW#}1Lş+$a7Ǣ>*JdQPE*$Y08MN@~ZI;MWM8Y=54s}_wf+>)ȗ/_+p`VP|G ^aE>H 0F |h,JOmJq =!3(^Zp&x `Ҧ˜C@ +f`VKod'MG2 Q<I,ob&{o ש`U5y@l2Z4-^^a#4.G(vzҽ`d Zw$9J 'j0q3As賷ѩkFP*ž}:u=BT<]*," Ljapw*vn?2?J 6yE @ \tUPBqɅ'>DθGMփff<|ݬY/+++y~~kdVB% AкAhB! ytc9T&sJ/}t69I1sD6`t>Pe/8< 26V7CX|TTb"QY#.#Mu-8Hc "ph~ڳdBzhv3..@DD;@L 4NV7% =[dX+h!`1c&OQ/GF<ݤI uH ڧ`Uzf J8A>0aec(-G}沬|-}6=}<2k;mmN[i9C`a\joo2A+J4ެXPO\CU=p&LPV9re  w;t(;f ֨b_+Uf@wBq =6p=aGC PC8l; }pqK:F,ik⃷ʹ *1*<:!y}o?gG7Þ)Vڌ% 'ﶾpV]H)1b 'EI Xc@aZ͚ɱOÇ{/q 5tUeʬwcf-U//]qc̛{' 5 [ӛQY",Nn ѐ@xBA¿7Bz~kjsajd {YMNwdgofD-f\9Muw=)E'$T/ kj]y2 .@ `&|{B=>u4yӤ`ڸqkZ1v,vV89 08iyGxݟ,+&R`Ҽ#jб(ί4ݾ*M]- `GP{x! 7Vl刹0 mĤH5^K>V;M_=Dbۖ@T6!ԢPe$ A+!ϣF [.] 'O\"2 F\-;71f ^R,tFX~R0;\*aR 06凴!0  v۱)3vRw68,^"2,uBljM?f{wg+-GU5wYiF|c L3gI/M+$O dOQ*@X$Ud?$\TQ!.mZ<{2SP!K`\>=дiR%ܿP0\6p+~w"-8`(fl@XK4Ӫ~JHfsŨѳF۔8hȕyM9 Gu O*Se&Sl^8`x1_ʳ#6yq8v6( )ѡ+~Sf"ςC @Fz wpr foÇm(\WQ:CP>T(>S)ƎţG ~{tݻaj{W oc"Ѽ-T_F}@ i_p/@4)srn2|q)3ON6[k "pe8:4zW5!5gHWi1B88 w=yW%=k_˗O TV]jewߦ"c<*to{-Ez V\P"@&d|_m,|#OߊOs>^ kj\{%JD[#Ւ+%I&Et* p-jErTM[fHJXkMCjC~b!`Zdd|j&@?xz,^͚00Dr\Q0@HoB q(W{Dj'zϰ7m&,5]GpXM|؜ɳbE ŕLk·18 uisv ڶC¦xea@Uuh+ZCMD'puG `)@{EUhWB4{@Al?/XPdEJ&AS~0$c)q#w^f BaRz?ZO]kWcO䳬=uG>Gg28IU$ޒήc1jX`%'!8:W"!t u{R3Ǭ, JhHLYV:x]+C߾8|s%aW43 La)V$iEU(,mW^oJ{,,M7!XB!ɥr؅Ϣ~UjoVojSxРJ.9yO3kkf&ӑkal F 4\6OTn @ٛ-jU/=RJʭ?a[}|S3RƼd[X[`ik*v'= 6) DvGp/A7+1Wt, 02Q2GKI,Z/U&<$&H7ggPϻ'UzRO #" {B5Y"7Q,nT+\0x0ʕìYx@@>_d *VD׮xk\GW/`f]e!HTctOgl$; ܹpv's4 06iC`H,< 7jVggdn߲Wc#.lָyf={MyU"%L̘UgDqi;sڬފ+99lḽa-J8}ubp$&1hc 5YŤw˴Jpy F07qޝ8tիcD[mq`WDݖmӷ|Ǐ~ Wi7iWݲ42W,PLcCk\fϟfM,];x^ lL$ ̖׿;Μĉ(sR*REnFؼR)vRټV_EQ8v AHLD` .]8~c#U+f jcQ\F}@ i+N:\l pTVkO) ,0L݈Jv=Y-Wvk]ܐmlUf3Io_?s[1k7n{Zn,') F B(PV~}J t36nDם $7JIS2NF V;<~AQ &-Z`2\׆ h r/ ߌKw0Jz+M5y2e ,&\\н;֯Ǐs={36Ν?>(¾F@rY#aDMB.] $@ [r:6h!S`>d/=XjZ~\B0Vuf柅(Xb Gs8{H&k֠" > wwR2|nZ q/;]w#44Qӧc1{6ƍX~g[/bY3+||pjSB8z_eKUH//,Xۛ.dN/ *G'sohUfIVj1MT}~aUxN< NbNHi[U"ꥅ͛1q*k`5k0|x.+.>;Rl ڄ27ST Z\&L-^M8u Na0$' ׬|}xQXHy&fݝ:2W )o0[8.&]i˲%7nlnU\=7@Ә;l6fGf!m*9Y2Ac)ս<Z)ߧPjM >V-K~aǕswKg|6G)EYI7?ksC ~7)"\ps0NmU/уX,>{;Gi[juna 3Q-jm[}+/C9Wsg=^ʎݏиeo,ܺn˙ݻcbW̴l!( xrCCn݇ 7t([g ԩveˢW ː#S0!8v`'y\QPN}&D PPw6Wyr/Zc[7AͿUcqO# 6goSj!ȳe=E#G:9ENѣ11 8Wcc|ɘ5 Ċ<.۷Q eJ=K9[v$RW\֌?3333P 4oN:={R@J{NN1l޿[uvY`' NF,`b'#p9&~( ܰ 24`Z*' H7?TwLО=`RiZ\=*'Ϳ 1"N"`PH[i!%E•+Jiii]7?r䅯_}23Kh}+**ۻyժJy \RbBK3"AV<[tȾPYjSORzUۅ0Hm6 U9^B0s[;l zN.Rc\ط, ?߆HLf4MB*ge6 dDDDMw E\l_|)/Xk֨j,[;JH…[Wŧ`׋OG(<աQQ#[VIXW՘=I ]  }`LB|ŸTzp7*0xΝ˖Ŝ9$жڈ? 5p8>ޫCxyСWORC7"=]QcqQ<,hU#ޗ Kbbo<8e*ur26o.T``#ߞ- O -B*Ѫƪ4֮Ue.t~P}YeC=| 64K>ݻQ.]Z͛7߮_ u"Q/ aCy:#gjj|"dɠf#kTiXO#p';i{ڊŢO(:vJHQQvM~N#лl6y$h Y"(X}7#]ѣGU!CgfH f''/0V  sofFtN_2_q&$Vb00t*0N|@(@JØ NHMAgT}e?}$}N$$\S.u }ύnѴl )UdkӇ9f:i訲:<`:cثʻ,C4$'5inAtrPHE ś7MCu*ũ|)Xw.蚜gϲ\tN]:OKBك噒%Uۅ_g @@L"yG BǢB!!63*@ A'  ߛQxp*X|V|_!vYԫ.:WJ?aZt3yI4 06ahA$  $l~OQ*@X$UD@yб-׼d٨IvnkM!İ@hQXpyֱt4,}e0KfY~C >|8TkܳI.گ4233|~Y@o@fN}71|>@Ŋj+2ڂakB"ȓH(D"ؼ~=tg 5jtׂ(ꅱ[in#MqpKLjBKlf  k@QsllqRټ54&DEE+PPx`* (QDaaaUTj_Jb9`?0>P4'P;ᗒ#z!š"U&Req^O!,jp Q5idD]UL"cbblE"Ե(h"ښ\^B a_p# 90PTE ŕcATpթVM TE E7=|爋/꛴O1 L֧@ \l( ,&C*)EOmO*U3]Ȝ ^UHX~bcQ&';"oq(m ~ZhcˈB1XEuiMcUzjSc[{Y6lrAl : p8mjZ?m)bUbc'ˎ&.VΖG:3aWf! CpQS f+b;fpC+2=nAji8gee΅ ]h&J ~Gf]]G=(ѱ|:me[K{lr#B. OBZ&z0+EL7XPCmWޕM56 n69 Moc[K} !QMdw|IBP(=2YFUu=OZԖ=RcOAhB' p-0HL[GPgX($[bKJ |1" .ާ!TssgUz='ɜh2Ob204t~\2,7xXuFY(u颪whhhč\]:\md4 l$Hc6%H#gD)y?Ohxt5EDž( ;)fF Y$H&ێ<\kB*ѪnwJgdߴ#!S}|h(C/S-\28mʶj{S'L8ba# KˁÇyyFk\0w 9e[Ǫi@S\A@K8KU^@Jn߸_~SҿnZ!{wO7b(KS yehUٹse)Z KKH^7o*|}Up[Iа,F : rڪb,Z$Ke{ `Ū,X9лl6 tM:@ꏰdSU>mDiX:XUj*zBgHx "o_%Ͷt~ǿPp_}7#ݢLn\:lɒ!?065|x;y lެ|5t܂_/q b*{ݽY&cǎ51dff}|נuQPTw#= ~yXVa\K"!c,8(WjoWhQ7lz~~\+˫)=ͳԱgb"kwV PLmmfTˮӳ[QyU ݻ4Λg;t3E1j$yQJ -WۢǏ9h7inAtrӠhY E)οF8siu#p "pCOȵEH~ .<*Ņ{aw员(϶igWslՓ'o{`N}yp3՛nai"ưa%wv#119.cP%L0<+*wo:}Cow)EFY[{-Z_bJ$\լO05)3 vy@JewCPXX`U%woA,, 33QҋU `CZYb]tQ+U#G0Yk„uAA]]GGi!a80bz:]S)X4q MQWNN05iC`H,O<^P~Tѣ AA Ϟ}qhvV tqSKV˗o>GII:g( 4L6om,^D3k ލ_~āPDlѲeWϝ>=ȑ |pʔ1b? L˵{w.6669A߾rf}ex^~~a2}!@#z!nl6ΜAV{W^rjҥ2 V^QVKDKFRz[5UsB>OP| q3׾0+p\.м9^\ձjzVֲR,gb­[@ѧ5ŋL|~G/ XRy~y4PTWvuhTPIDAT,+>< ¯X8@Eugix{+`X?Kx}лlm7Trz=H),@Ŋh7oHhթ=cR<"IhjK0fL»w◵{"SRocuP,5 G(J4e3ٖ `!Ҧb~#6fp3r /B)+X2X,,YM1l!>88$ƺQVW"KV+ѻ{9Yذ-Z`XqjdD7d8*Ks06FŊAa۷JZ9pp-6HHg¯co|B->{!FE>y8w!ǐ!@cw<~R{vEHј9?´) w'ٹ#蛁ӟٛst2* Hx9RJκ[jDxx SNs2EUja^-HLJ\4$ZdX$05UԎd 3Ҿ(5,~@L8qMnjGǢj ;tWiEb=*ǀkn('#?`&[$)His! )yuęH~C"(0B_ƀɑJK֨İ`MBE|j|Ҿ,)\(=l6y8-hOA J=w2j ǂ$X^WF{j8K؄B~#c=^upX@xANRY 7MCu] UX8K饪T擶B%= 챘ֺT"Ţ@ڻ9b`ez;˷r&>S=P6bae:CyѠRC{{XG6-,;; (\a/0́gT* OC4-bPbRt}ɫfL M?euzHsIYtFUf[PA챎S;G u [H%8:q9hQBTL!8R)^čx>@, )C ݀5nV@z0.2v #'zзRN)0yJ$ƭ[x> <)),P!e+;\ki搻|T*?U3Ox[OK.ǎ6$t$l^*r_ns *+G 8ټ3 4~8F@ mF~?s'BaFe~~J!;adn0`5L|(; waXeK _®]8ryi$'?0(}}nJ0hחUɶ`.QuǏgAR 80:XY̗]yX&I>CF X%h 3 ""^a< 4,@ +ػ'C/E[X@EЭÇXσִ͸ܛh`޸%mh(~Gl.UڑM,Xk4 up 2oS]@ gMcj9sРy t '0(L4q0KBAir@ 4̙!zWRSVE `EXV{0a˥:pFͨ6L&&btޝ6|gՎcN3X̻?IKF ۖnW6D]+X2G12BIT6M@赮,^K|Q+Wp*<=|9lmɃI]c.\jٱT.ϯ 8H'\@ 'Oл7>}]^":wFFi_0hX/ؙ:Z<فk0@:aZ ӝu:Cwj@ǎhիvɢSQiSƜgZW)͢폣HSEn@ؿ^^VX ڵ%_/hRt_"E[X~ #>^^[ßk`HԎ UsսݫSv<~dRcT,5k] HKMEϞ:Kǽ7ϝ sl_r6 c9WeH T;_] ǣM,Z~=/RfI6P0֒D =+Wb Vx,_b fBg}^L$?Ms_) &ШvB.HBooLC >`,W01@5caIOsL-(/հb0|8j˗cȑX@`QħOX{8uv2r[B ظaaW4f ;_N[ǚ Alތ)STY.6`\?~floh,GgOPjꙘ`J>}9SdEB??ع]}%0[ e:r8WӺۦdԤʪiTغahM5q"nUemmw|W]h^UO xy04/y` @ ʅ 7N-Q/JeP(\}Γ'^UDVtÀJΔvaaL`gg'oV6>E׮ c$-=9ɜp2ʕSdffܲ堿qrvQSHMAoӦq##;j5s8 E<ƍ9:tÇ-[`ks -ʕ9F \T)))K7nN(o\yժtLEPjӦnn۶!#4?umދgddȠU3k}ZOOCݺ y˗խ?4I޻׶V-5kU'&nn`~@  QBPʔRSSxxL ~=kxh [bI;vysk*UZyhLUs0h+DOO!=.\,WMiiQ7of{yPSW=bnZem]ygϟ q USدҴ0+ ٪UqKZ@4Mku8n$'*`$Y255A;vTK%?mܸyIh\bEYbU % p8͋.U‰]ǎQn bSL@  ɚ59 Ai> J׭8n 2&*Y'N7Mͥ'/,g/3fr&f˖JS Ew`mTY5^T@W5Je2s覛6A($2gCt,@( /^ $DO.~-hNNvg˕CT#G4~]幪|yt,K>yqvCHתZgjjΜJ3m2bbNVBE@F͟T[89sTyu 5k.[Z T -kT^qqqu9ܧ*`f }WTK -,6z<۱nIqCS{nb͚Gu@qNN=g{PER%琷u0?|;.(ڣkfs.)y4xDP=9w.KթӞsMR) r YЙ3qR;u pPnefӼۼy$Ek77x3g~;TΡ*>cTBCMc%$&kun/[\}i="@Mh([c)Ed)JJ1xZVwu@:?V +UZm;hP͛W_R[D~*y+i(k'MX]dZJ;ѫ\V!Jϩ|4,Qyφ#:a@ wLdoz9[@KR ma>F^ZwbdVg1y>bn$@(4 ە=¹@hlI 81p &0ίQU{Rg]Qz|]H$ggn@;iH6vl#\<[nM(J^t\#Du]\dӅymf\ 7ע0J`U4ͷA~FFn^.kDGGJw1q3.tw= @D{DNVMG1'@ UVcdLrX *o%]LzKsin lfƬ;1ͺ6~dn8>iE_3QBl! ]R"&_̝[AdEA`|[ . 0. 33UicƘuzG<~@b^4XffJ|%TI*-#Tp ) ,QHtNlnt(9$tD2U ђ\^/M||~zv[sEQEq+2;–f؟~D`3#YZ"d@ fF"6H .g7 B mQ, dJ&? mPtbXZ`\5p`:cTQg ZKM.}Z7;,^Z6@*j)b5wWo۹}A r}Q] vSSeK(TFђrc4(`3jjj*ϨQ7W|쯝;݃}2HwWܣ ҌKz9Vtx7 ХUswb+Ū{9A"FYGV7eTaARQl".ix>?w-}@ @q D#Nћ\ЫC%ۚj +S<'pP2L!mZx%xd1B8Ps;Oʕg5!#X:kc k>lDa \}X2v{6MYCVhՍX$5v1q+.5yYN00|鉾 qr~7NZ }F wPK#GZP:u~rgg| +";Cfi5%og gs8gaaMk}%ʑm2_',Tʊ7W*|@ yߧs4ܭϽ>>ʑXfn5sK|ȳ;Sư'@ KŊ(дUlIvm5;I߾ڦ|ˀe_qqR.yXZ/ {rPlݸ7sY>T,WW6bVJ+nժ} :޽&<['@bB֘,+=Yƺpo۶/';9V, :?H|U"͛ YS'65k$sGrgOܹJ 32cjʕM@  *|hO:!Z1@ϟwv}J8yR[ip0 klcǺx(Lί]$8Ǫlzf&.\%[j;w.j|ZSe "UFr1$~D" So^Ӧ-86ongn4Tw/X>}%:i~[Qn_}}}#֬ѡj+S1#s :@ ww7w_(u!-bݺy'˳عSf/eeܽ{d.!!p@?Jl#Fg~ő#4޽5JoX)E1hsЍ?޼9zUpE@  QjneU:y4oj`'Tms}}Z4I*SJ}RE߾[)Jӧm>ͤ:P5d2rw/[VOlKJ*ҧUgMzkwoU3w" 4H5PÇXFXDmYtIZXH/$FV(x{+UjxΝ!e?,k>x_۶]\!7nya>WLoUv}y{k&>3$= ptJ8qB1c,&v^%0AՒ7nnA h}۶4AeRJ]WS,ƿBsh(WW~P%1l,P;k8E]4̼̿T꫼>}TtA:co޽U|{sm۲3{\EϞ۴۳"$<<͍id,g},BɺѣU#Q%&K5isqz=g-͐"MNReM`*p0ܿXҥMmT,XBG}w?1~aeqm;[پJѻj`OCC0PN#zV>m0l^ g իZX7`XݕʣHK jcBHxزEt^LnU˶M}F~,uxTc(jz8~<<}޽>cƽ/5m^ IlnPɓŹǻ(,FN E $5m׺5Vd<nxƋUI4ݰwΝY.C[Z֭+ao7OhUf (9ۢEM\Z5UR"zC#cCHaAm,[ UR{7jNE,_|y]*E<"<]49O%OVM //UmUH-Oء RrDΟy}dWiV-Z{ +WT!M U,bjf{gg܉rRJLLnfnS8x9S52VHz/vEpq/`A`+WpWM(]_"30 4t+/#i.5^P@a|tɕK GI\'' `U`Boг:%d$X3HYX0Ertε1 FB/͋ذ6A2c+?!)渿߫pOVi\!iAҼH+bElSӈ^m9XۈiTիUOǩic…'뗭MT|fׁnUlʉsv]ȱ1ٿV=pO|&͂X? Z7߈ d=\Ν6 _硧-οJb,yWID0 `2.{9u/7YfMܽk1{6>}JL! ü2~= (RGch}qc<|1oOɡv;n؅Wg[6WokLD LAr!9tcw>q议O)WFo}Sl}A772=*Pxj{h`A,ߓ[ I;f> !yàgOxݻѬY،RKJ_}8 s٧AJq^Z9 ׯi\\6D͚X4x<j!C^nXa_֬۷6X~ĩSxwÇeʠzueK21p9xԽOoj} κT=\.Q4A˖(_>wd]U{,0{$I&o껩*LmxCgT;oD Xj QLc!={t>m2 %J/_<LLPx@롦-^_3fƸ~1^Ug-p>Lb?:9 .x|Gj-^8˥wIR oG],L.^ zD~YInɦ'NvB[|v/ہO/2s2ǿm9dZP-1+* sFi٬Ѐ fMë^RȧK}DV7 ¦灹#m,,l#[߃n(,|ukV4jpݚ|~N/qwM9XcԔ;se'H(GI &793cyH4k6`]A(He(b Lba`;x.?"S6cHB Q =JHGBH^(GcYG#E ]|Q,觟5ǡA!$6!ie^~5x$k!@lqiY)\92FF< 8 | 25 嗀E )*/X` $[HYTYƾ&aǃ( ˅09ko ,-eoI``])!oE #_$?hXV,'m%C9HR7q*.]½{x 5Rͥx^h%`c!"?AjcBg #FOr M)ؔ\ӷڰfgnf̍s ^ pT+&0e,Y==n ooi?+$Dp AG*Sha; _+˧}-a6]BG򱆎LCG|> ].jU%li 1 $'!:{{L OҺ l8 TPM|c@Q-RpbċW9A<‚AmR>H*=^|x7}R!!+Wb T];BJE[E#ҚB CP.fHaa -Cp|Ǥij+^5hA\ ''^2Ia`4&ɧ!S zv_tB d&egc`l,_{]5JXޡO9Օt黋֖-^tAݻѸbe e#,[!3# քH,;Cn+dRiYT;:+Ų|ʕKWdnVA6kVם;7R޳G5:|TsHKxvts0Ȑ]T|$ߙ`ï_ ј5K;;[7&N-{ZZر-[Ɯ={RT(6lPX/^d/2xIuRM|-m 7.p.BG4n5k4_+e/]ѹߚ+6 ӤnJU _.˛n`Wv)onlڰ]mx/nkTR]IϓR6LvTٱ^qf,3u=]͆yhUoIiɒCt#%oIh/:[ -֫TJ6Gc%Go.};#r@ U֪aaaÆu:t(H짭{'Nz"ukbY&C``R&j"_6X\R+6#@(KGά>;\qv{zRponQ5^uԺ"7)?]w鋒_|rhK~W5Ӈw&2\+kzO`ǟ<1`BړҒ%xgԧ%6l*S;gf=ʐzuΙ0)(RRbjuL|"8p`K|f}&&ض{߾2f/ܱHDpA!ߝ̡⦡..IiɒCtH~,٧~GS5+W,qtѱKtu3)@ΜjТ|18Kgg6WvR2ܾcCe5/AA?{HtE-'TR͈&'~^;]߿˞}$Bu/}!8\ ?2}v)3f̌rFg>))-YR+KǛe8WÅp4U1!>(Q|رG'͊ *E"ܽtNB |א\&!E.̔^\\u΍%ȩe]kkOyv W ; Wn[=s̿Tp72]Ls ce*㗭՞  =',NPl[ 8jռa[Ekf>))-YR+KǛ݆4C(I=GSBOxaC'Hoz{Ιu}i[߭2]$b/seù/G%q8hXGd)<{jre&ija4DSaBH e7!Pmlȧ*T/$yW.x6ʥs>#6]3"S=,ɋ/ǰavS9s>;Dh2.ϰ>U&lW a'3WH0 tFHBB Le3(0atu| >ܝqn$$7G0쁰v'ME!Hbb+H¡>-xf?'AP I" -n(DBrG!UB ;VW$ŴV};߀;12̐/`V}jqO >~)HBroT0: 5~z c'B5ȸи }enH`$Ϥ`6)%RgGS r- I&Dq-CJ96! +xCג0{|u˖5}G2|p`e$թ|"+c1&`a7 ꖰy.tho5.+W8&h"B8% +Q!RH+F1M^bV5Zdh+]DTW k>Z}6ɖZW4b(~dfK7IՋUP]~ 2;;9 1E jc4 C )ĬQ>O;O+i{M+#(|>CR)peomXHpbYONNsIy @|:R(Xym@EaXSY/ry!0?\^YV#FOضiu$?quŶmСjԨU/_J̵$&!ӫW=g 盆kk6ɀOZ 1$4,)TN`. '0[˾&g&0#FO3;+X6o6mԩ]ׯέ,^l4pD}ϛ7ɃVzCR Ti@gʰmGH~ղ%Q ~Ο;77 mݻSV.?'Nzub+EVw:zAR)p*ުU{b 3x@Ԝ&&Zhc-%]ۯ[5=tugX]1>'f;sd~O/^{(R@ԯ9sT.QQ5sWNN%.M}رfŗ-kx5k+8B!:vĮ]CS{^!"tCj=&$(:?=^$@[Gw' "Y3ĨKFvj@RG\8w,u`\lL0:HA0f ޾Ū޺5g%JXlL&sΘ'+C>\o*n`,^'AҮ/0;4 { F㎒N}7wkZ&wSƵae;NqS|vQJv}'=OJ:\Z3ٵSezǭ|JiRN݆/2̢E[#j3cc!Ez*UѲ/MyfyrtttnJ~S4kC Q;|KMyͼDA(~eVs5yji̋&4$"ʲeC#\\p8umMR=^kXYPV+vr  ҢR吂MMዚM\yM-QOotgl8K޲:.ݾrl}VƟtj+.<ŌWOW]\;Rp (5ճHfԧ%6S-Ҕ{s쎪q򭛧9-TQ;KRG81Eɣ#a.nwǬji9 !bv II…̙GKHX&!)IS`MCvYE 5m,cXdI*Wװῳ}¶mEb0|Z kx"{7 Iᠦ?ֆmsf-`|alZJ^^_q_RHBяt7CP aT~+BzgIhDwټW63 UGi_,I*KVy.T7T5$—\=l$3@Ղa=]y0/I63P;*:zn] sN~GQWloUZX kgr wH)z}jXUZoM+@6|tTn\PM Z\ t^]0k32 fzMҔg{y/US|ށwz*CXh7qLJTyQFo)h"B8T0P Ldذ! Ĉ)69913uP8lIJgc2ɷ{}=32z¬}iey^;=T_/8*I"IoI5I4W~N?Y2~Y[64x8AѲm&\@^ uZ1Qa3.#RMO?:ݭ.k&g3B"o۴gDBE{:Is)obPR:%vf-sSHC|~.O:}CR 5m|vqOKIxkPB  O?jth|Y-`N1Xx HXs" .he;?zؙʁg乛0ûoct^ Fq%[Qð2 [<'cxn !eYpA/BcBHa2Ea|/ v 0ʖ0&xH :[ R 0Z( IBm,B)4jآϣ>"Nqx\疟v ҋA}D2BDFY `Q(X-7jҔNB~M8lisylBd)"@<'kEt bϟh1?V ~7s )"oQ#"NܽW`\<>-0ç ؠzu4iQL¨; jx }q{z$g&1X`XRd8x6iHSMc6Zr2=ógر xygOcNT!H AQkE @! bv١Kn` y8N_G&si6r(_K"%EN Rj`‰cBHDpgxW )\ʜ6X/;fHuf W!;,DivRXeu\6_]):!kbHi|ڴ+4vGq ?bcU=}ƍ1e IH9$@0g„ʞNic}VZY݊<|I&TGI>+W ,YF_?lũ۶Ht숎|9oG` BC`ܻ]W|ZxrСWIE!@JѣGWʐ>CH,qGE $$(AB|RhQB .E߾ػWR"n̙}z~ta͛NDut0z4>D:WѾ=bѐ 52˯gA%o3gb6jƸ}5j(޿߯CK}Ev.x0X`OϦ{=yDNrF. 0hHG lG7HF0!t ӧVp~x=Ou9r+,lALL_fMxq{6m>}î]K{F!-.ǐ8B*fn)6RTqe*K9O')%$JJB>#W ɓV5jqwLQ8ɮuٷOb&xx(]޹qTǐT)>Vii/#"^1?5ˮ7&K9O')%$ ǏeSS ##ڱ}3eφo8pru+ʖW}xG lO I?XX äuqo<]U<3]Is]x-xn-|S.㾈wKd2ܦ?*w񗄰Φ'xDZo3 "1yݶ5kE/Ieu|r+K9O')%$_ZD5֨ Wݻ)}0A\`ӏOu"Q#tdzm׽B7 nW1'h>tsW kG37/[toōLK YES[HPUuuݦv}<|vXXL޽R~%yRq_/Ra yl nj5 ? q9vlޭ[Y %3LMDF 6{oT6V%bzkJUC8 T-o'22T$>Gޥ>0\UJ yq33EP}j[U>spyzQVrNSȃeKHhrݺhXx*(Ç@Ǩ +VWO/*pAwg!B6[9%?d\ p]2,Z*cS?z #޹h{efeC|9:pr+K9O')%$ٿ_%eٙ#GN OHXu8ӼQ3䁐*ߴ*sOIV 9HLՉ=Q)2C##PƟvPyocD跳{RVw{ܯj9ɭ,<˖%Ν勷o߮w@?N; )M+VIm$%QUB.ߴn= Ν?W_R_K5K*7h4mz<=ż=*ɭ,<˖|[|XZEO.2HuHJ:q~$uttm1OHa_2$`djM;hr5]8O՞ӥVä&)WbF7 ~jOro~*Ra yl W^(z0ԍvo7(fV? ӏ󶘁MxK€*XUNܨBHaoXB2խq"|lmx=7SM8 >W(ƴE `Yg !N!¬Z\1YBP SEA 9jcBH ]PVgfU2 ) Hտ">jryVˬn08!FLvg)o/=KYդhU>k4q7<)=z4!E\5'W5DJ2dRptA0ͧ);! pWY<үU&@1G|{SKK RQB JNzs6TīWڧSynh/;?@Fq8SfL\msS1~F =/'^|ryNgUKˍ_(յCu~]jr"dI/X~_u~{ D"+>Q6)䨍E!K&={VZ[ori_J+5<^&;QME}0pj GUA 9jcBHҵjyalƪUS#>=m=>Ĥݹ?{ymڤѥ !"iS(X qE'z8:^U]8cAdd%-k;1NTй3!"Ő!ɓ"_\kobsV.'/ :Љ7л7ͩ6!8X//ZYY-?peD[}^ի_X[5‰\O5@4>և޽!J,Y7!S`ĉpu#;pm.+f=叅E,[VcwH+||T1 BdɒΝ^zN͛2ePB5|86nDHׯ^oҥ~_(e.=GWwwmMڸ֭`$tHEE@eO\899}5;KNN633r'KW;wBgׯѪbbk+WpFŋkMI q8}0lh]K"!+*kWܺ0ش Te?VժUXe,z捻{^!ptҥ{Ok|>ԩBBގٸlٮE>`XZ/]-C ZKвjENR;Wyxx8pjժY˗/p=\:G@ -U>{Ze1djj:90pr`۷o][R> B"c/lR6mԥF+trBnH/?),KX1LŠeu+@~>\5V"Ò{} uT!X\.4!d6AӦMCCC39&&N_2;F͚}ule2JJ㺕M]"ʣE QH_W_P<q77[U7'(koehhe?ws~V:9L!ĉ8vL^Bb", 49y[IexGw ;u()Q6m"DlJ*e`` 39222b,{o&Fo rlГ {%!,&ާqn4vûxa1u^O~ͷ?tы>wOo-/ '[0:BmCt&eq:&NDzX0?&{fMʨ˞ohˋʕMe߄Th-R͛3.nnnI]t`yҏ~~ї'|+8fU(wn֬YᲢE!yaYRI%X\K;it(2qdG=*3BD'WR)Y|, **YfT1vEY%UP$ro8Rd0_)K#I8 LuL.wǘ)&53E6:P6meֻBrQB2<\[2_C)!3 #8Gl"D\kcq\gggϞ)RH"T7e+z_-Q7>ʧr#$8;+!ucY~~-(3qhFBBL'wk<ߌN!LZTs?}p(aG 60^ݡ{;57:14C yThCE@!)~"6oƆ {7upq `ƀ06$$C*B)DRRp!ʖŠAX/aGZ8>TMw0/^`8))SDeIvtB ѿ?BB|~Nsk׆ jV^ec" [` xxP "B@&h8} Æi?A \/zǣL4~v0r$t QXRЉHI۽relقϟt)7"ܺ2K~6ܹxIbh? U.Ο?;L!JJQcbDz?F۶ truQ>oeeuVTJK!8zTڮ\AŊʀtTMjOݯvvt^UK/)V AAQܺ޽ I-wXǎӳejfBt.TvW̊={61#8 ˉ~~JhĈog>Pmդ vV>zSǎg8xVLM |U]w iXrvvv[ndTʄMoEb.s߬۶ԩaǏ d-M{  P0 ֭bU$¨QT娍uq_Xr+WM,a@BH.1cUP|ٳ~vEy217Qu7[ɑ#qj䤍u KKK-qx<^JmFw!ϙ?_5V˖AkRb;^];M9sAX'Np8Xr<bŊ۶mc+BNtakd^YO$y S c4300+uƜgVNrB $lެZ1C/˲cLLr /rFD"Ev8>|z $;m czzz#:-vQa/;`_қƟ82"SzXI5<'9!G >^ܨԑ/=xK:͝XZF=_DT)UwŮ]Td**T}Hw{rje-yzeyyf`xn-|S.㾈9F QH_W_PXil@wsCU~sfknX8ptȒ^'^mRx:Z+J'~~={c>L@HX'OP4, _\;vd%$-x#L\-_>^٠'%2{n;KBXHgӓMOطhw˜cnq{6H$O>3W^<5fBe@5V|*(Gw1Iɩ'˗Mkk]6 z-qz\R.8儐BK4o`rU! 6)g)nEБnR2L^J3!!Nb{xx?~<{,DڳgO';aldě) [ hz7G +WZ^Èw.F\9MɆԸw{V5 `݇?3N9!zhmv/W7j3l}꠩߾bz"OIximL<uYIRhe!LÞ 9l`=%1[-["2gW'tG ÞBnA潍9Hmyr~[yn;=HJxy('R11p{r,{CQ:6:ȣl&MA xy :ښguؤow|^IEmM_ꋕ]^kvf Uf_Q- 7=+Gr&#<0y{dy{TvRʗ77HUs R%$ds@$譏5Ol&|ߐŠaYMhHYR>Sa sEHν />t^fi[eۦU>#^z:<_B`ng>ŗyuP )8 P+i xVع3 !Y=E ,B 8_ӯ`k jŏl&(PmBN''kO ,B~Nq/IuxQ:6>^ѳ+,|c𩀩OĢWciَ(y Y1s6&Y"yYDcF"SqR%#i-[nn!T /~jX[%mɊ׭)xP\")trį,j`O=K+Q)>UO`b6m<)-wwNC''ke RN(u,j`B_SV޾Żw.m9x0fwD\X62BZyr$ofSB&Tw* \r9!!-]kڴbDFKUA l yxxj`BZ޼RE'53gZ~f^秺_kWBr1B ,L`cXHkkدXXĉ\ s~iV~.^T,cGB=D )]S& #T'#9Y}ӧLVZVʲj2~hp,B@m,Rq ;:VXm\.})H׿?Q,G~`bbrj˖b{Ç'cѱsw˶mիe==R jc[Q֬@HA`dTOgPgggwjժ;3wf'P6mvLTٳ>4Æ"2e`nnqsss* Rp@9rUJ <=|ӧgailY>}ί]B.al,:uB\bjcBHA`vUϟ憰0Zҥ>=ں+2hK*1ukqTn2=.?J,HRCX?EMR nݰ`~EXRhb2<,ciYgl\s;m:z&1i\\8 N:|)F@ QV !47cN'P:!!;nrf6`M: !0W˗er'PFŊ5 f!$.]| 3ȧ40)ԁ-jք+a ɂ4 3쟮RzA2BAx a;Nn;'!*!P,B),Cr B-$`e$)@ اhP-eYTF$9k,m^Bȯ 3[5bH 1]zEͤRDz03[b<&!٣"={ғ!E,Q1|amÆDTd X0\n 1d"#, .}:BT} //=իadDLȯm'M}YH>#XB:u™3iׇ?ZBUaoѣqfFP;N@ѢT̄zB!Rl,5Ý;++,X=;  eW:Nnڱ-5ڑQΉ3;9VV[_%T*|۴V fI+R ۷kM EO}Fկ]Jmaet%sz(X>>+ِM#,'e{sfd,V&<}r1ԧu'n[?'zHL᧩K~f7x0p#CvjZf#ZEm7޸sCqzj&k$&E*סFlz;naOթ?:s@zPF^n}aoݽzp΍9y(] >9wN3`Ot)$5)>j;֨TNn:UݤC{S^]JiRN݆/ȤIQ>$~,`cps{`׆7nĻxM5vk1ezvo.MzkoOkFj[QsSMfL[xU1.d8Y̓4N-5~nM6[/35YiJ5jh&g!xC@* λs 5WԖM3ۻT3>vYʏQF)ڻ]$'EXZϢ_9vj(pof3Jc[s ՗U\:.ch >ߢ>< +ǐ0 IDAT`vdZJMUzAɯ *t ,jX-/;!wgiy5Ӈw<[ն<]w鋒_|rhK~WsVͮXq~3ҽ=6Da oZ#]2y͝췤cNUmj9zw|lzVl5GPqLAKkDigv+5#a.nw, kSp˴ݶ~=a2+}Uy-)u}vG8xSܜaD=`\rufsL- EUEy5]EjGM>oj^αyfM;kѫnP\?G =Kʗ KtFMK RK&:MUɯ *ݯ ,}o\֩Wck&ǰxblp6^4تE_-PwƥL4ujh,f, ݩmoc/xk2۵8.3. [VUokvjJ_-i\Tm_(%/g 7:(3.nl)7)u& <>`kS}i&;X™}Jgx,Y=]GIf,Qdfd{{נ_lʨs\dWTUEy5]tԔע*l=(p:k z0ϻIIDVLW񇆫[T&QhҥdNSgxk,]? v}iXE?>7gݐB17l3k6 +p` z(SS*OG߬ӧ># W..e{kqɮX5AKO:;i#lc@d^JSkji:ҔE TY5e@S to%7RÂk_-ZGQˁdKRK&:MU!MU>R>Kx޿2o#2kUFs5\vXsT&zohmG4]ug!]hɯYؕ)?*R6Mm~kz;D&>2>c5!KD^_?g&K$'"~f{Wӟ,y5M3>Zx,E#f#cە2jX(ӊFfI&K'9I'o2tt)Pvʘ bc?v76M8fݩ[Hn&ETŚZ"hpq  '9iD毱2<>&'~^;nF&]F9tћh0{vM/]VKm_/^4Uq4UA"! ,yw564x8AѲm&ఢuz1βl7'f{ i^Pa3.3Zy1dGlkMД:6u;mÕRzO\Ifnѽ֏mKg̗.ǥ6LVu8C KW}P M6jҔٸvM䗭|zZ@gaP[<QZ>.UqW1|ԫ6KB~ǯ兿^s} ߯S{ Tſvo`AB+M)d!H}:.˩i뤚T T$K2SA)Nr*&ِm,e eqB^B7!OWo-IENDB`starpu-1.1.5/doc/doxygen/html/classes.html0000644000373600000000000003072112571536763015501 00000000000000 StarPU Handbook: Data Structure Index
StarPU Handbook
Data Structure Index
starpu-1.1.5/doc/doxygen/html/group__API__FxT__Support.html0000644000373600000000000003740512571536763020651 00000000000000 StarPU Handbook: FxT Support
StarPU Handbook
FxT Support

Data Structures

struct  starpu_fxt_codelet_event
struct  starpu_fxt_options

Functions

void starpu_fxt_options_init (struct starpu_fxt_options *options)
void starpu_fxt_generate_trace (struct starpu_fxt_options *options)
void starpu_fxt_start_profiling (void)
void starpu_fxt_stop_profiling (void)

Detailed Description


Data Structure Documentation

struct starpu_fxt_codelet_event

todo

Data Fields
char symbol name of the codelet
int workerid
enum starpu_perfmodel_archtype archtype
uint32_t hash
size_t size
float time
struct starpu_fxt_options

todo

Data Fields
unsigned per_task_colour
unsigned no_counter
unsigned no_bus
unsigned ninputfiles
char * filenames
char * out_paje_path
char * distrib_time_path
char * activity_path
char * dag_path
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 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 worker_names Output parameters
enum starpu_perfmodel_archtype worker_archtypes Output parameters
int nworkers Output parameters
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 In case we want to dump the list of codelets to an external tool

Function Documentation

void starpu_fxt_options_init ( struct starpu_fxt_options options)

todo

void starpu_fxt_generate_trace ( struct starpu_fxt_options options)

todo

void starpu_fxt_start_profiling ( void  )

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_stop_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.

starpu-1.1.5/doc/doxygen/html/starpu__thread_8h.html0000644000373600000000000005337512571536757017464 00000000000000 StarPU Handbook: starpu_thread.h File Reference
starpu_thread.h File Reference
#include <starpu_config.h>
#include <xbt/synchro_core.h>
#include <msg/msg.h>

Go to the source code of this file.

Data Structures

struct  starpu_pthread_barrier_t

Macros

#define STARPU_PTHREAD_MUTEX_INITIALIZER
#define STARPU_PTHREAD_COND_INITIALIZER
#define STARPU_PTHREAD_BARRIER_SERIAL_THREAD

Typedefs

typedef int starpu_pthread_t
typedef int starpu_pthread_attr_t
typedef xbt_mutex_t starpu_pthread_mutex_t
typedef int starpu_pthread_mutexattr_t
typedef int starpu_pthread_key_t
typedef xbt_cond_t starpu_pthread_cond_t
typedef int starpu_pthread_condattr_t
typedef xbt_mutex_t starpu_pthread_rwlock_t
typedef int starpu_pthread_rwlockattr_t
typedef int starpu_pthread_barrierattr_t

Functions

int starpu_pthread_create_on (char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg, msg_host_t host)
int starpu_pthread_create (starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
int starpu_pthread_join (starpu_pthread_t thread, void **retval)
int starpu_pthread_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)
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_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)
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)
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)
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)

Detailed Description


Data Structure Documentation

struct starpu_pthread_barrier_t
Data Fields
starpu_pthread_mutex_t mutex
starpu_pthread_cond_t cond
starpu_pthread_cond_t cond_destroy
unsigned count
unsigned done
unsigned busy
starpu-1.1.5/doc/doxygen/html/starpu__sched__ctx__hypervisor_8h_source.html0000644000373600000000000003572512571536757024330 00000000000000 StarPU Handbook: starpu_sched_ctx_hypervisor.h Source File
starpu_sched_ctx_hypervisor.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010 - 2012 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef __STARPU_SCHED_CTX_HYPERVISOR_H__
18 #define __STARPU_SCHED_CTX_HYPERVISOR_H__
19 
20 #ifdef __cplusplus
21 extern "C"
22 {
23 #endif
24 
25 
26 
28 {
29  void (*notify_idle_cycle)(unsigned sched_ctx_id, int worker, double idle_time);
30  void (*notify_poped_task)(unsigned sched_ctx_id, int worker);
31  void (*notify_pushed_task)(unsigned sched_ctx_id, int worker);
32  void (*notify_post_exec_task)(struct starpu_task *task, size_t data_size, uint32_t footprint, int hypervisor_tag, double flops);
33  void (*notify_submitted_job)(struct starpu_task *task, uint32_t footprint, size_t data_size);
34  void (*notify_empty_ctx)(unsigned sched_ctx_id, struct starpu_task *task);
35  void (*notify_delete_context)(unsigned sched_ctx);
36 };
37 
38 #ifdef STARPU_USE_SC_HYPERVISOR
39 void starpu_sched_ctx_set_perf_counters(unsigned sched_ctx_id, void* perf_counters);
40 #endif //STARPU_USE_SC_HYPERVISOR
41 
43 
45 
46 #ifdef __cplusplus
47 }
48 #endif
49 
50 #endif /* __STARPU_SCHED_CTX_HYPERVISOR_H__ */
starpu-1.1.5/doc/doxygen/html/starpu__util_8h.html0000644000373600000000000004202412571536757017157 00000000000000 StarPU Handbook: starpu_util.h File Reference
starpu_util.h File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <starpu_config.h>
#include <starpu_task.h>
#include <sys/time.h>

Go to the source code of this file.

Macros

#define STARPU_GNUC_PREREQ(maj, min)
#define STARPU_UNLIKELY(expr)
#define STARPU_LIKELY(expr)
#define STARPU_ATTRIBUTE_UNUSED
#define STARPU_ATTRIBUTE_NORETURN
#define STARPU_ATTRIBUTE_INTERNAL
#define STARPU_ATTRIBUTE_MALLOC
#define STARPU_ATTRIBUTE_WARN_UNUSED_RESULT
#define STARPU_ATTRIBUTE_PURE
#define STARPU_ATTRIBUTE_ALIGNED(size)
#define STARPU_INLINE
#define endif
#define STARPU_WARN_UNUSED_RESULT
#define STARPU_POISON_PTR
#define STARPU_MIN(a, b)
#define STARPU_MAX(a, b)
#define STARPU_BACKTRACE_LENGTH
#define STARPU_DUMP_BACKTRACE()
#define STARPU_ASSERT(x)
#define STARPU_ASSERT_MSG(x, msg,...)
#define STARPU_ABORT()
#define STARPU_ABORT_MSG(msg,...)
#define STARPU_CHECK_RETURN_VALUE(err, message,...)
#define STARPU_CHECK_RETURN_VALUE_IS(err, value, message,...)
#define STARPU_ATOMIC_SOMETHING(name, expr)
#define STARPU_RMB()
#define STARPU_WMB()

Functions

char * starpu_getenv (const char *str)
static __starpu_inline int starpu_get_env_number (const char *str)
static __starpu_inline int starpu_get_env_number_default (const char *str, int defval)
void starpu_trace_user_event (unsigned long code)
void starpu_execute_on_each_worker (void(*func)(void *), void *arg, uint32_t where)
void starpu_execute_on_each_worker_ex (void(*func)(void *), void *arg, uint32_t where, const char *name)
void starpu_execute_on_specific_workers (void(*func)(void *), void *arg, unsigned num_workers, unsigned *workers, const char *name)
int starpu_data_cpy (starpu_data_handle_t dst_handle, starpu_data_handle_t src_handle, int asynchronous, void(*callback_func)(void *), void *callback_arg)
double starpu_timing_now (void)

Variables

int _starpu_silent

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__thread_8h_source.html0000644000373600000000000013174212571536757021037 00000000000000 StarPU Handbook: starpu_thread.h Source File
starpu_thread.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010, 2012-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_THREAD_H__
19 #define __STARPU_THREAD_H__
20 
21 #include <starpu_config.h>
22 #ifdef STARPU_SIMGRID
23 #include <xbt/synchro_core.h>
24 #ifdef STARPU_HAVE_SIMGRID_MSG_H
25 #include <simgrid/msg.h>
26 #else
27 #include <msg/msg.h>
28 #endif
29 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU)
30 #include <pthread.h>
31 #endif
32 
33 #ifdef __cplusplus
34 extern "C"
35 {
36 #endif
37 
38 /*
39  * Encapsulation of the pthread_create function.
40  */
41 
42 #ifdef STARPU_SIMGRID
43 
44 typedef int starpu_pthread_t;
45 typedef int starpu_pthread_attr_t;
46 
47 int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg, msg_host_t host);
48 int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
49 int starpu_pthread_join(starpu_pthread_t thread, void **retval);
50 int starpu_pthread_attr_init(starpu_pthread_attr_t *attr);
51 int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr);
52 int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate);
53 
54 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* STARPU_SIMGRID */
55 
56 typedef pthread_t starpu_pthread_t;
57 typedef pthread_attr_t starpu_pthread_attr_t;
58 
59 #define starpu_pthread_create pthread_create
60 #define starpu_pthread_create_on(name, thread, attr, routine, arg, where) starpu_pthread_create(thread, attr, routine, arg)
61 #define starpu_pthread_join pthread_join
62 #define starpu_pthread_attr_init pthread_attr_init
63 #define starpu_pthread_attr_destroy pthread_attr_destroy
64 #define starpu_pthread_attr_setdetachstate pthread_attr_setdetachstate
65 
66 #endif /* STARPU_SIMGRID, _MSC_VER */
67 
68 /*
69  * Encapsulation of the pthread_mutex_* functions.
70  */
71 
72 #ifdef STARPU_SIMGRID
73 typedef xbt_mutex_t starpu_pthread_mutex_t;
74 typedef int starpu_pthread_mutexattr_t;
75 
76 #define STARPU_PTHREAD_MUTEX_INITIALIZER NULL
77 
78 int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr);
79 int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex);
80 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex);
81 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex);
82 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex);
83 
84 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
85 
86 typedef pthread_mutex_t starpu_pthread_mutex_t;
87 typedef pthread_mutexattr_t starpu_pthread_mutexattr_t;
88 
89 #define starpu_pthread_mutex_init pthread_mutex_init
90 #define starpu_pthread_mutex_destroy pthread_mutex_destroy
91 #define starpu_pthread_mutex_lock pthread_mutex_lock
92 #define starpu_pthread_mutex_unlock pthread_mutex_unlock
93 #define starpu_pthread_mutex_trylock pthread_mutex_trylock
94 
95 #define STARPU_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
96 
97 #endif /* STARPU_SIMGRID, _MSC_VER */
98 
99 /*
100  * Encapsulation of the pthread_key_* functions.
101  */
102 #ifdef STARPU_SIMGRID
103 
104 typedef int starpu_pthread_key_t;
105 int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *));
106 int starpu_pthread_key_delete(starpu_pthread_key_t key);
107 int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer);
108 void *starpu_pthread_getspecific(starpu_pthread_key_t key);
109 
110 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
111 
112 typedef pthread_key_t starpu_pthread_key_t;
113 
114 #define starpu_pthread_key_create pthread_key_create
115 #define starpu_pthread_key_delete pthread_key_delete
116 #define starpu_pthread_setspecific pthread_setspecific
117 #define starpu_pthread_getspecific pthread_getspecific
118 
119 #endif /* STARPU_SIMGRID, _MSC_VER */
120 
121 /*
122  * Encapsulation of the pthread_cond_* functions.
123  */
124 
125 #ifdef STARPU_SIMGRID
126 
127 typedef xbt_cond_t starpu_pthread_cond_t;
128 typedef int starpu_pthread_condattr_t;
129 #define STARPU_PTHREAD_COND_INITIALIZER NULL
130 
131 int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr);
132 int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond);
133 int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond);
134 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
135 int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime);
136 int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond);
137 
138 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
139 
140 typedef pthread_cond_t starpu_pthread_cond_t;
141 typedef pthread_condattr_t starpu_pthread_condattr_t;
142 #define STARPU_PTHREAD_COND_INITIALIZER PTHREAD_COND_INITIALIZER
143 
144 #define starpu_pthread_cond_init pthread_cond_init
145 #define starpu_pthread_cond_signal pthread_cond_signal
146 #define starpu_pthread_cond_broadcast pthread_cond_broadcast
147 #define starpu_pthread_cond_wait pthread_cond_wait
148 #define starpu_pthread_cond_timedwait pthread_cond_timedwait
149 #define starpu_pthread_cond_destroy pthread_cond_destroy
150 
151 #endif /* STARPU_SIMGRID, _MSC_VER */
152 
153 /*
154  * Encapsulation of the pthread_rwlock_* functions.
155  */
156 
157 #ifdef STARPU_SIMGRID
158 
159 typedef xbt_mutex_t starpu_pthread_rwlock_t;
160 typedef int starpu_pthread_rwlockattr_t;
161 
162 int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr);
163 int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock);
164 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock);
165 int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock);
166 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock);
167 int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock);
168 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock);
169 
170 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
171 
172 typedef pthread_rwlock_t starpu_pthread_rwlock_t;
173 typedef pthread_rwlockattr_t starpu_pthread_rwlockattr_t;
174 
175 #define starpu_pthread_rwlock_init pthread_rwlock_init
176 #define starpu_pthread_rwlock_destroy pthread_rwlock_destroy
177 #define starpu_pthread_rwlock_rdlock pthread_rwlock_rdlock
178 #define starpu_pthread_rwlock_tryrdlock pthread_rwlock_tryrdlock
179 #define starpu_pthread_rwlock_wrlock pthread_rwlock_wrlock
180 #define starpu_pthread_rwlock_trywrlock pthread_rwlock_trywrlock
181 #define starpu_pthread_rwlock_unlock pthread_rwlock_unlock
182 
183 #endif /* STARPU_SIMGRID, _MSC_VER */
184 
185 /*
186  * Encapsulation of the pthread_barrier_* functions.
187  */
188 
189 #if defined(STARPU_SIMGRID) || (!defined(STARPU_HAVE_PTHREAD_BARRIER) && (!defined(_MSC_VER) || defined(BUILDING_STARPU)))
190 
191 typedef struct {
192  starpu_pthread_mutex_t mutex;
193  starpu_pthread_cond_t cond;
194  starpu_pthread_cond_t cond_destroy;
195  unsigned count;
196  unsigned done;
197  unsigned busy;
199 typedef int starpu_pthread_barrierattr_t;
200 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1
201 
202 int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count);
203 int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier);
204 int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier);
205 
206 #elif !defined(_MSC_VER) /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER */
207 
208 typedef pthread_barrier_t starpu_pthread_barrier_t;
209 typedef pthread_barrierattr_t starpu_pthread_barrierattr_t;
210 
211 #define starpu_pthread_barrier_init pthread_barrier_init
212 #define starpu_pthread_barrier_destroy pthread_barrier_destroy
213 #define starpu_pthread_barrier_wait pthread_barrier_wait
214 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD PTHREAD_BARRIER_SERIAL_THREAD
215 
216 #endif /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER, _MSC_VER */
217 
218 #if defined(_MSC_VER) && !defined(BUILDING_STARPU)
219 typedef void* starpu_pthread_rwlock_t;
220 typedef void* starpu_pthread_mutex_t;
221 typedef void* starpu_pthread_cond_t;
222 typedef void* starpu_pthread_barrier_t;
223 #endif /* _MSC_VER */
224 
225 #ifdef __cplusplus
226 }
227 #endif
228 
229 #endif /* __STARPU_THREAD_H__ */
230 
231 
starpu-1.1.5/doc/doxygen/html/starpu__mpi_8h.html0000644000373600000000000005633412571536757017000 00000000000000 StarPU Handbook: starpu_mpi.h File Reference
starpu_mpi.h File Reference
#include <starpu.h>
#include <mpi.h>

Go to the source code of this file.

Macros

#define starpu_mpi_data_register(data_handle, tag, rank)
#define starpu_mpi_data_set_rank(handle, rank)
#define starpu_data_set_rank
#define starpu_data_set_tag
#define starpu_data_get_rank
#define starpu_data_get_tag

Typedefs

typedef void * starpu_mpi_req

Functions

int starpu_mpi_issend_detached (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void(*callback)(void *), void *arg)
int starpu_mpi_data_set_rank_comm (starpu_data_handle_t handle, int rank, MPI_Comm comm)
int starpu_mpi_data_set_tag (starpu_data_handle_t handle, int tag)
Communication

int starpu_mpi_isend (starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm)
int starpu_mpi_irecv (starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm)
int starpu_mpi_send (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm)
int starpu_mpi_recv (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status)
int starpu_mpi_isend_detached (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void(*callback)(void *), void *arg)
int starpu_mpi_irecv_detached (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void(*callback)(void *), void *arg)
int starpu_mpi_issend (starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm)
int starpu_mpi_wait (starpu_mpi_req *req, MPI_Status *status)
int starpu_mpi_test (starpu_mpi_req *req, int *flag, MPI_Status *status)
int starpu_mpi_barrier (MPI_Comm comm)
int starpu_mpi_isend_detached_unlock_tag (starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag)
int starpu_mpi_irecv_detached_unlock_tag (starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag)
int starpu_mpi_isend_array_detached_unlock_tag (unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag)
int starpu_mpi_irecv_array_detached_unlock_tag (unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag)
Initialisation
int starpu_mpi_init (int *argc, char ***argv, int initialize_mpi)
int starpu_mpi_initialize (void)
int starpu_mpi_initialize_extended (int *rank, int *world_size)
int starpu_mpi_shutdown (void)
void starpu_mpi_comm_amounts_retrieve (size_t *comm_amounts)
MPI Insert Task

int starpu_mpi_insert_task (MPI_Comm comm, struct starpu_codelet *codelet,...)
void starpu_mpi_get_data_on_node (MPI_Comm comm, starpu_data_handle_t data_handle, int node)
void starpu_mpi_get_data_on_node_detached (MPI_Comm comm, starpu_data_handle_t data_handle, int node, void(*callback)(void *), void *arg)
void starpu_mpi_data_register_comm (starpu_data_handle_t data_handle, int tag, int rank, MPI_Comm comm)
int starpu_mpi_data_get_rank (starpu_data_handle_t handle)
int starpu_mpi_data_get_tag (starpu_data_handle_t handle)
Collective Operations

void starpu_mpi_redux_data (MPI_Comm comm, starpu_data_handle_t data_handle)
int starpu_mpi_scatter_detached (starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void(*scallback)(void *), void *sarg, void(*rcallback)(void *), void *rarg)
int starpu_mpi_gather_detached (starpu_data_handle_t *data_handles, int count, int root, MPI_Comm comm, void(*scallback)(void *), void *sarg, void(*rcallback)(void *), void *rarg)
Communication Cache
void starpu_mpi_cache_flush (MPI_Comm comm, starpu_data_handle_t data_handle)
void starpu_mpi_cache_flush_all_data (MPI_Comm comm)
int starpu_mpi_cache_is_enabled ()
int starpu_mpi_cache_set (int enabled)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__thread__util_8h.html0000644000373600000000000003465412571536757020657 00000000000000 StarPU Handbook: starpu_thread_util.h File Reference
starpu_thread_util.h File Reference
#include <starpu_util.h>
#include <errno.h>

Go to the source code of this file.

Macros

#define STARPU_PTHREAD_CREATE_ON(name, thread, attr, routine, arg, where)
#define STARPU_PTHREAD_CREATE(thread, attr, routine, arg)
#define STARPU_PTHREAD_MUTEX_INIT(mutex, attr)
#define STARPU_PTHREAD_MUTEX_DESTROY(mutex)
#define STARPU_PTHREAD_MUTEX_LOCK(mutex)
#define STARPU_PTHREAD_MUTEX_TRYLOCK(mutex)
#define STARPU_PTHREAD_MUTEX_UNLOCK(mutex)
#define STARPU_PTHREAD_KEY_CREATE(key, destr)
#define STARPU_PTHREAD_KEY_DELETE(key)
#define STARPU_PTHREAD_SETSPECIFIC(key, ptr)
#define STARPU_PTHREAD_GETSPECIFIC(key)
#define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr)
#define STARPU_PTHREAD_RWLOCK_RDLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_TRYRDLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_WRLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_TRYWRLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_UNLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_DESTROY(rwlock)
#define STARPU_PTHREAD_COND_INIT(cond, attr)
#define STARPU_PTHREAD_COND_DESTROY(cond)
#define STARPU_PTHREAD_COND_SIGNAL(cond)
#define STARPU_PTHREAD_COND_BROADCAST(cond)
#define STARPU_PTHREAD_COND_WAIT(cond, mutex)
#define STARPU_PTHREAD_BARRIER_INIT(barrier, attr, count)
#define STARPU_PTHREAD_BARRIER_DESTROY(barrier)
#define STARPU_PTHREAD_BARRIER_WAIT(barrier)

Functions

static STARPU_INLINE int _starpu_pthread_mutex_trylock (starpu_pthread_mutex_t *mutex, char *file, int line)
static STARPU_INLINE int _starpu_pthread_rwlock_tryrdlock (starpu_pthread_rwlock_t *rwlock, char *file, int line)
static STARPU_INLINE int _starpu_pthread_rwlock_trywrlock (starpu_pthread_rwlock_t *rwlock, char *file, int line)

Detailed Description

starpu-1.1.5/doc/doxygen/html/ftv2node.png0000644000373600000000000000012612571536757015412 00000000000000PNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`starpu-1.1.5/doc/doxygen/html/group__API__Versioning.html0000644000373600000000000002071512571536763020374 00000000000000 StarPU Handbook: Versioning
StarPU Handbook
Versioning

Macros

#define STARPU_MAJOR_VERSION
#define STARPU_MINOR_VERSION
#define STARPU_RELEASE_VERSION

Functions

void starpu_get_version (int *major, int *minor, int *release)

Detailed Description

Macro Definition Documentation

#define STARPU_MAJOR_VERSION

Define the major version of StarPU. This is the version used when compiling the application.

#define STARPU_MINOR_VERSION

Define the minor version of StarPU. This is the version used when compiling the application.

#define STARPU_RELEASE_VERSION

Define the release version of StarPU. This is the version used when compiling the application.

Function Documentation

void starpu_get_version ( int *  major,
int *  minor,
int *  release 
)

Return as 3 integers the version of StarPU used when running the application.

starpu-1.1.5/doc/doxygen/html/modules.html0000644000373600000000000003452412571536763015521 00000000000000 StarPU Handbook: Modules
StarPU Handbook
Modules
Here is a list of all modules:
oCodelet And TasksThis section describes the interface to manipulate codelets and tasks
oCUDA Extensions
oData Interfaces
oData ManagementThis section describes the data management facilities provided by StarPU. We show how to use existing data interfaces in Data Interfaces, but developers can design their own data interfaces if required
oData Partition
oExpert Mode
oExplicit Dependencies
oFFT Support
oFxT Support
oImplicit Data DependenciesIn 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
oInitialization and Termination
oInsert_Task
oTheoretical Lower Bound on Execution TimeCompute theoretical upper computation efficiency bound corresponding to some actual execution
oMiscellaneous Helpers
oMPI Support
oMultiformat Data Interface
oOpenCL Extensions
oParallel Tasks
oPerformance Model
oProfiling
oRunning Drivers
oScheduling ContextsStarPU 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
oScheduling PolicyTODO. While StarPU comes with a variety of scheduling policies (see Task Scheduling Policy), 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
oStandard Memory Library
oTask Bundles
oTask Lists
oThreadsThis 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 (Simulated Performance)
oToolboxThe following macros allow to make GCC extensions portable, and to have a code which can be compiled with any C compiler
oStarPU-Top Interface
oVersioning
oWorkers’ Properties
oScheduling Context Hypervisor - Building a new resizing policy
\Scheduling Context Hypervisor - Regular usage
starpu-1.1.5/doc/doxygen/html/dir_be07a7057e06e61e369ed6169294e43b.html0000644000373600000000000002211212571536763021130 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/doc/doxygen/chapters/ Directory Reference
chapters Directory Reference

Directories

directory  api

Files

file  00introduction.doxy
file  01building.doxy
file  02basic_examples.doxy
file  03advanced_examples.doxy
file  04optimize_performance.doxy
file  06tips_and_tricks.doxy
file  08mpi_support.doxy
file  09fft_support.doxy
file  11c_extensions.doxy
file  12socl_opencl_extensions.doxy
file  13scheduling_contexts.doxy
file  14scheduling_context_hypervisor.doxy
file  15environment_variables.doxy
file  16configure_options.doxy
file  17files.doxy
file  18scaling-vector-example.doxy
file  19fdl-1.3.doxy
starpu-1.1.5/doc/doxygen/html/starpu__hash_8h.html0000644000373600000000000001552512571536757017133 00000000000000 StarPU Handbook: starpu_hash.h File Reference
starpu_hash.h File Reference
#include <stdint.h>
#include <stddef.h>

Go to the source code of this file.

Functions

Defining Interface

Applications can provide their own interface as shown in Defining A New Data Interface.

uint32_t starpu_hash_crc32c_be_n (const void *input, size_t n, uint32_t inputcrc)
uint32_t starpu_hash_crc32c_be (uint32_t input, uint32_t inputcrc)
uint32_t starpu_hash_crc32c_string (const char *str, uint32_t inputcrc)

Detailed Description

starpu-1.1.5/doc/doxygen/html/tab_a.png0000644000373600000000000000021612571536757014731 00000000000000PNG  IHDR$[UIDATxK 0C'o([Ž%x#٩ We# 3t I 3+E~\D9wM}Y_A4Y}IENDB`starpu-1.1.5/doc/doxygen/html/group__API__Implicit__Data__Dependencies.html0000644000373600000000000002401112571536763023711 00000000000000 StarPU Handbook: Implicit Data Dependencies
StarPU Handbook
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. More...

Functions

void starpu_data_set_default_sequential_consistency_flag (unsigned flag)
unsigned starpu_data_get_default_sequential_consistency_flag (void)
void starpu_data_set_sequential_consistency_flag (starpu_data_handle_t handle, unsigned flag)

Detailed Description

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.

Function Documentation

starpu_data_set_default_sequential_consistency_flag ( unsigned  flag)

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().

unsigned starpu_data_get_default_sequential_consistency_flag ( void  )

Return the default sequential consistency flag

void starpu_data_set_sequential_consistency_flag ( starpu_data_handle_t  handle,
unsigned  flag 
)

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().

starpu-1.1.5/doc/doxygen/html/starpu__task__util_8h_source.html0000644000373600000000000004420712571536757021725 00000000000000 StarPU Handbook: starpu_task_util.h Source File
starpu_task_util.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2013, 2015 Université de Bordeaux
4  * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique
5  * Copyright (C) 2014 INRIA
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_TASK_UTIL_H__
20 #define __STARPU_TASK_UTIL_H__
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26 #include <starpu.h>
27 
28 #ifdef __cplusplus
29 extern "C"
30 {
31 #endif
32 
33 void starpu_create_sync_task(starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void (*callback)(void *), void *callback_arg);
34 
35 #define STARPU_MODE_SHIFT 16
36 #define STARPU_VALUE (1<<STARPU_MODE_SHIFT)
37 #define STARPU_CALLBACK (2<<STARPU_MODE_SHIFT)
38 #define STARPU_CALLBACK_WITH_ARG (3<<STARPU_MODE_SHIFT)
39 #define STARPU_CALLBACK_ARG (4<<STARPU_MODE_SHIFT)
40 #define STARPU_PRIORITY (5<<STARPU_MODE_SHIFT)
41 #define STARPU_EXECUTE_ON_NODE (6<<STARPU_MODE_SHIFT)
42 #define STARPU_EXECUTE_ON_DATA (7<<STARPU_MODE_SHIFT)
43 #define STARPU_DATA_ARRAY (8<<STARPU_MODE_SHIFT)
44 #define STARPU_TAG (9<<STARPU_MODE_SHIFT)
45 #define STARPU_HYPERVISOR_TAG (10<<STARPU_MODE_SHIFT)
46 #define STARPU_FLOPS (11<<STARPU_MODE_SHIFT)
47 #define STARPU_SCHED_CTX (12<<STARPU_MODE_SHIFT)
48 #define STARPU_PROLOGUE_CALLBACK (13<<STARPU_MODE_SHIFT)
49 #define STARPU_PROLOGUE_CALLBACK_ARG (14<<STARPU_MODE_SHIFT)
50 #define STARPU_EXECUTE_ON_WORKER (15<<STARPU_MODE_SHIFT)
51 #define STARPU_SHIFTED_MODE_MAX (16<<STARPU_MODE_SHIFT)
52 
53 struct starpu_task *starpu_task_build(struct starpu_codelet *cl, ...);
54 int starpu_insert_task(struct starpu_codelet *cl, ...);
55 
56 void starpu_codelet_unpack_args(void *cl_arg, ...);
57 
58 void starpu_codelet_pack_args(void **arg_buffer, size_t *arg_buffer_size, ...);
59 
60 #ifdef __cplusplus
61 }
62 #endif
63 
64 #endif /* __STARPU_TASK_UTIL_H__ */
starpu-1.1.5/doc/doxygen/html/functions_vars_0x63.html0000644000373600000000000003154712571536763017676 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- c -

starpu-1.1.5/doc/doxygen/html/starpu__sched__ctx__hypervisor_8h.html0000644000373600000000000001614012571536757022736 00000000000000 StarPU Handbook: starpu_sched_ctx_hypervisor.h File Reference
starpu_sched_ctx_hypervisor.h File Reference

Go to the source code of this file.

Data Structures

struct  starpu_sched_ctx_performance_counters

Functions

Scheduling Context Link with Hypervisor
void starpu_sched_ctx_set_perf_counters (unsigned sched_ctx_id, void *perf_counters)
void starpu_sched_ctx_notify_hypervisor_exists (void)
unsigned starpu_sched_ctx_check_if_hypervisor_exists (void)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__task__bundle_8h.html0000644000373600000000000001753512571536757020645 00000000000000 StarPU Handbook: starpu_task_bundle.h File Reference
starpu_task_bundle.h File Reference

Go to the source code of this file.

Typedefs

typedef struct
_starpu_task_bundle * 
starpu_task_bundle_t

Functions

void starpu_task_bundle_create (starpu_task_bundle_t *bundle)
int starpu_task_bundle_insert (starpu_task_bundle_t bundle, struct starpu_task *task)
int starpu_task_bundle_remove (starpu_task_bundle_t bundle, struct starpu_task *task)
void starpu_task_bundle_close (starpu_task_bundle_t bundle)

Detailed Description

starpu-1.1.5/doc/doxygen/html/PerformanceFeedback.html0000644000373600000000000010716112571536762017714 00000000000000 StarPU Handbook: Performance Feedback
Performance Feedback

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.

temanejo.png

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).

On-line Performance Feedback

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 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 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 Profiling.

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().

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.

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.

When an FxT trace is generated (see Generating Traces With FxT), it is also possible to use the tool starpu_workers_activity (see Monitoring Activity) to generate a graphic showing the evolution of these values during the time, for the different workers.

Bus-related Feedback

TODO: ajouter STARPU_BUS_STATS

The bus speed measured by StarPU can be displayed by using the tool starpu_machine_display, for instance:

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

StarPU-Top Interface

StarPU-Top is an interface which remotely displays the on-line state of a StarPU application and permits the user to change parameters on the fly.

Variables to be monitored can be registered by calling the functions starpu_top_add_data_boolean(), starpu_top_add_data_integer(), starpu_top_add_data_float(), e.g.:

starpu_top_data *data = starpu_top_add_data_integer("mynum", 0, 100, 1);

The application should then call starpu_top_init_and_wait() to give its name and wait for StarPU-Top to get a start request from the user. The name is used by StarPU-Top to quickly reload a previously-saved layout of parameter display.

starpu_top_init_and_wait("the application");

The new values can then be provided thanks to starpu_top_update_data_boolean(), starpu_top_update_data_integer(), starpu_top_update_data_float(), e.g.:

Updateable parameters can be registered thanks to starpu_top_register_parameter_boolean(), starpu_top_register_parameter_integer(), starpu_top_register_parameter_float(), e.g.:

float alpha;
starpu_top_register_parameter_float("alpha", &alpha, 0, 10, modif_hook);

modif_hook is a function which will be called when the parameter is being modified, it can for instance print the new value:

void modif_hook(struct starpu_top_param *d) {
fprintf(stderr,"%s has been modified: %f\n", d->name, alpha);
}

Task schedulers should notify StarPU-Top when it has decided when a task will be scheduled, so that it can show it in its Gantt chart, for instance:

starpu_top_task_prevision(task, workerid, begin, end);

Starting StarPU-Top (StarPU-Top is started via the binary starpu_top.) and the application can be done two ways:

  • The application is started by hand on some machine (and thus already waiting for the start event). In the Preference dialog of StarPU-Top, the SSH checkbox should be unchecked, and the hostname and port (default is 2011) on which the application is already running should be specified. Clicking on the connection button will thus connect to the already-running application.
  • StarPU-Top is started first, and clicking on the connection button will start the application itself (possibly on a remote machine). The SSH checkbox should be checked, and a command line provided, e.g.:

    $ ssh myserver STARPU_SCHED=dmda ./application
    

    If port 2011 of the remote machine can not be accessed directly, an ssh port bridge should be added:

    $ ssh -L 2011:localhost:2011 myserver STARPU_SCHED=dmda ./application
    

    and "localhost" should be used as IP Address to connect to.

Off-line Performance Feedback

Generating Traces With FxT

StarPU can use the FxT library (see https://savannah.nongnu.org/projects/fkt/) to generate traces with a limited runtime overhead.

You can either get a tarball:

$ wget http://download.savannah.gnu.org/releases/fkt/fxt-0.2.11.tar.gz

or use the FxT library from CVS (autotools are required):

$ cvs -d :pserver:anonymous\@cvs.sv.gnu.org:/sources/fkt co FxT
$ ./bootstrap

Compiling and installing the FxT library in the $FXTDIR path is done following the standard procedure:

$ ./configure --prefix=$FXTDIR
$ make
$ make install

In order to have StarPU to generate traces, StarPU should be configured with the option --with-fxt :

$ ./configure --with-fxt=$FXTDIR

Or you can simply point the PKG_CONFIG_PATH to $FXTDIR/lib/pkgconfig and pass --with-fxt to ./configure

When FxT is enabled, a trace is generated when StarPU is terminated by calling starpu_shutdown(). The trace is a binary file whose name has the form prof_file_XXX_YYY where XXX is the user name, and YYY is the pid of the process that used StarPU. This file is saved in the /tmp/ directory by default, or by the directory specified by the environment variable STARPU_FXT_PREFIX.

Creating a Gantt Diagram

When the FxT trace file filename has been generated, it is possible to generate a trace in the Paje format by calling:

$ starpu_fxt_tool -i filename

Or alternatively, setting the environment variable STARPU_GENERATE_TRACE to 1 before application execution will make StarPU do it automatically at application shutdown.

This will create a file paje.trace in the current directory that can be inspected with the ViTE trace visualizing open-source tool. It is possible to open the file paje.trace with ViTE by using the following command:

$ vite paje.trace

To get names of tasks instead of "unknown", fill the optional starpu_codelet::name, or use a performance model for them.

In the MPI execution case, collect the trace files from the MPI nodes, and specify them all on the command starpu_fxt_tool, for instance:

$ starpu_fxt_tool -i filename1 -i filename2

By default, all tasks are displayed using a green color. To display tasks with varying colors, pass option -c to starpu_fxt_tool.

Traces can also be inspected by hand by using the tool fxt_print, for instance:

$ fxt_print -o -f filename

Timings are in nanoseconds (while timings as seen in vite are in milliseconds).

Creating a DAG With Graphviz

When the FxT trace file filename has been generated, it is possible to generate a task graph in the DOT format by calling:

$ starpu_fxt_tool -i filename

This will create a dag.dot file in the current directory. This file is a task graph described using the DOT language. It is possible to get a graphical output of the graph by using the graphviz library:

$ dot -Tpdf dag.dot -o output.pdf

Monitoring Activity

When the FxT trace file filename has been generated, it is possible to generate an activity trace by calling:

$ starpu_fxt_tool -i filename

This will create a file activity.data in the current directory. A profile of the application showing the activity of StarPU during the execution of the program can be generated:

$ starpu_workers_activity activity.data

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.

Performance Of Codelets

The performance model of codelets (see PerformanceModelExample) can be examined by using the tool starpu_perfmodel_display:

$ starpu_perfmodel_display -l
file: <malloc_pinned.hannibal>
file: <starpu_slu_lu_model_21.hannibal>
file: <starpu_slu_lu_model_11.hannibal>
file: <starpu_slu_lu_model_22.hannibal>
file: <starpu_slu_lu_model_12.hannibal>

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:

$ 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

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:

$ 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
...

The same can also be achieved by using StarPU's library API, see Performance Model and notably the function starpu_perfmodel_load_symbol(). The source code of the tool starpu_perfmodel_display can be a useful example.

The tool starpu_perfmodel_plot can be used to draw performance models. It writes a .gp file in the current directory, to be run with the tool gnuplot, which shows the corresponding curve.

starpu_non_linear_memset_regression_based.png

When the field starpu_task::flops is set, starpu_perfmodel_plot can directly draw a GFlops curve, by simply adding the -f option:

$ starpu_perfmodel_plot -f -s chol_model_11

This will however disable displaying the regression model, for which we can not compute GFlops.

starpu_chol_model_11_type.png

When the FxT trace file filename has been generated, it is possible to get a profiling of each codelet by calling:

$ starpu_fxt_tool -i filename
$ starpu_codelet_profile distrib.data codelet_name

This will create profiling data files, and a .gp file in the current directory, which draws the distribution of codelet time over the application execution, according to data input size.

distrib_data.png

This is also available in the tool starpu_perfmodel_plot, by passing it the fxt trace:

$ starpu_perfmodel_plot -s non_linear_memset_regression_based -i /tmp/prof_file_foo_0

It will produce a .gp file which contains both the performance model curves, and the profiling measurements.

starpu_non_linear_memset_regression_based_2.png

If you have the statistical tool R installed, you can additionally use

$ starpu_codelet_histo_profile distrib.data

Which will create one .pdf file per codelet and per input size, showing a histogram of the codelet execution time distribution.

distrib_data_histo.png

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:

$ R
> install.packages("plyr")
> install.packages("ggplot2")
> install.packages("data.table")
> install.packages("knitr")

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:

$ 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

And one can plot histograms of execution times, of several states for instance:

$ starpu_paje_draw_histogram -n chol_model_11,chol_model_21,chol_model_22 native.trace simgrid.trace

and see the resulting pdf file:

paje_draw_histogram.png

A quick statistical report can be generated by using:

$ starpu_paje_summary native.trace simgrid.trace

it includes gantt charts, execution summaries, as well as state duration charts and time distribution histograms.

Other external Pajé 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):

$ starpu_paje_sort paje.trace

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.

Theoretical Lower Bound On Execution Time Example provides an example on how to use this.

Memory Feedback

It is possible to enable memory statistics. To do so, you need to pass the option --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 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:

$ 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
$ 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

Data Statistics

Different data statistics can be displayed at the end of the execution of the application. To enable them, you need to pass the option --enable-stats when calling configure. When calling starpu_shutdown() various statistics will be displayed, execution, MSI cache statistics, allocation cache statistics, and data transfer statistics. The display can be disabled by setting the environment variable STARPU_STATS to 0.

$ ./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 %)
...
$ STARPU_STATS=0 ./examples/cholesky/cholesky_tag
Computation took (in ms)
518.16
Synthetic GFlops : 44.21
starpu-1.1.5/doc/doxygen/html/group__API__Running__Drivers.html0000644000373600000000000002652512571536763021533 00000000000000 StarPU Handbook: Running Drivers
StarPU Handbook
Running Drivers

Functions

int starpu_driver_run (struct starpu_driver *d)
int starpu_driver_init (struct starpu_driver *d)
int starpu_driver_run_once (struct starpu_driver *d)
int starpu_driver_deinit (struct starpu_driver *d)
void starpu_drivers_request_termination (void)

Detailed Description

Function Documentation

int starpu_driver_run ( struct starpu_driver d)

Initialize the given driver, run it until it receives a request to terminate, deinitialize it and return 0 on success. It returns -EINVAL if d->type is not a valid StarPU device type (STARPU_CPU_WORKER, STARPU_CUDA_WORKER or STARPU_OPENCL_WORKER). This is the same as using the following functions: calling starpu_driver_init(), then calling starpu_driver_run_once() in a loop, and eventually starpu_driver_deinit().

int starpu_driver_init ( struct starpu_driver d)

Initialize the given driver. Returns 0 on success, -EINVAL if d->type is not a valid starpu_worker_archtype.

int starpu_driver_run_once ( struct starpu_driver d)

Run the driver once, then returns 0 on success, -EINVAL if d->type is not a valid starpu_worker_archtype.

int starpu_driver_deinit ( struct starpu_driver d)

Deinitialize the given driver. Returns 0 on success, -EINVAL if d->type is not a valid starpu_worker_archtype.

void starpu_drivers_request_termination ( void  )

Notify all running drivers they should terminate.

starpu-1.1.5/doc/doxygen/html/group__API__SC__Hypervisor.html0000644000373600000000000011772412571536763021156 00000000000000 StarPU Handbook: Scheduling Context Hypervisor - Building a new resizing policy
StarPU Handbook
Scheduling Context Hypervisor - Building a new resizing policy

Data Structures

struct  sc_hypervisor_policy
struct  sc_hypervisor_policy_config
struct  sc_hypervisor_wrapper
struct  sc_hypervisor_resize_ack
struct  sc_hypervisor_policy_task_pool

Functions

void sc_hypervisor_post_resize_request (unsigned sched_ctx, int task_tag)
unsigned sc_hypervisor_get_size_req (unsigned **sched_ctxs, int *nsched_ctxs, int **workers, int *nworkers)
void sc_hypervisor_save_size_req (unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
void sc_hypervisor_free_size_req (void)
unsigned sc_hypervisor_can_resize (unsigned sched_ctx)
struct
sc_hypervisor_policy_config
sc_hypervisor_get_config (unsigned sched_ctx)
void sc_hypervisor_set_config (unsigned sched_ctx, void *config)
unsigned * sc_hypervisor_get_sched_ctxs ()
int sc_hypervisor_get_nsched_ctxs ()
struct sc_hypervisor_wrappersc_hypervisor_get_wrapper (unsigned sched_ctx)
double sc_hypervisor_get_elapsed_flops_per_sched_ctx (struct sc_hypervisor_wrapper *sc_w)

Detailed Description


Data Structure Documentation

struct sc_hypervisor_policy

This structure contains all the methods that implement a hypervisor resizing policy.

Data Fields

const char * name
unsigned custom
void(* size_ctxs )(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
void(* resize_ctxs )(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers)
void(* handle_idle_cycle )(unsigned sched_ctx, int worker)
void(* handle_pushed_task )(unsigned sched_ctx, int worker)
void(* handle_poped_task )(unsigned sched_ctx, int worker, struct starpu_task *task, uint32_t footprint)
void(* handle_idle_end )(unsigned sched_ctx, int worker)
void(* handle_post_exec_hook )(unsigned sched_ctx, int task_tag)
void(* handle_submitted_job )(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size)
void(* end_ctx )(unsigned sched_ctx)

Field Documentation

sc_hypervisor_policy::name

Indicates the name of the policy, if there is not a custom policy, the policy corresponding to this name will be used by the hypervisor

sc_hypervisor_policy::custom

Indicates whether the policy is custom or not

sc_hypervisor_policy::size_ctxs

Distribute workers to contexts even at the beginning of the program

sc_hypervisor_policy::resize_ctxs

Require explicit resizing

sc_hypervisor_policy::handle_idle_cycle

It is called whenever the indicated worker executes another idle cycle in sched_ctx

sc_hypervisor_policy::handle_pushed_task

It is called whenever a task is pushed on the worker’s queue corresponding to the context sched_ctx

sc_hypervisor_policy::handle_poped_task

It is called whenever a task is poped from the worker’s queue corresponding to the context sched_ctx

The hypervisor takes a decision when another task was poped from this worker in this ctx

sc_hypervisor_policy::handle_idle_end

It is called whenever a task is executed on the indicated worker and context after a long period of idle time

sc_hypervisor_policy::handle_post_exec_hook

It is called whenever a tag task has just been executed. The table of resize requests is provided as well as the tag

sc_hypervisor_policy::handle_submitted_job

The hypervisor takes a decision when a job was submitted in this ctx

sc_hypervisor_policy::end_ctx

The hypervisor takes a decision when a certain ctx was deleted

struct sc_hypervisor_policy_config

This structure contains all configuration information of a context. It contains configuration information for each context, which can be used to construct new resize strategies.

Data Fields
int min_nworkers Indicates the minimum number of workers needed by the context
int max_nworkers Indicates the maximum number of workers needed by the context
int granularity Indicates the workers granularity of the context
int priority Indicates the priority of each worker in the context
double max_idle Indicates the maximum idle time accepted before a resize is triggered
double min_working Indicates that underneath this limit the priority of the worker is reduced
int fixed_workers Indicates which workers can be moved and which ones are fixed
double new_workers_max_idle Indicates the maximum idle time accepted before a resize is triggered for the workers that just arrived in the new context
double ispeed_w_sample Indicates the sample used to compute the instant speed per worker
double ispeed_ctx_sample Indicates the sample used to compute the instant speed per ctxs
double time_sample todo
struct sc_hypervisor_wrapper

This structure is a wrapper of the contexts available in StarPU and contains all information about a context obtained by incrementing the performance counters.

Data Fields
unsigned sched_ctx The context wrapped
struct
sc_hypervisor_policy_config *
config The corresponding resize configuration
double start_time_w
double current_idle_time The idle time counter of each worker of the context
double idle_time The time the workers were idle from the last resize
double idle_start_time The moment when the workers started being idle
double exec_time
double exec_start_time
int worker_to_be_removed The list of workers that will leave this contexts (lazy resizing process)
int pushed_tasks The number of pushed tasks of each worker of the context
int poped_tasks The number of poped tasks of each worker of the context
double total_flops The total number of flops to execute by the context
double total_elapsed_flops The number of flops executed by each workers of the context
double elapsed_flops The number of flops executed by each worker of the context from last resize
size_t elapsed_data The quantity of data (in bytes) used to execute tasks on each worker in this ctx
int elapsed_tasks The nr of tasks executed on each worker in this ctx
double ref_speed The average speed of the workers (type of workers) when they belonged to this context 0 - cuda 1 - cpu
double submitted_flops The number of flops submitted to this ctx
double remaining_flops The number of flops that still have to be executed by the workers in the context
double start_time The time when he started executed
double real_start_time The first time a task was pushed to this context
double hyp_react_start_time
struct sc_hypervisor_resize_ack resize_ack The structure confirming the last resize finished and a new one can be done
starpu_pthread_mutex_t mutex The mutex needed to synchronize the acknowledgment of the workers into the receiver context
unsigned total_flops_available A boolean indicating if the hypervisor can use the flops corresponding to the entire execution of the context
unsigned to_be_sized
unsigned compute_idle
struct sc_hypervisor_resize_ack

This structures checks if the workers moved to another context are actually taken into account in that context.

Data Fields
int receiver_sched_ctx The context receiving the new workers
int * moved_workers The workers moved to the receiver context
int nmoved_workers The number of workers moved
int * acked_workers If the value corresponding to a worker is 1, this one is taken into account in the new context if 0 not yet
struct sc_hypervisor_policy_task_pool

task wrapper linked list

Data Fields
struct starpu_codelet * cl Which codelet has been executed
uint32_t footprint Task footprint key
unsigned sched_ctx_id Context the task belongs to
unsigned long n Number of tasks of this kind
size_t data_size The quantity of data(in bytes) needed by the task to execute
struct
sc_hypervisor_policy_task_pool *
next Other task kinds

Function Documentation

void sc_hypervisor_post_resize_request ( unsigned  sched_ctx,
int  task_tag 
)

Requires resizing the context sched_ctx whenever a task tagged with the id task_tag finished executing

unsigned sc_hypervisor_get_size_req ( unsigned **  sched_ctxs,
int *  nsched_ctxs,
int **  workers,
int *  nworkers 
)

Check if there are pending demands of resizing

void sc_hypervisor_save_size_req ( unsigned *  sched_ctxs,
int  nsched_ctxs,
int *  workers,
int  nworkers 
)

Save a demand of resizing

void sc_hypervisor_free_size_req ( void  )

Clear the list of pending demands of resizing

unsigned sc_hypervisor_can_resize ( unsigned  sched_ctx)

Check out if a context can be resized

struct sc_hypervisor_policy_config * sc_hypervisor_get_config ( unsigned  sched_ctx)
read

Returns the configuration structure of a context

void sc_hypervisor_set_config ( unsigned  sched_ctx,
void *  config 
)

Set a certain configuration to a contexts

unsigned * sc_hypervisor_get_sched_ctxs ( )

Gets the contexts managed by the hypervisor

int sc_hypervisor_get_nsched_ctxs ( )

Gets the number of contexts managed by the hypervisor

struct sc_hypervisor_wrapper * sc_hypervisor_get_wrapper ( unsigned  sched_ctx)
read

Returns the wrapper corresponding the context sched_ctx

double sc_hypervisor_get_elapsed_flops_per_sched_ctx ( struct sc_hypervisor_wrapper sc_w)

Returns the flops of a context elapsed from the last resize

starpu-1.1.5/doc/doxygen/html/functions_vars_0x6c.html0000644000373600000000000001657312571536763017760 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/functions_0x65.html0000644000373600000000000002210212571536763016630 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- e -

starpu-1.1.5/doc/doxygen/html/SchedulingContextHypervisor.html0000644000373600000000000004342512571536762021575 00000000000000 StarPU Handbook: Scheduling Context Hypervisor
Scheduling Context Hypervisor

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 the user knows exactly how many workers each scheduling context needs, he 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 the 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.

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.

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.

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 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.

Resizing Strategies

The plugin proposes several strategies for resizing the scheduling context.

The Application driven strategy uses the user's input concerning the moment when he wants to resize the contexts. Thus, the users tags the task that should trigger the resizing process. We can set directly the field starpu_task::hypervisor_tag or use the macro ::STARPU_HYPERVISOR_TAG in the function starpu_insert_task().

task.hypervisor_tag = 2;

or

...,
STARPU_HYPERVISOR_TAG, 2,
0);

Then the user has to indicate that when a task with the specified tag is executed the contexts should resize.

sc_hypervisor_resize(sched_ctx, 2);

The user can use the same tag to change the resizing configuration of the contexts if he considers it necessary.

The Idleness based strategy moves workers unused in a certain context to another one needing them. (see Users’ Input In The Resizing Process)

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);

The Gflops rate based strategy resizes the scheduling contexts such that they all finish at the same time. The speed of each of them is computed and once one of them is significantly slower the resizing process is triggered. In order to do these computations the user has 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, (sc_hypervisor_register_ctx(sched_ctx_id, flops)) 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_insert_task() 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.

task.flops = 100;

or

...,
STARPU_FLOPS, (double) 100,
0);

The Feft strategy uses a linear program to predict the best distribution of resources such that the application finishes in a minimum amount of time. As for the Gflops rate strategy the programmers has to indicate the total number of flops to be executed when registering the context. This number of flops may be updated dynamically during the execution of the application whenever this information is not very accurate from the beginning. The function sc_hypervisor_update_diff_total_flop is called in order add or 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 the user as the hypervisor requires only the size of the frame in terms of flops.

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,
NULL);

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).

a new hypervisor policy

While Scheduling Context Hypervisor Plugin comes with a variety of resizing policies (see Resizing Strategies), 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

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"
};
starpu-1.1.5/doc/doxygen/html/starpu__expert_8h.html0000644000373600000000000001506512571536757017516 00000000000000 StarPU Handbook: starpu_expert.h File Reference
starpu_expert.h File Reference
#include <starpu.h>

Go to the source code of this file.

Functions

void starpu_wake_all_blocked_workers (void)
int starpu_progression_hook_register (unsigned(*func)(void *arg), void *arg)
void starpu_progression_hook_deregister (int hook_id)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__fxt_8h_source.html0000644000373600000000000004432512571536757020371 00000000000000 StarPU Handbook: starpu_fxt.h Source File
starpu_fxt.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2011, 2013 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_FXT_H__
19 #define __STARPU_FXT_H__
20 
21 #include <starpu_perfmodel.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
28 #define STARPU_FXT_MAX_FILES 64
29 
31 {
32  char symbol[256];
33  int workerid;
34  enum starpu_perfmodel_archtype archtype;
35  uint32_t hash;
36  size_t size;
37  float time;
38 };
39 
41 {
42  unsigned per_task_colour;
43  unsigned no_counter;
44  unsigned no_bus;
45  unsigned ninputfiles;
46  char *filenames[STARPU_FXT_MAX_FILES];
47  char *out_paje_path;
48  char *distrib_time_path;
49  char *activity_path;
50  char *dag_path;
51 
52  char *file_prefix;
53  uint64_t file_offset;
54  int file_rank;
55 
58  int nworkers;
59 
62 };
63 
64 void starpu_fxt_options_init(struct starpu_fxt_options *options);
65 void starpu_fxt_generate_trace(struct starpu_fxt_options *options);
67 void starpu_fxt_stop_profiling(void);
68 
69 #ifdef __cplusplus
70 }
71 #endif
72 
73 #endif /* __STARPU_FXT_H__ */
starpu-1.1.5/doc/doxygen/html/starpu__data__interfaces_8h.html0000644000373600000000000016745212571536757021472 00000000000000 StarPU Handbook: starpu_data_interfaces.h File Reference
starpu_data_interfaces.h File Reference
#include <starpu.h>
#include <cuda_runtime.h>

Go to the source code of this file.

Data Structures

struct  starpu_data_copy_methods
struct  starpu_data_interface_ops
struct  starpu_matrix_interface
struct  starpu_coo_interface
struct  starpu_block_interface
struct  starpu_vector_interface
struct  starpu_variable_interface
struct  starpu_csr_interface
struct  starpu_bcsr_interface
struct  starpu_multiformat_data_interface_ops
struct  starpu_multiformat_interface

Macros

#define STARPU_MULTIFORMAT_GET_CPU_PTR(interface)
#define STARPU_MULTIFORMAT_GET_CUDA_PTR(interface)
#define STARPU_MULTIFORMAT_GET_OPENCL_PTR(interface)
#define STARPU_MULTIFORMAT_GET_NX(interface)
Accessing COO Data Interfaces
#define STARPU_COO_GET_COLUMNS(interface)
#define STARPU_COO_GET_COLUMNS_DEV_HANDLE(interface)
#define STARPU_COO_GET_ROWS(interface)
#define STARPU_COO_GET_ROWS_DEV_HANDLE(interface)
#define STARPU_COO_GET_VALUES(interface)
#define STARPU_COO_GET_VALUES_DEV_HANDLE(interface)
#define STARPU_COO_GET_OFFSET
#define STARPU_COO_GET_NX(interface)
#define STARPU_COO_GET_NY(interface)
#define STARPU_COO_GET_NVALUES(interface)
#define STARPU_COO_GET_ELEMSIZE(interface)

Typedefs

typedef cudaStream_t starpu_cudaStream_t

Enumerations

enum  starpu_data_interface_id {
  STARPU_UNKNOWN_INTERFACE_ID, STARPU_MATRIX_INTERFACE_ID, STARPU_BLOCK_INTERFACE_ID, STARPU_VECTOR_INTERFACE_ID,
  STARPU_CSR_INTERFACE_ID, STARPU_BCSR_INTERFACE_ID, STARPU_VARIABLE_INTERFACE_ID, STARPU_VOID_INTERFACE_ID,
  STARPU_MULTIFORMAT_INTERFACE_ID, STARPU_COO_INTERFACE_ID, STARPU_MAX_INTERFACE_ID
}

Functions

void starpu_multiformat_data_register (starpu_data_handle_t *handle, unsigned home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops)
Defining Interface

Applications can provide their own interface as shown in Defining A New Data Interface.

int starpu_interface_copy (uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, void *async_data)
uintptr_t starpu_malloc_on_node (unsigned dst_node, size_t size)
void starpu_free_on_node (unsigned dst_node, uintptr_t addr, size_t size)
int starpu_data_interface_get_next_id (void)
Basic Data Management API

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 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).

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)
void starpu_data_register_same (starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc)
starpu_data_handle_t starpu_data_lookup (const void *ptr)
Accessing Data Interfaces

Each data interface is provided with a set of field access functions. The ones using a void * parameter aimed to be used in codelet implementations (see for example the code in Vector Scaling Using StarPU's API).

void * starpu_data_handle_to_pointer (starpu_data_handle_t handle, unsigned node)
void * starpu_data_get_local_ptr (starpu_data_handle_t handle)
enum starpu_data_interface_id starpu_data_get_interface_id (starpu_data_handle_t handle)
int starpu_data_pack (starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count)
int starpu_data_unpack (starpu_data_handle_t handle, void *ptr, size_t count)
size_t starpu_data_get_size (starpu_data_handle_t handle)
Registering Data

There are several ways to register a memory region so that it can be managed by StarPU. The functions below allow the registration of vectors, 2D matrices, 3D matrices as well as BCSR and CSR sparse matrices.

void * starpu_data_get_interface_on_node (starpu_data_handle_t handle, unsigned memory_node)
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)
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)
void starpu_coo_data_register (starpu_data_handle_t *handleptr, unsigned home_node, uint32_t nx, uint32_t ny, uint32_t n_values, uint32_t *columns, uint32_t *rows, uintptr_t values, size_t elemsize)
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)
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)
void starpu_vector_data_register (starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, uint32_t nx, size_t elemsize)
void starpu_vector_ptr_register (starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset)
void starpu_variable_data_register (starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, size_t size)
void starpu_void_data_register (starpu_data_handle_t *handle)
void starpu_csr_data_register (starpu_data_handle_t *handle, unsigned home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, size_t elemsize)
void starpu_bcsr_data_register (starpu_data_handle_t *handle, unsigned 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)

Variables

struct starpu_data_interface_ops starpu_interface_matrix_ops

Accessing Variable Data Interfaces

#define STARPU_VARIABLE_GET_PTR(interface)
#define STARPU_VARIABLE_GET_ELEMSIZE(interface)
#define STARPU_VARIABLE_GET_DEV_HANDLE(interface)
#define STARPU_VARIABLE_GET_OFFSET
size_t starpu_variable_get_elemsize (starpu_data_handle_t handle)
uintptr_t starpu_variable_get_local_ptr (starpu_data_handle_t handle)

Accessing Vector Data Interfaces

#define STARPU_VECTOR_GET_PTR(interface)
#define STARPU_VECTOR_GET_DEV_HANDLE(interface)
#define STARPU_VECTOR_GET_OFFSET(interface)
#define STARPU_VECTOR_GET_NX(interface)
#define STARPU_VECTOR_GET_ELEMSIZE(interface)
uint32_t starpu_vector_get_nx (starpu_data_handle_t handle)
size_t starpu_vector_get_elemsize (starpu_data_handle_t handle)
uintptr_t starpu_vector_get_local_ptr (starpu_data_handle_t handle)

Accessing Matrix Data Interfaces

#define STARPU_MATRIX_GET_PTR(interface)
#define STARPU_MATRIX_GET_DEV_HANDLE(interface)
#define STARPU_MATRIX_GET_OFFSET(interface)
#define STARPU_MATRIX_GET_NX(interface)
#define STARPU_MATRIX_GET_NY(interface)
#define STARPU_MATRIX_GET_LD(interface)
#define STARPU_MATRIX_GET_ELEMSIZE(interface)
uint32_t starpu_matrix_get_nx (starpu_data_handle_t handle)
uint32_t starpu_matrix_get_ny (starpu_data_handle_t handle)
uint32_t starpu_matrix_get_local_ld (starpu_data_handle_t handle)
uintptr_t starpu_matrix_get_local_ptr (starpu_data_handle_t handle)
size_t starpu_matrix_get_elemsize (starpu_data_handle_t handle)

Accessing Block Data Interfaces

#define STARPU_BLOCK_GET_PTR(interface)
#define STARPU_BLOCK_GET_DEV_HANDLE(interface)
#define STARPU_BLOCK_GET_OFFSET(interface)
#define STARPU_BLOCK_GET_NX(interface)
#define STARPU_BLOCK_GET_NY(interface)
#define STARPU_BLOCK_GET_NZ(interface)
#define STARPU_BLOCK_GET_LDY(interface)
#define STARPU_BLOCK_GET_LDZ(interface)
#define STARPU_BLOCK_GET_ELEMSIZE(interface)
uint32_t starpu_block_get_nx (starpu_data_handle_t handle)
uint32_t starpu_block_get_ny (starpu_data_handle_t handle)
uint32_t starpu_block_get_nz (starpu_data_handle_t handle)
uint32_t starpu_block_get_local_ldy (starpu_data_handle_t handle)
uint32_t starpu_block_get_local_ldz (starpu_data_handle_t handle)
uintptr_t starpu_block_get_local_ptr (starpu_data_handle_t handle)
size_t starpu_block_get_elemsize (starpu_data_handle_t handle)

Accessing BCSR Data Interfaces

#define STARPU_BCSR_GET_NNZ(interface)
#define STARPU_BCSR_GET_NZVAL(interface)
#define STARPU_BCSR_GET_NZVAL_DEV_HANDLE(interface)
#define STARPU_BCSR_GET_COLIND(interface)
#define STARPU_BCSR_GET_COLIND_DEV_HANDLE(interface)
#define STARPU_BCSR_GET_ROWPTR(interface)
#define STARPU_BCSR_GET_ROWPTR_DEV_HANDLE(interface)
#define STARPU_BCSR_GET_OFFSET
uint32_t starpu_bcsr_get_nnz (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_nrow (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_firstentry (starpu_data_handle_t handle)
uintptr_t starpu_bcsr_get_local_nzval (starpu_data_handle_t handle)
uint32_t * starpu_bcsr_get_local_colind (starpu_data_handle_t handle)
uint32_t * starpu_bcsr_get_local_rowptr (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_r (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_c (starpu_data_handle_t handle)
size_t starpu_bcsr_get_elemsize (starpu_data_handle_t handle)

Accessing CSR Data Interfaces

#define STARPU_CSR_GET_NNZ(interface)
#define STARPU_CSR_GET_NROW(interface)
#define STARPU_CSR_GET_NZVAL(interface)
#define STARPU_CSR_GET_NZVAL_DEV_HANDLE(interface)
#define STARPU_CSR_GET_COLIND(interface)
#define STARPU_CSR_GET_COLIND_DEV_HANDLE(interface)
#define STARPU_CSR_GET_ROWPTR(interface)
#define STARPU_CSR_GET_ROWPTR_DEV_HANDLE(interface)
#define STARPU_CSR_GET_OFFSET
#define STARPU_CSR_GET_FIRSTENTRY(interface)
#define STARPU_CSR_GET_ELEMSIZE(interface)
uint32_t starpu_csr_get_nnz (starpu_data_handle_t handle)
uint32_t starpu_csr_get_nrow (starpu_data_handle_t handle)
uint32_t starpu_csr_get_firstentry (starpu_data_handle_t handle)
uintptr_t starpu_csr_get_local_nzval (starpu_data_handle_t handle)
uint32_t * starpu_csr_get_local_colind (starpu_data_handle_t handle)
uint32_t * starpu_csr_get_local_rowptr (starpu_data_handle_t handle)
size_t starpu_csr_get_elemsize (starpu_data_handle_t handle)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__mpi_8h_source.html0000644000373600000000000007014012571536757020347 00000000000000 StarPU Handbook: starpu_mpi.h Source File
starpu_mpi.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009-2012 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_MPI_H__
19 #define __STARPU_MPI_H__
20 
21 #include <starpu.h>
22 
23 #if defined(STARPU_USE_MPI)
24 
25 #include <mpi.h>
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 typedef void *starpu_mpi_req;
32 
33 int starpu_mpi_isend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm);
34 int starpu_mpi_irecv(starpu_data_handle_t data_handle, starpu_mpi_req *req, int source, int mpi_tag, MPI_Comm comm);
35 int starpu_mpi_send(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm);
36 int starpu_mpi_recv(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, MPI_Status *status);
37 int starpu_mpi_isend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg);
38 int starpu_mpi_irecv_detached(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg);
39 int starpu_mpi_issend(starpu_data_handle_t data_handle, starpu_mpi_req *req, int dest, int mpi_tag, MPI_Comm comm);
40 int starpu_mpi_issend_detached(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, void (*callback)(void *), void *arg);
41 int starpu_mpi_wait(starpu_mpi_req *req, MPI_Status *status);
42 int starpu_mpi_test(starpu_mpi_req *req, int *flag, MPI_Status *status);
43 int starpu_mpi_barrier(MPI_Comm comm);
44 
45 int starpu_mpi_init(int *argc, char ***argv, int initialize_mpi);
46 int starpu_mpi_initialize(void) STARPU_DEPRECATED;
47 int starpu_mpi_initialize_extended(int *rank, int *world_size) STARPU_DEPRECATED;
48 int starpu_mpi_shutdown(void);
49 
50 int starpu_mpi_insert_task(MPI_Comm comm, struct starpu_codelet *codelet, ...);
51 void starpu_mpi_get_data_on_node(MPI_Comm comm, starpu_data_handle_t data_handle, int node);
52 void starpu_mpi_get_data_on_node_detached(MPI_Comm comm, starpu_data_handle_t data_handle, int node, void (*callback)(void*), void *arg);
53 void starpu_mpi_redux_data(MPI_Comm comm, starpu_data_handle_t data_handle);
54 
55 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);
56 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);
57 
58 int starpu_mpi_isend_detached_unlock_tag(starpu_data_handle_t data_handle, int dest, int mpi_tag, MPI_Comm comm, starpu_tag_t tag);
59 int starpu_mpi_irecv_detached_unlock_tag(starpu_data_handle_t data_handle, int source, int mpi_tag, MPI_Comm comm, starpu_tag_t tag);
60 
61 int starpu_mpi_isend_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *dest, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag);
62 int starpu_mpi_irecv_array_detached_unlock_tag(unsigned array_size, starpu_data_handle_t *data_handle, int *source, int *mpi_tag, MPI_Comm *comm, starpu_tag_t tag);
63 
64 void starpu_mpi_comm_amounts_retrieve(size_t *comm_amounts);
65 
66 void starpu_mpi_cache_flush(MPI_Comm comm, starpu_data_handle_t data_handle);
67 void starpu_mpi_cache_flush_all_data(MPI_Comm comm);
68 
69 void starpu_mpi_data_register_comm(starpu_data_handle_t data_handle,int tag, int rank, MPI_Comm comm);
70 #define starpu_mpi_data_register(data_handle, tag, rank) starpu_mpi_data_register_comm(data_handle, tag, rank, MPI_COMM_WORLD)
71 
73 int starpu_mpi_cache_set(int enabled);
74 
75 int starpu_mpi_data_set_rank_comm(starpu_data_handle_t handle, int rank, MPI_Comm comm);
76 #define starpu_mpi_data_set_rank(handle, rank) starpu_mpi_data_set_rank_comm(handle, rank, MPI_COMM_WORLD)
77 int starpu_mpi_data_set_tag(starpu_data_handle_t handle, int tag);
78 #define starpu_data_set_rank starpu_mpi_data_set_rank
79 #define starpu_data_set_tag starpu_mpi_data_set_tag
80 
83 #define starpu_data_get_rank starpu_mpi_data_get_rank
84 #define starpu_data_get_tag starpu_mpi_data_get_tag
85 
86 #ifdef __cplusplus
87 }
88 #endif
89 
90 #endif // STARPU_USE_MPI
91 #endif // __STARPU_MPI_H__
starpu-1.1.5/doc/doxygen/html/functions_vars_0x68.html0000644000373600000000000002116512571536763017676 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- h -

starpu-1.1.5/doc/doxygen/html/starpu__task__util_8h.html0000644000373600000000000003156212571536757020345 00000000000000 StarPU Handbook: starpu_task_util.h File Reference
starpu_task_util.h File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <starpu.h>

Go to the source code of this file.

Macros

#define STARPU_MODE_SHIFT
#define STARPU_VALUE
#define STARPU_CALLBACK
#define STARPU_CALLBACK_WITH_ARG
#define STARPU_CALLBACK_ARG
#define STARPU_PRIORITY
#define STARPU_DATA_ARRAY
#define STARPU_TAG
#define STARPU_HYPERVISOR_TAG
#define STARPU_FLOPS
#define STARPU_SCHED_CTX
#define STARPU_PROLOGUE_CALLBACK
#define STARPU_PROLOGUE_CALLBACK_ARG
#define STARPU_EXECUTE_ON_WORKER
#define STARPU_SHIFTED_MODE_MAX
MPI Insert Task

#define STARPU_EXECUTE_ON_NODE
#define STARPU_EXECUTE_ON_DATA

Functions

void starpu_create_sync_task (starpu_tag_t sync_tag, unsigned ndeps, starpu_tag_t *deps, void(*callback)(void *), void *callback_arg)
struct starpu_taskstarpu_task_build (struct starpu_codelet *cl,...)
int starpu_insert_task (struct starpu_codelet *cl,...)
void starpu_codelet_unpack_args (void *cl_arg,...)
void starpu_codelet_pack_args (void **arg_buffer, size_t *arg_buffer_size,...)

Detailed Description

starpu-1.1.5/doc/doxygen/html/cExtensions.html0000644000373600000000000010075312571536762016350 00000000000000 StarPU Handbook: C Extensions
C Extensions

When GCC plug-in support is available, StarPU builds a plug-in for the GNU Compiler Collection (GCC), which defines extensions to languages of the C family (C, C++, Objective-C) that make it easier to write StarPU code. This feature is only available for GCC 4.5 and later; it is known to work with GCC 4.5, 4.6, and 4.7. You may need to install a specific -dev package of your distro, such as gcc-4.6-plugin-dev on Debian and derivatives. In addition, the plug-in's test suite is only run when GNU Guile is found at configure-time. Building the GCC plug-in can be disabled by configuring with --disable-gcc-extensions.

Those extensions include syntactic sugar for defining tasks and their implementations, invoking a task, and manipulating data buffers. Use of these extensions can be made conditional on the availability of the plug-in, leading to valid C sequential code when the plug-in is not used (Using C Extensions Conditionally).

When StarPU has been installed with its GCC plug-in, programs that use these extensions can be compiled this way:

$ gcc -c -fplugin=`pkg-config starpu-1.1 --variable=gccplugin` foo.c

When the plug-in is not available, the above pkg-config command returns the empty string.

In addition, the -fplugin-arg-starpu-verbose flag can be used to obtain feedback from the compiler as it analyzes the C extensions used in source files.

This section describes the C extensions implemented by StarPU's GCC plug-in. It does not require detailed knowledge of the StarPU library.

Note: this is still an area under development and subject to change.

Defining Tasks

The StarPU GCC plug-in views tasks as ``extended'' C functions:

  • tasks may have several implementations—e.g., one for CPUs, one written in OpenCL, one written in CUDA;
  • tasks may have several implementations of the same target—e.g., several CPU implementations;
  • when a task is invoked, it may run in parallel, and StarPU is free to choose any of its implementations.

Tasks and their implementations must be declared. These declarations are annotated with attributes (http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax): the declaration of a task is a regular C function declaration with an additional task attribute, and task implementations are declared with a task_implementation attribute.

The following function attributes are provided:

task

Declare the given function as a StarPU task. Its return type must be void. When a function declared as task has a user-defined body, that body is interpreted as the implicit definition of the task's CPU implementation (see example below). In all cases, the actual definition of a task's body is automatically generated by the compiler.

Under the hood, declaring a task leads to the declaration of the corresponding codelet (Codelet and Tasks). If one or more task implementations are declared in the same compilation unit, then the codelet and the function itself are also defined; they inherit the scope of the task.

Scalar arguments to the task are passed by value and copied to the target device if need be—technically, they are passed as the buffer starpu_task::cl_arg (Codelet and Tasks).

Pointer arguments are assumed to be registered data buffers—the handles argument of a task (starpu_task::handles) ; const-qualified pointer arguments are viewed as read-only buffers (STARPU_R), and non-const-qualified buffers are assumed to be used read-write (STARPU_RW). In addition, the output type attribute can be as a type qualifier for output pointer or array parameters (STARPU_W).

task_implementation (target, task)

Declare the given function as an implementation of task to run on target. target must be a string, currently one of "cpu", "opencl", or "cuda".

Here is an example:

#define __output __attribute__ ((output))
static void matmul (const float *A, const float *B,
__output float *C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task));
static void matmul_cpu (const float *A, const float *B,
__output float *C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task_implementation ("cpu", matmul)));
static void
matmul_cpu (const float *A, const float *B, __output float *C,
unsigned nx, unsigned ny, unsigned nz)
{
unsigned i, j, k;
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
{
for (k = 0; k < nz; k++)
C[j * nx + i] += A[j * nz + k] * B[k * nx + i];
}
}

A matmult task is defined; it has only one implementation, matmult_cpu, which runs on the CPU. Variables A and B are input buffers, whereas C is considered an input/output buffer.

For convenience, when a function declared with the task attribute has a user-defined body, that body is assumed to be that of the CPU implementation of a task, which we call an implicit task CPU implementation. Thus, the above snippet can be simplified like this:

#define __output __attribute__ ((output))
static void matmul (const float *A, const float *B,
__output float *C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task));
/* Implicit definition of the CPU implementation of the
`matmul' task. */
static void
matmul (const float *A, const float *B, __output float *C,
unsigned nx, unsigned ny, unsigned nz)
{
unsigned i, j, k;
for (j = 0; j < ny; j++)
for (i = 0; i < nx; i++)
{
for (k = 0; k < nz; k++)
C[j * nx + i] += A[j * nz + k] * B[k * nx + i];
}
}

Use of implicit CPU task implementations as above has the advantage that the code is valid sequential code when StarPU's GCC plug-in is not used (Using C Extensions Conditionally).

CUDA and OpenCL implementations can be declared in a similar way:

static void matmul_cuda (const float *A, const float *B, float *C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task_implementation ("cuda", matmul)));
static void matmul_opencl (const float *A, const float *B, float *C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task_implementation ("opencl", matmul)));

The CUDA and OpenCL implementations typically either invoke a kernel written in CUDA or OpenCL (for similar code, CUDA Kernel, and OpenCL Kernel), or call a library function that uses CUDA or OpenCL under the hood, such as CUBLAS functions:

static void
matmul_cuda (const float *A, const float *B, float *C,
unsigned nx, unsigned ny, unsigned nz)
{
cublasSgemm ('n', 'n', nx, ny, nz,
1.0f, A, 0, B, 0,
0.0f, C, 0);
cudaStreamSynchronize (starpu_cuda_get_local_stream ());
}

A task can be invoked like a regular C function:

matmul (&A[i * zdim * bydim + k * bzdim * bydim],
&B[k * xdim * bzdim + j * bxdim * bzdim],
&C[i * xdim * bydim + j * bxdim * bydim],
bxdim, bydim, bzdim);

This leads to an asynchronous invocation, whereby matmult's implementation may run in parallel with the continuation of the caller.

The next section describes how memory buffers must be handled in StarPU-GCC code. For a complete example, see the gcc-plugin/examples directory of the source distribution, and Vector Scaling Using the C Extension.

Initialization, Termination, and Synchronization

The following pragmas allow user code to control StarPU's life time and to synchronize with tasks.

#pragma starpu initialize

Initialize StarPU. This call is compulsory and is never added implicitly. One of the reasons this has to be done explicitly is that it provides greater control to user code over its resource usage.

#pragma starpu shutdown

Shut down StarPU, giving it an opportunity to write profiling info to a file on disk, for instance (Off-line Performance Feedback).

#pragma starpu wait
Wait for all task invocations to complete, as with starpu_task_wait_for_all().

Registered Data Buffers

Data buffers such as matrices and vectors that are to be passed to tasks must be registered. Registration allows StarPU to handle data transfers among devices—e.g., transferring an input buffer from the CPU's main memory to a task scheduled to run a GPU (StarPU Data Management Library).

The following pragmas are provided:

#pragma starpu register ptr [size]

Register ptr as a size-element buffer. When ptr has an array type whose size is known, size may be omitted. Alternatively, the registered attribute can be used (see below.)

#pragma starpu unregister ptr

Unregister the previously-registered memory area pointed to by ptr. As a side-effect, ptr points to a valid copy in main memory.

#pragma starpu acquire ptr

Acquire in main memory an up-to-date copy of the previously-registered memory area pointed to by ptr, for read-write access.

#pragma starpu release ptr
Release the previously-register memory area pointed to by ptr, making it available to the tasks.

Additionally, the following attributes offer a simple way to allocate and register storage for arrays:

registered

This attributes applies to local variables with an array type. Its effect is to automatically register the array's storage, as per #pragma starpu register. The array is automatically unregistered when the variable's scope is left. This attribute is typically used in conjunction with the heap_allocated attribute, described below.

heap_allocated
This attributes applies to local variables with an array type. Its effect is to automatically allocate the array's storage on the heap, using starpu_malloc() under the hood. The heap-allocated array is automatically freed when the variable's scope is left, as with automatic variables.

The following example illustrates use of the heap_allocated attribute:

extern void cholesky(unsigned nblocks, unsigned size,
float mat[nblocks][nblocks][size])
__attribute__ ((task));
int
main (int argc, char *argv[])
{
#pragma starpu initialize
/* ... */
int nblocks, size;
parse_args (&nblocks, &size);
/* Allocate an array of the required size on the heap,
and register it. */
{
float matrix[nblocks][nblocks][size]
__attribute__ ((heap_allocated, registered));
cholesky (nblocks, size, matrix);
#pragma starpu wait
} /* MATRIX is automatically unregistered & freed here. */
#pragma starpu shutdown
return EXIT_SUCCESS;
}

Using C Extensions Conditionally

The C extensions described in this chapter are only available when GCC and its StarPU plug-in are in use. Yet, it is possible to make use of these extensions when they are available—leading to hybrid CPU/GPU code—and discard them when they are not available—leading to valid sequential code.

To that end, the GCC plug-in defines the C preprocessor macro — STARPU_GCC_PLUGIN — when it is being used. When defined, this macro expands to an integer denoting the version of the supported C extensions.

The code below illustrates how to define a task and its implementations in a way that allows it to be compiled without the GCC plug-in:

/* This program is valid, whether or not StarPU's GCC plug-in
is being used. */
#include <stdlib.h>
/* The attribute below is ignored when GCC is not used. */
static void matmul (const float *A, const float *B, float * C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task));
static void
matmul (const float *A, const float *B, float * C,
unsigned nx, unsigned ny, unsigned nz)
{
/* Code of the CPU kernel here... */
}
#ifdef STARPU_GCC_PLUGIN
/* Optional OpenCL task implementation. */
static void matmul_opencl (const float *A, const float *B, float * C,
unsigned nx, unsigned ny, unsigned nz)
__attribute__ ((task_implementation ("opencl", matmul)));
static void
matmul_opencl (const float *A, const float *B, float * C,
unsigned nx, unsigned ny, unsigned nz)
{
/* Code that invokes the OpenCL kernel here... */
}
#endif
int
main (int argc, char *argv[])
{
/* The pragmas below are simply ignored when StarPU-GCC
is not used. */
#pragma starpu initialize
float A[123][42][7], B[123][42][7], C[123][42][7];
#pragma starpu register A
#pragma starpu register B
#pragma starpu register C
/* When StarPU-GCC is used, the call below is asynchronous;
otherwise, it is synchronous. */
matmul ((float *) A, (float *) B, (float *) C, 123, 42, 7);
#pragma starpu wait
#pragma starpu shutdown
return EXIT_SUCCESS;
}

The above program is a valid StarPU program when StarPU's GCC plug-in is used; it is also a valid sequential program when the plug-in is not used.

Note that attributes such as task as well as starpu pragmas are simply ignored by GCC when the StarPU plug-in is not loaded. However, gcc -Wall emits a warning for unknown attributes and pragmas, which can be inconvenient. In addition, other compilers may be unable to parse the attribute syntax (In practice, Clang and several proprietary compilers implement attributes.), so you may want to wrap attributes in macros like this:

/* Use the `task' attribute only when StarPU's GCC plug-in
is available. */
#ifdef STARPU_GCC_PLUGIN
# define __task __attribute__ ((task))
#else
# define __task
#endif
static void matmul (const float *A, const float *B, float *C,
unsigned nx, unsigned ny, unsigned nz) __task;
starpu-1.1.5/doc/doxygen/html/starpu_non_linear_memset_regression_based_2.png0000644000373600000000000001757512571536762024612 00000000000000PNG  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.1.5/doc/doxygen/html/functions_vars_0x62.html0000644000373600000000000001724112571536763017670 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- b -

starpu-1.1.5/doc/doxygen/html/starpu_chol_model_11_type.png0000644000373600000000000001335712571536761020735 00000000000000PNG  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.1.5/doc/doxygen/html/starpu__data__filters_8h_source.html0000644000373600000000000006772012571536757022374 00000000000000 StarPU Handbook: starpu_data_filters.h Source File
starpu_data_filters.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2012 Université de Bordeaux
4  * Copyright (C) 2010 Mehdi Juhoor <mjuhoor@gmail.com>
5  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_DATA_FILTERS_H__
20 #define __STARPU_DATA_FILTERS_H__
21 
22 #include <starpu.h>
23 #include <stdarg.h>
24 
25 #ifdef __cplusplus
26 extern "C"
27 {
28 #endif
29 
31 
33 {
34  void (*filter_func)(void *father_interface, void *child_interface, struct starpu_data_filter *, unsigned id, unsigned nparts);
35  unsigned nchildren;
36  unsigned (*get_nchildren)(struct starpu_data_filter *, starpu_data_handle_t initial_handle);
37  struct starpu_data_interface_ops *(*get_child_ops)(struct starpu_data_filter *, unsigned id);
38  unsigned filter_arg;
40 };
41 
42 void starpu_data_partition(starpu_data_handle_t initial_handle, struct starpu_data_filter *f);
43 void starpu_data_unpartition(starpu_data_handle_t root_data, unsigned gathering_node);
44 
47 
49 starpu_data_handle_t starpu_data_vget_sub_data(starpu_data_handle_t root_data, unsigned depth, va_list pa);
50 
51 void starpu_data_map_filters(starpu_data_handle_t root_data, unsigned nfilters, ...);
52 void starpu_data_vmap_filters(starpu_data_handle_t root_data, unsigned nfilters, va_list pa);
53 
54 void starpu_bcsr_filter_canonical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
55 void starpu_csr_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
56 
57 void starpu_matrix_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
58 void starpu_matrix_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
59 void starpu_matrix_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
60 void starpu_matrix_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
61 
62 void starpu_vector_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
63 void starpu_vector_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
64 void starpu_vector_filter_list(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
65 void starpu_vector_filter_divide_in_2(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
66 
67 void starpu_block_filter_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
68 void starpu_block_filter_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
69 void starpu_block_filter_vertical_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
70 void starpu_block_filter_vertical_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
71 void starpu_block_filter_depth_block(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
72 void starpu_block_filter_depth_block_shadow(void *father_interface, void *child_interface, struct starpu_data_filter *f, unsigned id, unsigned nparts);
73 
74 #ifdef __cplusplus
75 }
76 #endif
77 
78 #endif
starpu-1.1.5/doc/doxygen/html/starpu__cuda_8h_source.html0000644000373600000000000003540512571536757020503 00000000000000 StarPU Handbook: starpu_cuda.h Source File
starpu_cuda.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2012, 2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_CUDA_H__
19 #define __STARPU_CUDA_H__
20 
21 #include <starpu_config.h>
22 
23 #if defined STARPU_USE_CUDA && !defined STARPU_DONT_INCLUDE_CUDA_HEADERS
24 #include <cuda.h>
25 #include <cuda_runtime.h>
26 #include <cuda_runtime_api.h>
27 
28 #ifdef __cplusplus
29 extern "C"
30 {
31 #endif
32 
33 void starpu_cublas_report_error(const char *func, const char *file, int line, int status);
34 #define STARPU_CUBLAS_REPORT_ERROR(status) \
35  starpu_cublas_report_error(__starpu_func__, __FILE__, __LINE__, status)
36 
37 void starpu_cuda_report_error(const char *func, const char *file, int line, cudaError_t status);
38 #define STARPU_CUDA_REPORT_ERROR(status) \
39  starpu_cuda_report_error(__starpu_func__, __FILE__, __LINE__, status)
40 
41 cudaStream_t starpu_cuda_get_local_stream(void);
42 
43 const struct cudaDeviceProp *starpu_cuda_get_device_properties(unsigned workerid);
44 
45 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);
46 
47 void starpu_cuda_set_device(unsigned devid);
48 
49 #ifdef __cplusplus
50 }
51 #endif
52 
53 #endif /* STARPU_USE_CUDA && !STARPU_DONT_INCLUDE_CUDA_HEADERS */
54 #endif /* __STARPU_CUDA_H__ */
55 
starpu-1.1.5/doc/doxygen/html/functions_0x6d.html0000644000373600000000000002222212571536763016712 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- m -

starpu-1.1.5/doc/doxygen/html/functions_0x69.html0000644000373600000000000002261712571536763016647 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- i -

starpu-1.1.5/doc/doxygen/html/functions_vars_0x64.html0000644000373600000000000002367412571536763017701 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- d -

starpu-1.1.5/doc/doxygen/html/globals_defs.html0000644000373600000000000007501212571536763016472 00000000000000 StarPU Handbook: Globals
StarPU Handbook
 

- s -

starpu-1.1.5/doc/doxygen/html/functions_0x62.html0000644000373600000000000001727512571536763016644 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- b -

starpu-1.1.5/doc/doxygen/html/starpu__config_8h_source.html0000644000373600000000000006206512571536757021036 00000000000000 StarPU Handbook: starpu_config.h Source File
StarPU Handbook
starpu_config.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009-2015 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 /*
19  * This is the public config.h file, installed along libstarpu.
20  *
21  * It should only contain the build-time #defines which have an effect on the
22  * API & ABI.
23  */
24 
25 #ifndef __STARPU_CONFIG_PUBLIC_H__
26 #define __STARPU_CONFIG_PUBLIC_H__
27 
28 #define STARPU_MAJOR_VERSION 1
29 #define STARPU_MINOR_VERSION 1
30 #define STARPU_RELEASE_VERSION 1
31 
32 #define STARPU_USE_CPU 1
33 #define STARPU_USE_CUDA 1
34 #define STARPU_USE_OPENCL 1
35 
36 #define STARPU_SIMGRID 1
37 #define STARPU_HAVE_SIMGRID_MSG_H 1
38 
39 #define STARPU_HAVE_ICC 1
40 
41 #define STARPU_USE_MPI 1
42 
43 #define STARPU_ATLAS 1
44 #define STARPU_GOTO 1
45 #define STARPU_MKL 1
46 #define STARPU_SYSTEM_BLAS 1
47 
48 #define STARPU_BUILD_DIR 1
49 #define STARPU_OPENCL_DATADIR 1
50 #define STARPU_HAVE_MAGMA 1
51 
52 #define STARPU_OPENGL_RENDER 1
53 #define STARPU_USE_GTK 1
54 #define STARPU_HAVE_X11 1
55 
56 #define STARPU_HAVE_POSIX_MEMALIGN 1
57 
58 #define STARPU_HAVE_MEMALIGN 1
59 
60 #define STARPU_HAVE_MALLOC_H 1
61 
62 #define STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP 1
63 #define STARPU_HAVE_SYNC_FETCH_AND_ADD 1
64 #define STARPU_HAVE_SYNC_FETCH_AND_OR 1
65 #define STARPU_HAVE_SYNC_LOCK_TEST_AND_SET 1
66 #define STARPU_HAVE_SYNC_SYNCHRONIZE 1
67 
68 #define STARPU_MODEL_DEBUG 1
69 #define STARPU_NO_ASSERT 1
70 
71 #define STARPU_HAVE_FFTW 1
72 #define STARPU_HAVE_FFTWF 1
73 #define STARPU_HAVE_FFTWL 1
74 
75 #define STARPU_HAVE_CURAND 1
76 
77 #define STARPU_MAXNODES 1
78 #define STARPU_NMAXBUFS 1
79 #define STARPU_MAXCPUS 1
80 #define STARPU_MAXCUDADEVS 1
81 #define STARPU_MAXOPENCLDEVS 1
82 #define STARPU_NMAXWORKERS 1
83 #define STARPU_NMAX_SCHED_CTXS 1
84 #define STARPU_MAXIMPLEMENTATIONS 1
85 #define STARPU_USE_SC_HYPERVISOR 1
86 #define STARPU_HAVE_GLPK_H 1
87 
88 #define STARPU_HAVE_LIBNUMA 1
89 
90 #define STARPU_HAVE_WINDOWS 1
91 #define STARPU_HAVE_UNSETENV 1
92 
93 #ifdef _MSC_VER
94 typedef long starpu_ssize_t;
95 #define __starpu_func__ __FUNCTION__
96 #else
97 # include <sys/types.h>
98 typedef ssize_t starpu_ssize_t;
99 #define __starpu_func__ __func__
100 #endif
101 
102 #if defined(c_plusplus) || defined(__cplusplus)
103 /* inline is part of C++ */
104 # define __starpu_inline inline
105 #elif defined(_MSC_VER) || defined(__HP_cc)
106 # define __starpu_inline __inline
107 #else
108 # define __starpu_inline __inline__
109 #endif
110 
111 #define STARPU_QUICK_CHECK 1
112 #define STARPU_USE_DRAND48 1
113 #define STARPU_USE_ERAND48_R 1
114 #define STARPU_HAVE_NEARBYINTF 1
115 #define STARPU_HAVE_RINTF 1
116 #define STARPU_USE_TOP 1
117 
118 #define STARPU_HAVE_HWLOC 1
119 #define STARPU_HAVE_PTHREAD_BARRIER 1
120 #define STARPU_HAVE_STRUCT_TIMESPEC 1
121 
122 /* This is only for building examples */
123 #define STARPU_HAVE_HELGRIND_H 1
124 
125 #endif
starpu-1.1.5/doc/doxygen/html/pages.html0000644000373600000000000002147412571536763015150 00000000000000 StarPU Handbook: Related Pages
StarPU Handbook
Related Pages
starpu-1.1.5/doc/doxygen/html/functions_0x75.html0000644000373600000000000001757312571536763016651 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- u -

starpu-1.1.5/doc/doxygen/html/distrib_data.png0000644000373600000000000001414712571536761016317 00000000000000PNG  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.1.5/doc/doxygen/html/ftv2link.png0000644000373600000000000000135212571536757015424 00000000000000PNG  IHDR}\IDATxMOS[sa?-XZ(PD4 AWbu`b 77wHFCԁ/`voAPqP@ 980 +y^Z9SW\83g3'Nçl_bpV"ֆXd]3xM[1W *PGz/Eg{ aoV:这1$RW,@56-,m/蹖 r5T*S(Vf89u գwa=<{ҡUr+dDF$`zNܮ0Q3~_^N=vpTLT}kqm<?ZhX_ݥ[) `ga_*2`'=F2EP l=8Wv%THqɿ<"GxH{#֫aJmKsVءM^ T ݛr߽m_?Wİ#uIENDB`starpu-1.1.5/doc/doxygen/html/starpu__task__list_8h.html0000644000373600000000000003046012571536757020337 00000000000000 StarPU Handbook: starpu_task_list.h File Reference
starpu_task_list.h File Reference
#include <starpu_task.h>
#include <starpu_util.h>

Go to the source code of this file.

Data Structures

struct  starpu_task_list

Functions

static STARPU_INLINE void starpu_task_list_init (struct starpu_task_list *list)
static STARPU_INLINE void starpu_task_list_push_front (struct starpu_task_list *list, struct starpu_task *task)
static STARPU_INLINE void starpu_task_list_push_back (struct starpu_task_list *list, struct starpu_task *task)
static STARPU_INLINE struct
starpu_task
starpu_task_list_front (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_back (struct starpu_task_list *list)
static STARPU_INLINE int starpu_task_list_empty (struct starpu_task_list *list)
static STARPU_INLINE void starpu_task_list_erase (struct starpu_task_list *list, struct starpu_task *task)
static STARPU_INLINE struct
starpu_task
starpu_task_list_pop_front (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_pop_back (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_begin (struct starpu_task_list *list)
static STARPU_INLINE struct
starpu_task
starpu_task_list_end (struct starpu_task_list *list STARPU_ATTRIBUTE_UNUSED)
static STARPU_INLINE struct
starpu_task
starpu_task_list_next (struct starpu_task *task)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__scheduler_8h_source.html0000644000373600000000000006657612571536757021562 00000000000000 StarPU Handbook: starpu_scheduler.h Source File
starpu_scheduler.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2014 Université de Bordeaux
4  * Copyright (C) 2011 Télécom-SudParis
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_SCHEDULER_H__
19 #define __STARPU_SCHEDULER_H__
20 
21 #include <starpu.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
28 struct starpu_task;
29 
31 {
32  void (*init_sched)(unsigned sched_ctx_id);
33  void (*deinit_sched)(unsigned sched_ctx_id);
34 
35  int (*push_task)(struct starpu_task *);
36  void (*push_task_notify)(struct starpu_task *, int workerid, int perf_workerid, unsigned sched_ctx_id);
37  struct starpu_task *(*pop_task)(unsigned sched_ctx_id);
38  struct starpu_task *(*pop_every_task)(unsigned sched_ctx_id);
39 
40  void (*pre_exec_hook)(struct starpu_task *);
41  void (*post_exec_hook)(struct starpu_task *);
42 
43  void (*add_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
44  void (*remove_workers)(unsigned sched_ctx_id, int *workerids, unsigned nworkers);
45 
46  const char *policy_name;
47  const char *policy_description;
48 };
49 
51 
52 void starpu_worker_get_sched_condition(int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond);
53 
54 /* This function must be called to wake up a worker that is sleeping on the cond.
55  * It returns 0 whenever the worker is not in a sleeping state */
56 int starpu_wakeup_worker(int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
57 
58 int starpu_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl);
59 
60 int starpu_push_local_task(int workerid, struct starpu_task *task, int back);
61 
62 int starpu_push_task_end(struct starpu_task *task);
63 
64 int starpu_combined_worker_assign_workerid(int nworkers, int workerid_array[]);
65 int starpu_combined_worker_get_description(int workerid, int *worker_size, int **combined_workerid);
66 int starpu_combined_worker_can_execute_task(unsigned workerid, struct starpu_task *task, unsigned nimpl);
67 
68 int starpu_get_prefetch_flag(void);
69 int starpu_prefetch_task_input_on_node(struct starpu_task *task, unsigned node);
70 
71 uint32_t starpu_task_footprint(struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl);
72 double starpu_task_expected_length(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl);
74 double starpu_task_expected_data_transfer_time(unsigned memory_node, struct starpu_task *task);
75 double starpu_data_expected_transfer_time(starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode);
76 double starpu_task_expected_power(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl);
77 double starpu_task_expected_conversion_time(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl);
78 
80 double starpu_task_bundle_expected_data_transfer_time(starpu_task_bundle_t bundle, unsigned memory_node);
82 
83 void starpu_sched_ctx_worker_shares_tasks_lists(int workerid, int sched_ctx_id);
84 #ifdef __cplusplus
85 }
86 #endif
87 
88 #endif /* __STARPU_SCHEDULER_H__ */
starpu-1.1.5/doc/doxygen/html/nav_f.png0000644000373600000000000000023112571536757014751 00000000000000PNG  IHDR8`IDATxK Eі[BmkHprӼ.ꎤR6Z VIE5jliIJ0/u޿6sH yIENDB`starpu-1.1.5/doc/doxygen/html/starpu__perfmodel_8h_source.html0000644000373600000000000013464612571536757021553 00000000000000 StarPU Handbook: starpu_perfmodel.h Source File
starpu_perfmodel.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2013, 2015 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique
5  * Copyright (C) 2011 Télécom-SudParis
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_PERFMODEL_H__
20 #define __STARPU_PERFMODEL_H__
21 
22 #include <starpu.h>
23 #include <stdio.h>
24 
25 #include <starpu_util.h>
26 
27 #ifdef __cplusplus
28 extern "C"
29 {
30 #endif
31 
32 struct starpu_task;
33 struct starpu_data_descr;
34 
36 {
38  STARPU_CUDA_DEFAULT = STARPU_MAXCPUS,
40 };
41 
42 #ifdef __STDC_VERSION__
43 # if __STDC_VERSION__ > 199901L || STARPU_GNUC_PREREQ(4, 6)
44 
45 /* Make sure the following assertions hold, since StarPU relies on it. */
46 
47 _Static_assert(STARPU_CPU_DEFAULT == 0,
48  "invalid STARPU_CPU_DEFAULT value");
50  "invalid STARPU_CPU_DEFAULT value");
52  "invalid STARPU_{CUDA,OPENCL}_DEFAULT values");
53 
54 # endif
55 #endif
56 
57 #define STARPU_NARCH_VARIATIONS (STARPU_OPENCL_DEFAULT + STARPU_MAXOPENCLDEVS)
58 
60 {
61  double mean;
62  double deviation;
63  double sum;
64  double sum2;
65  unsigned nsample;
66  uint32_t footprint;
67 #ifdef STARPU_HAVE_WINDOWS
68  unsigned size;
69 #else
70  size_t size;
71 #endif
72  double flops;
73 };
74 
76 {
79 };
80 
82 {
83  double sumlny;
84 
85  double sumlnx;
86  double sumlnx2;
87 
88  unsigned long minx;
89  unsigned long maxx;
90 
91  double sumlnxlny;
92 
93  double alpha;
94  double beta;
95  unsigned valid;
96 
97  double a, b, c;
98  unsigned nl_valid;
99 
100  unsigned nsample;
101 };
102 
103 struct starpu_perfmodel_history_table;
104 
105 #define starpu_per_arch_perfmodel starpu_perfmodel_per_arch STARPU_DEPRECATED
106 
108 {
109  double (*cost_model)(struct starpu_data_descr *t) STARPU_DEPRECATED;
110  double (*cost_function)(struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl);
111  size_t (*size_base)(struct starpu_task *, enum starpu_perfmodel_archtype arch, unsigned nimpl);
112 
113  struct starpu_perfmodel_history_table *history;
116 #ifdef STARPU_MODEL_DEBUG
117  char debug_path[256];
118 #endif
119 };
120 
122 {
128 };
129 
131 {
133 
134  double (*cost_model)(struct starpu_data_descr *) STARPU_DEPRECATED;
135  double (*cost_function)(struct starpu_task *, unsigned nimpl);
136 
137  size_t (*size_base)(struct starpu_task *, unsigned nimpl);
138 
139  struct starpu_perfmodel_per_arch per_arch[STARPU_NARCH_VARIATIONS][STARPU_MAXIMPLEMENTATIONS];
140 
141  const char *symbol;
142 
143  unsigned is_loaded;
144  unsigned benchmarking;
145  starpu_pthread_rwlock_t model_rwlock;
146 };
147 
150 
151 int starpu_perfmodel_load_symbol(const char *symbol, struct starpu_perfmodel *model);
153 
154 void starpu_perfmodel_debugfilepath(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, char *path, size_t maxlen, unsigned nimpl);
155 void starpu_perfmodel_get_arch_name(enum starpu_perfmodel_archtype arch, char *archname, size_t maxlen, unsigned nimpl);
156 
157 double starpu_perfmodel_history_based_expected_perf(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, uint32_t footprint);
158 int starpu_perfmodel_list(FILE *output);
159 void starpu_perfmodel_print(struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, unsigned nimpl, char *parameter, uint32_t *footprint, FILE *output);
160 int starpu_perfmodel_print_all(struct starpu_perfmodel *model, char *arch, char *parameter, uint32_t *footprint, FILE *output);
161 
162 void starpu_perfmodel_directory(FILE *output);
163 
164 void starpu_perfmodel_update_history(struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned cpuid, unsigned nimpl, double measured);
165 
166 void starpu_bus_print_bandwidth(FILE *f);
167 void starpu_bus_print_affinity(FILE *f);
168 
169 double starpu_transfer_bandwidth(unsigned src_node, unsigned dst_node);
170 double starpu_transfer_latency(unsigned src_node, unsigned dst_node);
171 double starpu_transfer_predict(unsigned src_node, unsigned dst_node, size_t size);
172 
173 #ifdef __cplusplus
174 }
175 #endif
176 
177 #endif /* __STARPU_PERFMODEL_H__ */
starpu-1.1.5/doc/doxygen/html/functions_vars.html0000644000373600000000000002037312571536763017111 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/functions_vars_0x67.html0000644000373600000000000001725612571536763017703 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- g -

starpu-1.1.5/doc/doxygen/html/starpu__data_8h_source.html0000644000373600000000000007467412571536757020513 00000000000000 StarPU Handbook: starpu_data.h Source File
starpu_data.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2015 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013, 2014 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_DATA_H__
19 #define __STARPU_DATA_H__
20 
21 #include <starpu.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
28 struct _starpu_data_state;
29 typedef struct _starpu_data_state* starpu_data_handle_t;
30 
32 {
34  STARPU_R=(1<<0),
35  STARPU_W=(1<<1),
38  STARPU_REDUX=(1<<3),
39  STARPU_SSEND=(1<<5),
40  STARPU_ACCESS_MODE_MAX=(1<<6)
41  /* Note: other STARPU_* values in include/starpu_task_util.h */
42 };
43 
45 {
46  starpu_data_handle_t handle;
48 };
49 
51 
52 void starpu_data_unregister(starpu_data_handle_t handle);
53 void starpu_data_unregister_no_coherency(starpu_data_handle_t handle);
54 void starpu_data_unregister_submit(starpu_data_handle_t handle);
55 void starpu_data_invalidate(starpu_data_handle_t handle);
56 void starpu_data_invalidate_submit(starpu_data_handle_t handle);
57 
58 void starpu_data_advise_as_important(starpu_data_handle_t handle, unsigned is_important);
59 
60 int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_data_access_mode mode);
61 int starpu_data_acquire_on_node(starpu_data_handle_t handle, int node, enum starpu_data_access_mode mode);
62 int starpu_data_acquire_cb(starpu_data_handle_t handle, enum starpu_data_access_mode mode, void (*callback)(void *), void *arg);
63 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);
64 #ifdef __GCC__
65 # define STARPU_DATA_ACQUIRE_CB(handle, mode, code) do \
66  { \ \
67  void callback(void *arg) \
68  { \
69  code; \
70  starpu_data_release(handle); \
71  } \
72  starpu_data_acquire_cb(handle, mode, callback, NULL); \
73  } \
74  while(0)
75 #endif
76 
77 void starpu_data_release(starpu_data_handle_t handle);
78 void starpu_data_release_on_node(starpu_data_handle_t handle, int node);
79 
81 
82 #define starpu_data_malloc_pinned_if_possible starpu_malloc
83 #define starpu_data_free_pinned_if_possible starpu_free
84 
85 int starpu_data_request_allocation(starpu_data_handle_t handle, unsigned node);
86 
87 int starpu_data_prefetch_on_node(starpu_data_handle_t handle, unsigned node, unsigned async);
88 
90 {
91  STARPU_UNUSED = 0x00,
95 };
96 
97 unsigned starpu_worker_get_memory_node(unsigned workerid);
98 unsigned starpu_memory_nodes_get_count(void);
99 enum starpu_node_kind starpu_node_get_kind(unsigned node);
100 
101 void starpu_data_set_wt_mask(starpu_data_handle_t handle, uint32_t wt_mask);
102 
103 void starpu_data_set_sequential_consistency_flag(starpu_data_handle_t handle, unsigned flag);
106 
107 void starpu_data_query_status(starpu_data_handle_t handle, int memory_node, int *is_allocated, int *is_valid, int *is_requested);
108 
109 struct starpu_codelet;
110 
111 void starpu_data_set_reduction_methods(starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl);
112 
113 unsigned starpu_data_test_if_allocated_on_node(starpu_data_handle_t handle, unsigned memory_node);
114 
115 #ifdef __cplusplus
116 }
117 #endif
118 
119 #endif /* __STARPU_DATA_H__ */
starpu-1.1.5/doc/doxygen/html/functions_0x6f.html0000644000373600000000000002107712571536763016723 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- o -

starpu-1.1.5/doc/doxygen/html/functions_0x77.html0000644000373600000000000002035312571536763016641 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- w -

starpu-1.1.5/doc/doxygen/html/tab_s.png0000644000373600000000000000027012571536757014753 00000000000000PNG  IHDR$[IDATx݁ @@ѣ?Q"%If6[HQ<]dr s?O=w'F -~rÍ[芭m֬ݯнF)Y% `n,9B!ь\<#IENDB`starpu-1.1.5/doc/doxygen/html/functions_vars_0x66.html0000644000373600000000000002146112571536763017673 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/ftv2vertline.png0000644000373600000000000000012612571536757016315 00000000000000PNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`starpu-1.1.5/doc/doxygen/html/functions_vars_0x70.html0000644000373600000000000002654312571536763017674 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- p -

starpu-1.1.5/doc/doxygen/html/starpu__bound_8h.html0000644000373600000000000001761612571536757017322 00000000000000 StarPU Handbook: starpu_bound.h File Reference
starpu_bound.h File Reference
#include <stdio.h>

Go to the source code of this file.

Functions

void starpu_bound_start (int deps, int prio)
void starpu_bound_stop (void)
void starpu_bound_print_dot (FILE *output)
void starpu_bound_compute (double *res, double *integer_res, int integer)
void starpu_bound_print_lp (FILE *output)
void starpu_bound_print_mps (FILE *output)
void starpu_bound_print (FILE *output, int integer)

Detailed Description

starpu-1.1.5/doc/doxygen/html/ftv2splitbar.png0000644000373600000000000000047212571536757016311 00000000000000PNG  IHDRMIDATxݡJCa( %4 bȘͶ3v^EL ,b;{Ï/aYկq:\IIIIIIIIIIIIIIIIII-l揊_t/ϻYQVYivk_ۣI@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$I@$C[V=[fIENDB`starpu-1.1.5/doc/doxygen/html/functions_0x68.html0000644000373600000000000002122112571536763016634 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- h -

starpu-1.1.5/doc/doxygen/html/group__API__Workers__Properties.html0000644000373600000000000011714012571536763022257 00000000000000 StarPU Handbook: Workers’ Properties
StarPU Handbook
Workers’ Properties

Data Structures

struct  starpu_worker_collection
struct  starpu_sched_ctx_iterator

Macros

#define STARPU_NMAXWORKERS

Enumerations

enum  starpu_node_kind { STARPU_UNUSED, STARPU_CPU_RAM, STARPU_CUDA_RAM, STARPU_OPENCL_RAM }
enum  starpu_worker_archtype { STARPU_ANY_WORKER, STARPU_CPU_WORKER, STARPU_CUDA_WORKER, STARPU_OPENCL_WORKER }
enum  starpu_worker_collection_type { STARPU_WORKER_LIST }

Functions

unsigned starpu_worker_get_count (void)
int starpu_worker_get_count_by_type (enum starpu_worker_archtype type)
unsigned starpu_cpu_worker_get_count (void)
unsigned starpu_cuda_worker_get_count (void)
unsigned starpu_opencl_worker_get_count (void)
int starpu_worker_get_id (void)
int starpu_worker_get_ids_by_type (enum starpu_worker_archtype type, int *workerids, int maxsize)
int starpu_worker_get_by_type (enum starpu_worker_archtype type, int num)
int starpu_worker_get_by_devid (enum starpu_worker_archtype type, int devid)
int starpu_worker_get_devid (int id)
enum starpu_worker_archtype starpu_worker_get_type (int id)
void starpu_worker_get_name (int id, char *dst, size_t maxlen)
unsigned starpu_worker_get_memory_node (unsigned workerid)
enum starpu_node_kind starpu_node_get_kind (unsigned node)

Detailed Description


Data Structure Documentation

struct starpu_worker_collection

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.

Data Fields

void * workerids
unsigned nworkers
enum starpu_worker_collection_type type
unsigned(* has_next )(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it)
int(* get_next )(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it)
int(* add )(struct starpu_worker_collection *workers, int worker)
int(* remove )(struct starpu_worker_collection *workers, int worker)
void(* init )(struct starpu_worker_collection *workers)
void(* deinit )(struct starpu_worker_collection *workers)
void(* init_iterator )(struct starpu_worker_collection *workers, struct starpu_sched_ctx_iterator *it)

Field Documentation

starpu_worker_collection::workerids

The workerids managed by the collection

starpu_worker_collection::nworkers

The number of workers in the collection

starpu_worker_collection::type

The type of structure (currently STARPU_WORKER_LIST is the only one available)

starpu_worker_collection::has_next

Checks if there is another element in collection

starpu_worker_collection::get_next

return the next element in the collection

starpu_worker_collection::add

add a new element in the collection

starpu_worker_collection::remove

remove an element from the collection

starpu_worker_collection::init

Initialize the collection

starpu_worker_collection::deinit

Deinitialize the colection

starpu_worker_collection::init_iterator

Initialize the cursor if there is one

struct starpu_sched_ctx_iterator

Structure needed to iterate on the collection

Data Fields
int cursor The index of the current worker in the collection, needed when iterating on the collection.

Macro Definition Documentation

#define STARPU_NMAXWORKERS

Define the maximum number of workers managed by StarPU.

Enumeration Type Documentation

TODO

Enumerator:
STARPU_UNUSED 

TODO

STARPU_CPU_RAM 

TODO

STARPU_CUDA_RAM 

TODO

STARPU_OPENCL_RAM 

TODO

Worker Architecture Type

Enumerator:
STARPU_ANY_WORKER 

any worker, used in the hypervisor

STARPU_CPU_WORKER 

CPU core

STARPU_CUDA_WORKER 

NVIDIA CUDA device

STARPU_OPENCL_WORKER 

OpenCL device

Types of structures the worker collection can implement

Enumerator:
STARPU_WORKER_LIST 

The collection is an array

Function Documentation

unsigned starpu_worker_get_count ( void  )

This function returns the number of workers (i.e. processing units executing StarPU tasks). The returned value should be at most STARPU_NMAXWORKERS.

int starpu_worker_get_count_by_type ( enum starpu_worker_archtype  type)

Returns the number of workers of the given type. A positive (or NULL) value is returned in case of success, -EINVAL indicates that the type is not valid otherwise.

unsigned starpu_cpu_worker_get_count ( void  )

This function returns the number of CPUs controlled by StarPU. The returned value should be at most STARPU_MAXCPUS.

unsigned starpu_cuda_worker_get_count ( void  )

This function returns the number of CUDA devices controlled by StarPU. The returned value should be at most STARPU_MAXCUDADEVS.

unsigned starpu_opencl_worker_get_count ( void  )

This function returns the number of OpenCL devices controlled by StarPU. The returned value should be at most STARPU_MAXOPENCLDEVS.

int starpu_worker_get_id ( void  )

This function returns the identifier of the current worker, i.e the one associated to the calling thread. The returned value is either -1 if the current context is not a StarPU worker (i.e. when called from the application outside a task or a callback), or an integer between 0 and starpu_worker_get_count() - 1.

int starpu_worker_get_ids_by_type ( enum starpu_worker_archtype  type,
int *  workerids,
int  maxsize 
)

This function gets the list of identifiers of workers with the given type. It fills the array workerids with the identifiers of the workers that have the type indicated in the first argument. The argument maxsize indicates the size of the array workerids. The returned value gives the number of identifiers that were put in the array. -ERANGE is returned is maxsize is lower than the number of workers with the appropriate type: in that case, the array is filled with the 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 STARPU_NMAXWORKERS.

int starpu_worker_get_by_type ( enum starpu_worker_archtype  type,
int  num 
)

This returns the identifier of the num-th worker that has the specified type type. If there are no such worker, -1 is returned.

int starpu_worker_get_by_devid ( enum starpu_worker_archtype  type,
int  devid 
)

This returns the identifier of the worker that has the specified type type and device id devid (which may not be the n-th, if some devices are skipped for instance). If there are no such worker, -1 is returned.

int starpu_worker_get_devid ( int  id)

This function returns the device id of the given worker. The worker should be identified with the value returned by the starpu_worker_get_id() function. In the case of a CUDA worker, this device identifier is the logical device identifier exposed by CUDA (used by the function cudaGetDevice() for instance). The device identifier of a CPU worker is the logical identifier of the core on which the worker was bound; this identifier is either provided by the OS or by the library hwloc in case it is available.

enum starpu_worker_archtype starpu_worker_get_type ( int  id)

This function returns the type of processing unit associated to a worker. The worker identifier is a value returned by the function starpu_worker_get_id()). The returned value indicates the architecture of the worker: STARPU_CPU_WORKER for a CPU core, STARPU_CUDA_WORKER for a CUDA device, and STARPU_OPENCL_WORKER for a OpenCL device. The value returned for an invalid identifier is unspecified.

void starpu_worker_get_name ( int  id,
char *  dst,
size_t  maxlen 
)

This function allows to get the name of a given worker. StarPU associates a unique human readable string to each processing unit. This function copies at most the maxlen first bytes of the unique string associated to a worker identified by its identifier id into the dst buffer. The caller is responsible for ensuring that dst is a valid pointer to a buffer of maxlen bytes at least. Calling this function on an invalid identifier results in an unspecified behaviour.

unsigned starpu_worker_get_memory_node ( unsigned  workerid)

This function returns the identifier of the memory node associated to the worker identified by workerid.

enum starpu_node_kind starpu_node_get_kind ( unsigned  node)

Returns the type of the given node as defined by starpu_node_kind. For example, when defining a new data interface, this function should be used in the allocation function to determine on which device the memory needs to be allocated.

starpu-1.1.5/doc/doxygen/html/doxygen.css0000644000373600000000000004705012571536757015353 00000000000000/* The standard CSS for doxygen */ body, table, div, p, dl { font: 400 14px/19px Roboto,sans-serif; } /* @group Heading Levels */ h1 { font-size: 150%; } .title { font-size: 150%; font-weight: bold; margin: 10px 2px; } h2 { border-bottom: 1px solid #879ECB; color: #354C7B; font-size: 150%; font-weight: normal; margin-top: 1.75em; padding-top: 8px; padding-bottom: 4px; width: 100%; } h3 { font-size: 100%; } h1, h2, h3, h4, h5, h6 { -webkit-transition: text-shadow 0.5s linear; -moz-transition: text-shadow 0.5s linear; -ms-transition: text-shadow 0.5s linear; -o-transition: text-shadow 0.5s linear; transition: text-shadow 0.5s linear; margin-right: 15px; } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { text-shadow: 0 0 15px cyan; } dt { font-weight: bold; } div.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; } p.startli, p.startdd, p.starttd { margin-top: 2px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #ffffff; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #ffffff; } a.el { font-weight: bold; } a.elRef { } a.code, a.code:visited { color: #4665A2; } a.codeRef, a.codeRef:visited { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; font-family: monospace, fixed; font-size: 105%; } div.fragment { padding: 4px; margin: 4px; background-color: #FBFCFD; border: 1px solid #C4CFE5; } div.line { font-family: monospace, fixed; font-size: 13px; min-height: 13px; line-height: 1.0; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ text-indent: -53px; padding-left: 53px; padding-bottom: 0px; margin: 0px; -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } div.line.glow { background-color: cyan; box-shadow: 0 0 10px cyan; } span.lineno { padding-right: 4px; text-align: right; border-right: 2px solid #0F0; background-color: #E8E8E8; white-space: pre; } span.lineno a { background-color: #D8D8D8; } span.lineno a:hover { background-color: #C8C8C8; } div.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background-color: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 12px; margin-right: 8px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; white-space: nowrap; vertical-align: top; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } blockquote { background-color: #F7F8FB; border-left: 2px solid #9CAFD4; margin: 0 24px 0 4px; padding: 0 12px 0 16px; } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .memberdecls td, .fieldtable tr { -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } .memberdecls td.glow, .fieldtable tr.glow { background-color: cyan; box-shadow: 0 0 15px cyan; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memItemLeft, .memItemRight, .memTemplParams { border-bottom: 1px solid #DEE4F0; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight { width: 100%; } .memTemplParams { color: #4665A2; white-space: nowrap; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 9px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; -webkit-transition: box-shadow 0.5s linear; -moz-transition: box-shadow 0.5s linear; -ms-transition: box-shadow 0.5s linear; -o-transition: box-shadow 0.5s linear; transition: box-shadow 0.5s linear; display: table !important; width: 100%; } .memitem.glow { box-shadow: 0 0 15px cyan; } .memname { font-weight: bold; margin-left: 6px; } .memname td { vertical-align: bottom; } .memproto, dl.reflist dt { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; border-top-left-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 4px; -webkit-border-top-left-radius: 4px; } .memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 10px 2px 10px; background-color: #FBFCFD; border-top-width: 0; background-image:url('nav_g.png'); background-repeat:repeat-x; background-color: #FFFFFF; /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; /* webkit specific markup */ -webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-right-radius: 4px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); } dl.reflist dt { padding: 5px; } dl.reflist dd { margin: 0px 0px 10px 0px; padding: 5px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .paramname code { line-height: 14px; } .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; } .params .paramname, .retval .paramname { font-weight: bold; vertical-align: top; } .params .paramtype { font-style: italic; vertical-align: top; } .params .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } table.mlabels { border-spacing: 0px; } td.mlabels-left { width: 100%; padding: 0px; } td.mlabels-right { vertical-align: bottom; padding: 0px; white-space: nowrap; } span.mlabels { margin-left: 8px; } span.mlabel { background-color: #728DC1; border-top:1px solid #5373B4; border-left:1px solid #5373B4; border-right:1px solid #C4CFE5; border-bottom:1px solid #C4CFE5; text-shadow: none; color: white; margin-right: 4px; padding: 2px 3px; border-radius: 3px; font-size: 7pt; white-space: nowrap; } /* @end */ /* these are for tree view when not used as main index */ div.directory { margin: 10px 0px; border-top: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; width: 100%; } .directory table { border-collapse:collapse; } .directory td { margin: 0px; padding: 0px; vertical-align: top; } .directory td.entry { white-space: nowrap; padding-right: 6px; } .directory td.entry a { outline:none; } .directory td.entry a img { border: none; } .directory td.desc { width: 100%; padding-left: 6px; padding-right: 6px; padding-top: 3px; border-left: 1px solid rgba(0,0,0,0.05); } .directory tr.even { padding-left: 6px; background-color: #F7F8FB; } .directory img { vertical-align: -30%; } .directory .levels { white-space: nowrap; width: 100%; text-align: right; font-size: 9pt; } .directory .levels span { cursor: pointer; padding-left: 2px; padding-right: 2px; color: #3D578C; } div.dynheader { margin-top: 8px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } address { font-style: normal; color: #2A3D61; } table.doxtable { border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { width: 100%; margin-bottom: 10px; border: 1px solid #A8B8D9; border-spacing: 0px; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { padding: 3px 7px 2px; } .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; border-right: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; vertical-align: top; } .fieldtable td.fielddoc { border-bottom: 1px solid #A8B8D9; width: 100%; } .fieldtable tr:last-child td { border-bottom: none; } .fieldtable th { background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; font-size: 90%; color: #253555; padding-bottom: 4px; padding-top: 5px; text-align:left; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; -webkit-border-top-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom: 1px solid #A8B8D9; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; } .navpath li.navelem a:hover { color:#6884BD; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#364D7C; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } div.ingroups { font-size: 8pt; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } dl { padding: 0 0 0 10px; } /* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ dl.section { margin-left: 0px; padding-left: 0px; } dl.note { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #D0C000; } dl.warning, dl.attention { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #FF0000; } dl.pre, dl.post, dl.invariant { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #00D000; } dl.deprecated { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #505050; } dl.todo { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #00C0E0; } dl.test { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #3030E0; } dl.bug { margin-left:-7px; padding-left: 3px; border-left:4px solid; border-color: #C08050; } dl.section dd { margin-bottom: 6px; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectname { font: 300% Tahoma, Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #5373B4; } .image { text-align: center; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .caption { font-weight: bold; } div.zoom { border: 1px solid #90A5CE; } dl.citelist { margin-bottom:50px; } dl.citelist dt { color:#334975; float:left; font-weight:bold; margin-right:10px; padding:5px; } dl.citelist dd { margin:2px 0; padding:5px 0; } div.toc { padding: 14px 25px; background-color: #F4F6FA; border: 1px solid #D8DFEE; border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0 20px 10px 10px; width: 200px; } div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; margin-top: 5px; padding-left: 10px; padding-top: 2px; } div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; color: #4665A2; border-bottom: 0 none; margin: 0; } div.toc ul { list-style: none outside none; border: medium none; padding: 0px; } div.toc li.level1 { margin-left: 0px; } div.toc li.level2 { margin-left: 15px; } div.toc li.level3 { margin-left: 30px; } div.toc li.level4 { margin-left: 45px; } .inherit_header { font-weight: bold; color: gray; cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .inherit_header td { padding: 6px 0px 2px 5px; } .inherit { display: none; } tr.heading h2 { margin-top: 12px; margin-bottom: 4px; } @media print { #top { display: none; } #side-nav { display: none; } #nav-path { display: none; } body { overflow:visible; } h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } .summary { display: none; } .memitem { page-break-inside: avoid; } #doc-content { margin-left:0 !important; height:auto !important; width:auto !important; overflow:inherit; display:inline; } } starpu-1.1.5/doc/doxygen/html/group__API__Threads.html0000644000373600000000000016554112571536763017652 00000000000000 StarPU Handbook: Threads
StarPU Handbook
Threads

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 (Simulated Performance). More...

Macros

#define STARPU_PTHREAD_CREATE_ON(name, thread, attr, routine, arg, where)
#define STARPU_PTHREAD_CREATE(thread, attr, routine, arg)
#define STARPU_PTHREAD_MUTEX_INIT(mutex, attr)
#define STARPU_PTHREAD_MUTEX_DESTROY(mutex)
#define STARPU_PTHREAD_MUTEX_LOCK(mutex)
#define STARPU_PTHREAD_MUTEX_UNLOCK(mutex)
#define STARPU_PTHREAD_KEY_CREATE(key, destr)
#define STARPU_PTHREAD_KEY_DELETE(key)
#define STARPU_PTHREAD_SETSPECIFIC(key, ptr)
#define STARPU_PTHREAD_GETSPECIFIC(key)
#define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr)
#define STARPU_PTHREAD_RWLOCK_RDLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_WRLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_UNLOCK(rwlock)
#define STARPU_PTHREAD_RWLOCK_DESTROY(rwlock)
#define STARPU_PTHREAD_COND_INIT(cond, attr)
#define STARPU_PTHREAD_COND_DESTROY(cond)
#define STARPU_PTHREAD_COND_SIGNAL(cond)
#define STARPU_PTHREAD_COND_BROADCAST(cond)
#define STARPU_PTHREAD_COND_WAIT(cond, mutex)
#define STARPU_PTHREAD_BARRIER_INIT(barrier, attr, count)
#define STARPU_PTHREAD_BARRIER_DESTROY(barrier)
#define STARPU_PTHREAD_BARRIER_WAIT(barrier)
#define STARPU_PTHREAD_MUTEX_INITIALIZER
#define STARPU_PTHREAD_COND_INITIALIZER

Functions

int starpu_pthread_create (starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
int starpu_pthread_join (starpu_pthread_t thread, void **retval)
int starpu_pthread_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)
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_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)
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)
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_wrlock (starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_rwlock_unlock (starpu_pthread_rwlock_t *rwlock)

Detailed Description

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 (Simulated Performance).

Macro Definition Documentation

#define STARPU_PTHREAD_CREATE_ON (   name,
  thread,
  attr,
  routine,
  arg,
  where 
)

This macro calls the function starpu_pthread_create_on() and aborts on error.

#define STARPU_PTHREAD_CREATE (   thread,
  attr,
  routine,
  arg 
)

This macro calls the function starpu_pthread_create() and aborts on error.

#define STARPU_PTHREAD_MUTEX_INIT (   mutex,
  attr 
)

This macro calls the function starpu_pthread_mutex_init() and aborts on error.

#define STARPU_PTHREAD_MUTEX_DESTROY (   mutex)

This macro calls the function starpu_pthread_mutex_destroy() and aborts on error.

#define STARPU_PTHREAD_MUTEX_LOCK (   mutex)

This macro calls the function starpu_pthread_mutex_lock() and aborts on error.

#define STARPU_PTHREAD_MUTEX_UNLOCK (   mutex)

This macro calls the function starpu_pthread_mutex_unlock() and aborts on error.

#define STARPU_PTHREAD_KEY_CREATE (   key,
  destr 
)

This macro calls the function starpu_pthread_key_create() and aborts on error.

#define STARPU_PTHREAD_KEY_DELETE (   key)

This macro calls the function starpu_pthread_key_delete() and aborts on error.

#define STARPU_PTHREAD_SETSPECIFIC (   key,
  ptr 
)

This macro calls the function starpu_pthread_setspecific() and aborts on error.

#define STARPU_PTHREAD_GETSPECIFIC (   key)

This macro calls the function starpu_pthread_getspecific() and aborts on error.

#define STARPU_PTHREAD_RWLOCK_INIT (   rwlock,
  attr 
)

This macro calls the function starpu_pthread_rwlock_init() and aborts on error.

#define STARPU_PTHREAD_RWLOCK_RDLOCK (   rwlock)

This macro calls the function starpu_pthread_rwlock_rdlock() and aborts on error.

#define STARPU_PTHREAD_RWLOCK_WRLOCK (   rwlock)

This macro calls the function starpu_pthread_rwlock_wrlock() and aborts on error.

#define STARPU_PTHREAD_RWLOCK_UNLOCK (   rwlock)

This macro calls the function starpu_pthread_rwlock_unlock() and aborts on error.

#define STARPU_PTHREAD_RWLOCK_DESTROY (   rwlock)

This macro calls the function starpu_pthread_rwlock_destroy() and aborts on error.

#define STARPU_PTHREAD_COND_INIT (   cond,
  attr 
)

This macro calls the function starpu_pthread_cond_init() and aborts on error.

#define STARPU_PTHREAD_COND_DESTROY (   cond)

This macro calls the function starpu_pthread_cond_destroy() and aborts on error.

#define STARPU_PTHREAD_COND_SIGNAL (   cond)

This macro calls the function starpu_pthread_cond_signal() and aborts on error.

#define STARPU_PTHREAD_COND_BROADCAST (   cond)

This macro calls the function starpu_pthread_cond_broadcast() and aborts on error.

#define STARPU_PTHREAD_COND_WAIT (   cond,
  mutex 
)

This macro calls the function starpu_pthread_cond_wait() and aborts on error.

#define STARPU_PTHREAD_BARRIER_INIT (   barrier,
  attr,
  count 
)

This macro calls the function starpu_pthread_barrier_init() and aborts on error.

#define STARPU_PTHREAD_BARRIER_DESTROY (   barrier)

This macro calls the function starpu_pthread_barrier_destroy() and aborts on error.

#define STARPU_PTHREAD_BARRIER_WAIT (   barrier)

This macro calls the function starpu_pthread_barrier_wait() and aborts on error.

STARPU_PTHREAD_MUTEX_INITIALIZER

This macro initializes the mutex given in parameter.

STARPU_PTHREAD_COND_INITIALIZER

This macro initializes the condition variable given in parameter.

Function Documentation

int starpu_pthread_create ( starpu_pthread_t *  thread,
const starpu_pthread_attr_t *  attr,
void *(*)(void *)  start_routine,
void *  arg 
)

This function starts a new thread in the calling process. The new thread starts execution by invoking start_routine; arg is passed as the sole argument of start_routine.

int starpu_pthread_join ( starpu_pthread_t  thread,
void **  retval 
)

This function waits for the thread specified by thread to terminate. If that thread has already terminated, then the function returns immediately. The thread specified by thread must be joinable.

int starpu_pthread_attr_init ( starpu_pthread_attr_t *  attr)

This function initializes the thread attributes object pointed to by attr with default attribute values.

It does not do anything when the simulated performance mode is enabled (Simulated Performance).

int starpu_pthread_attr_destroy ( starpu_pthread_attr_t *  attr)

This function destroys a thread attributes object which is no longer required. Destroying a thread attributes object has no effect on threads that were created using that object.

It does not do anything when the simulated performance mode is enabled (Simulated Performance).

int starpu_pthread_attr_setdetachstate ( starpu_pthread_attr_t *  attr,
int  detachstate 
)

This function sets the detach state attribute of the thread attributes object referred to by attr to the value specified in detachstate. The detach state attribute determines whether a thread created using the thread attributes object attr will be created in a joinable or a detached state.

It does not do anything when the simulated performance mode is enabled (Simulated Performance).

int starpu_pthread_mutex_init ( starpu_pthread_mutex_t *  mutex,
const starpu_pthread_mutexattr_t *  mutexattr 
)

This function initializes the mutex object pointed to by mutex according to the mutex attributes specified in mutexattr. If mutexattr is NULL, default attributes are used instead.

int starpu_pthread_mutex_destroy ( starpu_pthread_mutex_t *  mutex)

This function destroys a mutex object, freeing the resources it might hold. The mutex must be unlocked on entrance.

int starpu_pthread_mutex_lock ( starpu_pthread_mutex_t *  mutex)

This function locks the given mutex. If the mutex is currently unlocked, it becomes locked and owned by the calling thread, and the function returns immediately. If the mutex is already locked by another thread, the function suspends the calling thread until the mutex is unlocked.

int starpu_pthread_mutex_unlock ( starpu_pthread_mutex_t *  mutex)

This function unlocks the given mutex. The mutex is assumed to be locked and owned by the calling thread on entrance to starpu_pthread_mutex_unlock().

int starpu_pthread_mutex_trylock ( starpu_pthread_mutex_t *  mutex)

This function behaves identically to starpu_pthread_mutex_lock(), except that it does not block the calling thread if the mutex is already locked by another thread (or by the calling thread in the case of a ``fast'' mutex). Instead, the function returns immediately with the error code EBUSY.

int starpu_pthread_key_create ( starpu_pthread_key_t *  key,
void(*)(void *)  destr_function 
)

This function allocates a new TSD key. The key is stored in the location pointed to by key.

int starpu_pthread_key_delete ( starpu_pthread_key_t  key)

This function deallocates a TSD key. It does not check whether non-NULL values are associated with that key in the currently executing threads, nor call the destructor function associated with the key.

int starpu_pthread_setspecific ( starpu_pthread_key_t  key,
const void *  pointer 
)

This function changes the value associated with key in the calling thread, storing the given pointer instead.

* starpu_pthread_getspecific ( starpu_pthread_key_t  key)

This function returns the value associated with key on success, and NULL on error.

starpu_pthread_cond_init ( starpu_pthread_cond_t *  cond,
starpu_pthread_condattr_t *  cond_attr 
)

This function initializes the condition variable cond, using the condition attributes specified in cond_attr, or default attributes if cond_attr is NULL.

starpu_pthread_cond_signal ( starpu_pthread_cond_t *  cond)

This function restarts one of the threads that are waiting on the condition variable cond. If no threads are waiting on cond, nothing happens. If several threads are waiting on cond, exactly one is restarted, but it not specified which.

starpu_pthread_cond_broadcast ( starpu_pthread_cond_t *  cond)

This function restarts all the threads that are waiting on the condition variable cond. Nothing happens if no threads are waiting on cond.

starpu_pthread_cond_wait ( starpu_pthread_cond_t *  cond,
starpu_pthread_mutex_t *  mutex 
)

This function atomically unlocks the mutex (as per starpu_pthread_mutex_unlock()) and waits for the condition variable 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()).

starpu_pthread_cond_timedwait ( starpu_pthread_cond_t *  cond,
starpu_pthread_mutex_t *  mutex,
const struct timespec *  abstime 
)

This function atomically unlocks mutex and waits on cond, as starpu_pthread_cond_wait() does, but it also bounds the duration of the wait.

starpu_pthread_cond_destroy ( starpu_pthread_cond_t *  cond)

This function destroys a condition variable, freeing the resources it might hold. No threads must be waiting on the condition variable on entrance to the function.

starpu_pthread_rwlock_init ( starpu_pthread_rwlock_t *  rwlock,
const starpu_pthread_rwlockattr_t *  attr 
)

This function is the same as starpu_pthread_mutex_init().

starpu_pthread_rwlock_destroy ( starpu_pthread_rwlock_t *  rwlock)

This function is the same as starpu_pthread_mutex_destroy().

starpu_pthread_rwlock_rdlock ( starpu_pthread_rwlock_t *  rwlock)

This function is the same as starpu_pthread_mutex_lock().

starpu_pthread_rwlock_wrlock ( starpu_pthread_rwlock_t *  rwlock)

This function is the same as starpu_pthread_mutex_lock().

starpu_pthread_rwlock_unlock ( starpu_pthread_rwlock_t *  rwlock)

This function is the same as starpu_pthread_mutex_unlock().

starpu-1.1.5/doc/doxygen/html/sc__hypervisor_8h_source.html0000644000373600000000000010050012571536757021055 00000000000000 StarPU Handbook: sc_hypervisor.h Source File
sc_hypervisor.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2011 - 2013 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef SC_HYPERVISOR_H
18 #define SC_HYPERVISOR_H
19 
20 #include <starpu.h>
22 #include <sc_hypervisor_config.h>
24 #include <math.h>
25 
26 #ifdef __cplusplus
27 extern "C"
28 {
29 #endif
30 
31 /* synchronise the hypervisor when several workers try to update its information */
32 starpu_pthread_mutex_t act_hypervisor_mutex;
33 
34 /* platform of resizing contexts */
36 {
37  /* name of the strategy */
38  const char* name;
39 
40  /* indicate if it is a policiy create by the user or not */
41  unsigned custom;
42 
43  /* Distribute workers to contexts even at the begining of the program */
44  void (*size_ctxs)(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers);
45 
46  /* Require explicit resizing */
47  void (*resize_ctxs)(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers);
48 
49  /* the hypervisor takes a decision when the worker was idle for another cyle in this ctx */
50  void (*handle_idle_cycle)(unsigned sched_ctx, int worker);
51 
52  /* the hypervisor takes a decision when another task was pushed on this worker in this ctx */
53  void (*handle_pushed_task)(unsigned sched_ctx, int worker);
54 
55  /* the hypervisor takes a decision when another task was poped from this worker in this ctx */
56  void (*handle_poped_task)(unsigned sched_ctx, int worker,struct starpu_task *task, uint32_t footprint);
57 
58  /* the hypervisor takes a decision when the worker stoped being idle in this ctx */
59  void (*handle_idle_end)(unsigned sched_ctx, int worker);
60 
61  /* the hypervisor takes a decision when a certain task finished executing in this ctx */
62  void (*handle_post_exec_hook)(unsigned sched_ctx, int task_tag);
63 
64  /* the hypervisor takes a decision when a job was submitted in this ctx */
65  void (*handle_submitted_job)(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size);
66 
67  /* the hypervisor takes a decision when a certain ctx was deleted */
68  void (*end_ctx)(unsigned sched_ctx);
69 };
70 
71 /* start the hypervisor indicating the resizing policy to user */
72 void* sc_hypervisor_init(struct sc_hypervisor_policy *policy);
73 
74 /* shutdown the hypervisor */
75 void sc_hypervisor_shutdown(void);
76 
77 /* only registered contexts are resized by the hypervisor */
78 void sc_hypervisor_register_ctx(unsigned sched_ctx, double total_flops);
79 
80 /* remove a worker from the hypervisor's list */
81 void sc_hypervisor_unregister_ctx(unsigned sched_ctx);
82 
83 /* submit a requirement of resizing when a task taged with task_tag is executed */
84 void sc_hypervisor_post_resize_request(unsigned sched_ctx, int task_tag);
85 
86 /* reevaluate the distribution of the resources and eventually resize if needed */
87 void sc_hypervisor_resize_ctxs(unsigned *sched_ctxs, int nsched_ctxs , int *workers, int nworkers);
88 
89 /* don't allow the hypervisor to resize a context */
90 void sc_hypervisor_stop_resize(unsigned sched_ctx);
91 
92 /* allow the hypervisor to resize a context */
93 void sc_hypervisor_start_resize(unsigned sched_ctx);
94 
95 /* check out the current policy of the hypervisor */
96 const char *sc_hypervisor_get_policy();
97 
98 /* ask the hypervisor to add workers to a sched_ctx */
99 void sc_hypervisor_add_workers_to_sched_ctx(int* workers_to_add, unsigned nworkers_to_add, unsigned sched_ctx);
100 
101 /* ask the hypervisor to remove workers from a sched_ctx */
102 void sc_hypervisor_remove_workers_from_sched_ctx(int* workers_to_remove, unsigned nworkers_to_remove, unsigned sched_ctx, unsigned now);
103 
104 /* ask the hypervisor to move workers from one context to another */
105 void sc_hypervisor_move_workers(unsigned sender_sched_ctx, unsigned receiver_sched_ctx, int *workers_to_move, unsigned nworkers_to_move, unsigned now);
106 
107 /* ask the hypervisor to chose a distribution of workers in the required contexts */
108 void sc_hypervisor_size_ctxs(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers);
109 
110 /* check if there are pending demands of resizing */
111 unsigned sc_hypervisor_get_size_req(unsigned **sched_ctxs, int* nsched_ctxs, int **workers, int *nworkers);
112 
113 /* save a demand of resizing */
114 void sc_hypervisor_save_size_req(unsigned *sched_ctxs, int nsched_ctxs, int *workers, int nworkers);
115 
116 /* clear the list of pending demands of resizing */
117 void sc_hypervisor_free_size_req(void);
118 
119 /* check out if a context can be resized */
120 unsigned sc_hypervisor_can_resize(unsigned sched_ctx);
121 
122 /* indicate the types of tasks a context will execute in order to better decide the sizing of ctxs */
123 void sc_hypervisor_set_type_of_task(struct starpu_codelet *cl, unsigned sched_ctx, uint32_t footprint, size_t data_size);
124 
125 /* change dynamically the total number of flops of a context, move the deadline of the finishing time of the context */
126 void sc_hypervisor_update_diff_total_flops(unsigned sched_ctx, double diff_total_flops);
127 
128 /* change dynamically the number of the elapsed flops in a context, modify the past in order to better compute the speed */
129 void sc_hypervisor_update_diff_elapsed_flops(unsigned sched_ctx, double diff_task_flops);
130 
131 /* updates the min and max workers needed by each context */
132  void sc_hypervisor_update_resize_interval(unsigned *sched_ctxs, int nsched_ctxs);
133 #ifdef __cplusplus
134 }
135 #endif
136 
137 #endif
starpu-1.1.5/doc/doxygen/html/group__API__Data__Management.html0000644000373600000000000013471012571536763021416 00000000000000 StarPU Handbook: Data Management
StarPU Handbook
Data Management

This section describes the data management facilities provided by StarPU. We show how to use existing data interfaces in Data Interfaces, but developers can design their own data interfaces if required. More...

Typedefs

typedef struct _starpu_data_state * starpu_data_handle_t

Enumerations

enum  starpu_data_access_mode {
  STARPU_NONE, STARPU_R, STARPU_W, STARPU_RW,
  STARPU_SCRATCH, STARPU_REDUX, STARPU_SSEND, STARPU_ACCESS_MODE_MAX
}

Basic Data Management API

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 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).

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)
void starpu_data_register_same (starpu_data_handle_t *handledst, starpu_data_handle_t handlesrc)
void starpu_data_unregister (starpu_data_handle_t handle)
void starpu_data_unregister_no_coherency (starpu_data_handle_t handle)
void starpu_data_unregister_submit (starpu_data_handle_t handle)
void starpu_data_invalidate (starpu_data_handle_t handle)
void starpu_data_invalidate_submit (starpu_data_handle_t handle)
void starpu_data_set_wt_mask (starpu_data_handle_t handle, uint32_t wt_mask)
int starpu_data_prefetch_on_node (starpu_data_handle_t handle, unsigned node, unsigned async)
starpu_data_handle_t starpu_data_lookup (const void *ptr)
int starpu_data_request_allocation (starpu_data_handle_t handle, unsigned node)
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_advise_as_important (starpu_data_handle_t handle, unsigned is_important)
void starpu_data_set_reduction_methods (starpu_data_handle_t handle, struct starpu_codelet *redux_cl, struct starpu_codelet *init_cl)

Access registered data from the application

#define STARPU_DATA_ACQUIRE_CB(handle, mode, code)
int starpu_data_acquire (starpu_data_handle_t handle, 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)
void starpu_data_release (starpu_data_handle_t handle)

Detailed Description

This section describes the data management facilities provided by StarPU. We show how to use existing data interfaces in Data Interfaces, but developers can design their own data interfaces if required.

Macro Definition Documentation

#define STARPU_DATA_ACQUIRE_CB (   handle,
  mode,
  code 
)

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 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.

Typedef Documentation

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.

Enumeration Type Documentation

This datatype describes a data access mode.

Enumerator:
STARPU_NONE 

TODO

STARPU_R 

read-only mode.

STARPU_W 

write-only mode.

STARPU_RW 

read-write mode. This is equivalent to STARPU_R|STARPU_W

STARPU_SCRATCH 

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 

todo

STARPU_SSEND 

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())

Function Documentation

void starpu_data_register ( starpu_data_handle_t handleptr,
unsigned  home_node,
void *  data_interface,
struct starpu_data_interface_ops ops 
)

Register a piece of data into the handle located at the handleptr address. The data_interface buffer contains the initial description of the data in the home_node. The 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 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_ptr_register ( starpu_data_handle_t  handle,
unsigned  node 
)

Register that a buffer for handle on 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_register_same ( starpu_data_handle_t handledst,
starpu_data_handle_t  handlesrc 
)

Register a new piece of data into the handle handledst with the same interface as the handle handlesrc.

void starpu_data_unregister ( starpu_data_handle_t  handle)

This function unregisters a data handle from StarPU. If the data was automatically allocated by StarPU because the home node was -1, all automatically allocated buffers are freed. Otherwise, a valid copy of the data is put back into the home node in the buffer that was initially registered. Using a data handle that has been unregistered from StarPU results in an undefined behaviour. In case we do not need to update the value of the data in the home node, we can use the function starpu_data_unregister_no_coherency() instead.

void starpu_data_unregister_no_coherency ( starpu_data_handle_t  handle)

This is the same as starpu_data_unregister(), except that StarPU does not put back a valid copy into the home node, in the buffer that was initially registered.

void starpu_data_unregister_submit ( starpu_data_handle_t  handle)

Destroy the data handle once it is not needed anymore by any submitted task. No coherency is assumed.

void starpu_data_invalidate ( starpu_data_handle_t  handle)

Destroy all replicates of the data handle immediately. After data invalidation, the first access to the handle must be performed in write-only mode. Accessing an invalidated data in read-mode results in undefined behaviour.

void starpu_data_invalidate_submit ( starpu_data_handle_t  handle)

Submits invalidation of the data handle after completion of previously submitted tasks.

void starpu_data_set_wt_mask ( starpu_data_handle_t  handle,
uint32_t  wt_mask 
)

This function sets the write-through mask of a given data (and its children), i.e. a bitmask of nodes where the data should be always replicated after modification. It also prevents the data from being evicted from these nodes when memory gets scarse. When the data is modified, it is automatically transfered into those memory node. For instance a 1<<0 write-through mask means that the CUDA workers will commit their changes in main memory (node 0).

int starpu_data_prefetch_on_node ( starpu_data_handle_t  handle,
unsigned  node,
unsigned  async 
)

Issue a prefetch request for a given data to a given node, i.e. requests that the data be replicated to the given node, so that it is available there for tasks. If the async parameter is 0, the call will block until the transfer is achieved, else the call will return immediately, after having just queued the request. In the latter case, the request will asynchronously wait for the completion of any task writing on the data.

starpu_data_handle_t starpu_data_lookup ( const void *  ptr)

Return the handle corresponding to the data pointed to by the ptr host pointer.

int starpu_data_request_allocation ( starpu_data_handle_t  handle,
unsigned  node 
)

Explicitly ask StarPU to allocate room for a piece of data 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 
)

Query the status of handle on the specified memory_node.

void starpu_data_advise_as_important ( starpu_data_handle_t  handle,
unsigned  is_important 
)

This function allows to specify that a piece of data can be discarded without impacting the application.

void starpu_data_set_reduction_methods ( starpu_data_handle_t  handle,
struct starpu_codelet redux_cl,
struct starpu_codelet init_cl 
)

This sets the codelets to be used for handle when it is accessed in the mode STARPU_REDUX. Per-worker buffers will be initialized with the codelet init_cl, and reduction between per-worker buffers will be done with the codelet redux_cl.

int starpu_data_acquire ( starpu_data_handle_t  handle,
enum starpu_data_access_mode  mode 
)

The application must call this function prior to accessing registered data from main memory outside tasks. StarPU ensures that the application will get an up-to-date copy of the data in main memory located where the data was originally registered, and that all concurrent accesses (e.g. from tasks) will be consistent with the access mode specified in the mode argument. starpu_data_release() must be called once the application does not need to access the piece of data anymore. 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_cb ( starpu_data_handle_t  handle,
enum starpu_data_access_mode  mode,
void(*)(void *)  callback,
void *  arg 
)

Asynchronous equivalent of starpu_data_acquire(). When the data specified in handle is available in the appropriate access mode, the callback function is executed. The application may access the requested data during the execution of this callback. The callback function must call starpu_data_release() once the application does not need to access the piece of data anymore. 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.

void starpu_data_release ( starpu_data_handle_t  handle)

This function releases the piece of data acquired by the application either by starpu_data_acquire() or by starpu_data_acquire_cb().

starpu-1.1.5/doc/doxygen/html/bdwn.png0000644000373600000000000000022312571536757014613 00000000000000PNG  IHDR5ZIDATx DP1lm rj.e D[ɾ|6V3?Ls'(}>+ Kch` ^ލnIENDB`starpu-1.1.5/doc/doxygen/html/BuildingAndInstallingStarPU.html0000644000373600000000000004330512571536760021347 00000000000000 StarPU Handbook: Building and Installing StarPU
Building and Installing StarPU

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:

$ apt-cache search starpu

To install what you need, type:

$ sudo apt-get install libstarpu-1.1 libstarpu-dev

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.

Optional Dependencies

The 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.

If hwloc is not available on your system, the option --without-hwloc should be explicitely given when calling the configure script. If hwloc is installed with a pkg-config file, no option is required, it will be detected automatically, otherwise --with-hwloc should be used to specify the location of hwloc.

Getting Sources

StarPU's sources can be obtained from the download page of the StarPU website.

All releases and the development tree of StarPU are freely available on INRIA's gforge under the LGPL license. Some releases are available under the BSD license.

The latest release can be downloaded from the INRIA's gforge or directly from the StarPU download page.

The latest nightly snapshot can be downloaded from the StarPU gforge website.

$ wget http://starpu.gforge.inria.fr/testing/starpu-nightly-latest.tar.gz

And finally, current development version is also accessible via svn. It should be used only if you need the very latest changes (i.e. less than a day!). Note that the client side of the software Subversion can be obtained from http://subversion.tigris.org. If you are running on Windows, you will probably prefer to use TortoiseSVN.

$ svn checkout svn://scm.gforge.inria.fr/svn/starpu/trunk StarPU

Configuring StarPU

Running autogen.sh is not necessary when using the tarball releases of StarPU. If you are using the source code from the svn repository, you first need to generate the configure scripts and the Makefiles. This requires the availability of autoconf, automake >= 2.60.

$ ./autogen.sh

You then need to configure StarPU. Details about options that are useful to give to ./configure are given in Compilation Configuration.

$ ./configure

If configure does not detect some software or produces errors, please make sure to post the content of 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 to put them all in a separate directory. It is then easier to cleanup, and this allows to compile several configurations out of the same source tree. For that, simply enter the directory where you want the compilation to produce its files, and invoke the configure script located in the StarPU source directory.

$ mkdir build
$ cd build
$ ../configure

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:

$ ../configure --prefix=$HOME/starpu

Building StarPU

$ make

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.

$ make check

Installing StarPU

In order to install StarPU at the location that was specified during configuration:

$ make install

Libtool interface versioning information are included in libraries names (libstarpu-1.1.so, libstarpumpi-1.1.so and libstarpufft-1.1.so).

Setting up Your Own Code

Setting Flags for Compiling, Linking and Running Applications

StarPU provides a pkg-config executable to obtain relevant compiler and linker flags. Compiling and linking an application against StarPU may require to use specific flags or libraries (for instance CUDA or libspe2). To this end, it is possible to use the tool pkg-config.

If StarPU was not installed at some standard location, the path of StarPU's library must be specified in the environment variable PKG_CONFIG_PATH so that pkg-config can find it. For example if StarPU was installed in $prefix_dir:

$ PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$prefix_dir/lib/pkgconfig

The flags required to compile or link against StarPU are then accessible with the following commands:

$ pkg-config --cflags starpu-1.1  # options for the compiler
$ pkg-config --libs starpu-1.1    # options for the linker

Note that it is still 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.1 actually produces some output before going further: PKG_CONFIG_PATH has to point to the place where starpu-1.1.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.

$ LD_LIBRARY_PATH=$prefix_dir/lib:$LD_LIBRARY_PATH

When using a Makefile, the following lines can be added to set the options for the compiler and the linker:

CFLAGS          +=      $$(pkg-config --cflags starpu-1.1)
LDFLAGS         +=      $$(pkg-config --libs starpu-1.1)

Running a Basic StarPU Application

Basic examples using StarPU are built in the directory examples/basic_examples/ (and installed in $prefix_dir/lib/starpu/examples/). You can for example run the example vector_scal.

$ ./examples/basic_examples/vector_scal
BEFORE: First element was 1.000000
AFTER: First element is 3.140000

When StarPU is used for the first time, the directory $STARPU_HOME/.starpu/ is created, performance models will be stored in that directory (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 hwloc is installed. This step is done only once per user and per machine.

Kernel Threads Started by StarPU

StarPU automatically binds one thread per CPU core. It does not use SMT/hyperthreading because kernels are usually already optimized for using a full core, and using hyperthreading would make kernel calibration rather random.

Since driving GPUs is a CPU-consuming task, StarPU dedicates one core per GPU.

While StarPU tasks are executing, the application is not supposed to do computations in the threads it starts itself, tasks should be used instead.

TODO: add a StarPU function to bind an application thread (e.g. the main thread) to a dedicated core (and thus disable the corresponding StarPU CPU worker).

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:

$ ./configure --disable-cuda

or when running applications:

$ STARPU_NCUDA=0 ./application

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:

$ STARPU_NCUDA=2 ./application

Benchmarking StarPU

Some interesting benchmarks are installed among examples in $prefix_dir/lib/starpu/examples/. Make sure to try various schedulers, for instance STARPU_SCHED=dmda.

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. Run tasks_size_overhead.sh, it will generate a plot of the speedup of tasks of various sizes, depending on the number of CPUs being used.

tasks_size_overhead.png

Data Transfer Latency

local_pingpong performs a ping-pong between the first two CUDA nodes, and prints the measured latency.

Matrix-Matrix Multiplication

sgemm and dgemm perform a blocked matrix-matrix multiplication using BLAS and cuBLAS. They output the obtained GFlops.

Cholesky Factorization

cholesky_* perform a Cholesky factorization (single precision). They use different dependency primitives.

LU Factorization

lu_* perform an LU factorization. They use different dependency primitives.

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/ , then configure StarPU with --enable-simgrid and rebuild and install it, and then you can simulate the performance for a couple of virtualized system shipped along StarPU: attila and mirage.

For instance:

$ export STARPU_PERF_MODEL_DIR=$STARPU_PATH/share/starpu/perfmodels/sampling
$ export STARPU_HOSTNAME=attila
$ $STARPU_PATH/lib/starpu/examples/cholesky_implicit

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, and for stencil with block size 128x128x128, 192x192x192, and 256x256x256.

starpu-1.1.5/doc/doxygen/html/dir_6706ebf28963ae455281439ac6e64f4b.html0000644000373600000000000001252212571536763021140 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/mpi/ Directory Reference
mpi Directory Reference

Directories

directory  include
starpu-1.1.5/doc/doxygen/html/group__API__Theoretical__Lower__Bound__on__Execution__Time.html0000644000373600000000000003053212571536763027441 00000000000000 StarPU Handbook: Theoretical Lower Bound on Execution Time
StarPU Handbook
Theoretical Lower Bound on Execution Time

Compute theoretical upper computation efficiency bound corresponding to some actual execution. More...

Functions

void starpu_bound_start (int deps, int prio)
void starpu_bound_stop (void)
void starpu_bound_print_dot (FILE *output)
void starpu_bound_compute (double *res, double *integer_res, int integer)
void starpu_bound_print_lp (FILE *output)
void starpu_bound_print_mps (FILE *output)
void starpu_bound_print (FILE *output, int integer)

Detailed Description

Compute theoretical upper computation efficiency bound corresponding to some actual execution.

Function Documentation

void starpu_bound_start ( int  deps,
int  prio 
)

Start recording tasks (resets stats). deps tells whether dependencies should be recorded too (this is quite expensive)

void starpu_bound_stop ( void  )

Stop recording tasks

void starpu_bound_print_dot ( FILE *  output)

Print the DAG that was recorded

void starpu_bound_compute ( double *  res,
double *  integer_res,
int  integer 
)

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_print_lp ( FILE *  output)

Emit the Linear Programming system on output for the recorded tasks, in the lp format

void starpu_bound_print_mps ( FILE *  output)

Emit the Linear Programming system on output for the recorded tasks, in the mps format

void starpu_bound_print ( FILE *  output,
int  integer 
)

Emit statistics of actual execution vs theoretical upper bound. integer permits to choose between integer solving (which takes a long time but is correct), and relaxed solving (which provides an approximate solution).

starpu-1.1.5/doc/doxygen/html/open.png0000644000373600000000000000017312571536757014626 00000000000000PNG  IHDR BIDATx 0 ׬ՙ\39b!9{|I>$#ߴ8/z/>2[giU,/~\ 9ٸIENDB`starpu-1.1.5/doc/doxygen/html/ftv2ns.png0000644000373600000000000000060412571536757015106 00000000000000PNG  IHDR}\KIDATx1K1 G⁂n lE(nࢋMA@ tK%ܕ ]BI%uͅa,e v祫i\tun0oV\$G.&@Y=%$um6'߫9Q\b)0-ZTH`pcsm 5:>ަI F] jgo[ on Ԭvq?\ 6Tee lQ c3*dWTM\rh61F fIENDB`starpu-1.1.5/doc/doxygen/html/functions_0x66.html0000644000373600000000000002151512571536763016640 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- f -

starpu-1.1.5/doc/doxygen/html/ftv2cl.png0000644000373600000000000000070512571536757015066 00000000000000PNG  IHDR}\IDATx;H#Ao4ႇK ,m vڞJ XY B|drcvoİ 0Ò3ͤe״1X8nQ88֧3*rb-$P1@Z-#011HkK wO@!fuc;sB[EA\>]Pzf| +g5b i5mM_q,cod!,{Y,zT8H]𤕘7/8Q!F~6?Y A@Ũ.@TYr8*>?e[6xIENDB`starpu-1.1.5/doc/doxygen/html/CompilationConfiguration.html0000644000373600000000000006223412571536763021056 00000000000000 StarPU Handbook: Compilation Configuration
Compilation Configuration

The behavior of the StarPU library and tools may be tuned thanks to the following configure options.

Common Configuration

–enable-debug

Enable debugging messages.

–enable-spinlock-check

Enable checking that spinlocks are taken and released properly.

–enable-fast

Disable assertion checks, which saves computation time.

–enable-verbose

Increase the verbosity of the debugging messages. This can be disabled at runtime by setting the environment variable STARPU_SILENT to any value.

$ STARPU_SILENT=1 ./vector_scal

–enable-coverage

Enable flags for the coverage tool gcov.

–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

Enable some exhaustive checks which take a really long time.

–with-hwloc

Specify hwloc should be used by StarPU. hwloc should be found by the means of the tool pkg-config.

–with-hwloc=prefix

Specify hwloc should be used by StarPU. hwloc should be found in the directory specified by prefix

–without-hwloc

Specify hwloc should not be used by StarPU.

–disable-build-doc
Disable the creation of the documentation. This should be done on a machine which does not have the tools doxygen and latex (plus the packages latex-xcolor and texlive-latex-extra).

Additionally, the script configure recognize many variables, which can be listed by typing ./configure –help. For example, ./configure NVCCFLAGS="-arch sm_13" adds a flag for the compilation of CUDA kernels.

Configuring Workers

–enable-maxcpus=count

Use at most count CPU cores. This information is then available as the macro ::STARPU_MAXCPUS.

–disable-cpu

Disable the use of CPUs of the machine. Only GPUs etc. will be used.

–enable-maxcudadev=count

Use at most count CUDA devices. This information is then available as the macro STARPU_MAXCUDADEVS.

–disable-cuda

Disable the use of CUDA, even if a valid CUDA installation was detected.

–with-cuda-dir=prefix

Search for CUDA under prefix, which should notably contain the file include/cuda.h.

–with-cuda-include-dir=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 --with-cuda-dir.

–with-cuda-lib-dir=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 --with-cuda-dir.

–disable-cuda-memcpy-peer

Explicitly disable peer transfers when using CUDA 4.0.

–enable-maxopencldev=count

Use at most count OpenCL devices. This information is then available as the macro STARPU_MAXOPENCLDEVS.

–disable-opencl

Disable the use of OpenCL, even if the SDK is detected.

–with-opencl-dir=prefix

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

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 --with-opencl-dir.

–with-opencl-lib-dir=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 --with-opencl-dir.

–enable-opencl-simulator

Enable considering the provided OpenCL implementation as a simulator, i.e. use the kernel duration returned by OpenCL profiling information as wallclock time instead of the actual measured real time. This requires simgrid support.

–enable-maximplementations=count

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

Allow for at most count scheduling contexts This information is then available as the macro ::STARPU_NMAX_SCHED_CTXS.

–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

Disable asynchronous copies between CPU and CUDA devices.

–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-maxnodes=count

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.

Extension Configuration

–disable-socl

Disable the SOCL extension (SOCL OpenCL Extensions). By default, it is enabled when an OpenCL implementation is found.

–disable-starpu-top

Disable the StarPU-Top interface (StarPU-Top Interface). By default, it is enabled when the required dependencies are found.

–disable-gcc-extensions

Disable the GCC plug-in (C Extensions). By default, it is enabled when the GCC compiler provides a plug-in support.

–with-mpicc=path

Use the compiler mpicc at path, for StarPU-MPI. (MPI Support).

–enable-mpi-progression-hook

Enable the activity polling method for StarPU-MPI.

Advanced Configuration

–enable-perf-debug

Enable performance debugging through gprof.

–enable-model-debug

Enable performance model debugging.

–enable-stats

(see ../../src/datawizard/datastats.c) Enable gathering of various data statistics (Data Statistics).

–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

Enable the use of a data allocation cache to avoid the cost of it with CUDA. Still experimental.

–enable-opengl-render

Enable the use of OpenGL for the rendering of some examples.

–enable-blas-lib

Specify the blas library to be used by some of the examples. The library has to be 'atlas' or 'goto'.

–disable-starpufft

Disable the build of libstarpufft, even if fftw or cuFFT is available.

–enable-starpufft-examples

Enable the compilation and the execution of the libstarpufft examples. By default, they are neither compiled nor checked.

–with-fxt=prefix

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 (Off-line Performance Feedback). prefix should notably contain include/fxt/fxt.h.

–with-perf-model-dir=dir

Store performance models under dir, instead of the current user's home.

–with-goto-dir=prefix

Search for GotoBLAS under prefix, which should notably contain libgoto.so or libgoto2.so.

–with-atlas-dir=prefix

Search for ATLAS under prefix, which should notably contain include/cblas.h.

–with-mkl-cflags=cflags

Use cflags to compile code that uses the MKL library.

–with-mkl-ldflags=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-build-examples

Disable the build of examples.

–enable-sc-hypervisor

Enable the Scheduling Context Hypervisor plugin(Scheduling Context Hypervisor). By default, it is disabled.

–enable-memory-stats

Enable memory statistics (Memory Feedback).

–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:

export SIMGRID_CFLAGS="-I/usr/local/simgrid/include"
export SIMGRID_LIBS="-L/usr/local/simgrid/lib -lsimgrid"

–with-simgrid-dir

Similar to the option --enable-simgrid but also allows to specify the location to the SimGrid library.

–with-simgrid-include-dir

Similar to the option --enable-simgrid but also allows to specify the location to the SimGrid include directory.

–with-simgrid-lib-dir

Similar to the option --enable-simgrid but also allows to specify the location to the SimGrid lib directory.

starpu-1.1.5/doc/doxygen/html/starpu__hash_8h_source.html0000644000373600000000000002612612571536757020512 00000000000000 StarPU Handbook: starpu_hash.h Source File
starpu_hash.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_HASH_H__
19 #define __STARPU_HASH_H__
20 
21 #include <stdint.h>
22 #include <stddef.h>
23 
24 #ifdef __cplusplus
25 extern "C"
26 {
27 #endif
28 
29 uint32_t starpu_hash_crc32c_be_n(const void *input, size_t n, uint32_t inputcrc);
30 
31 uint32_t starpu_hash_crc32c_be(uint32_t input, uint32_t inputcrc);
32 
33 uint32_t starpu_hash_crc32c_string(const char *str, uint32_t inputcrc);
34 
35 #ifdef __cplusplus
36 }
37 #endif
38 
39 #endif /* __STARPU_HASH_H__ */
starpu-1.1.5/doc/doxygen/html/dir_bb90004e93533807685b897580967dda.html0000644000373600000000000001252212571536763020725 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/doc/ Directory Reference
doc Directory Reference

Directories

directory  doxygen
starpu-1.1.5/doc/doxygen/html/starpu__deprecated__api_8h_source.html0000644000373600000000000007220612571536757022657 00000000000000 StarPU Handbook: starpu_deprecated_api.h Source File
starpu_deprecated_api.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2013, 2015 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_DEPRECATED_API_H__
19 #define __STARPU_DEPRECATED_API_H__
20 
21 #ifdef __cplusplus
22 extern "C"
23 {
24 #endif
25 
26 #if defined(STARPU_USE_DEPRECATED_API) || defined(STARPU_USE_DEPRECATED_ONE_ZERO_API)
27 #warning Your application is using deprecated types. You may want to update to use the latest API, by using tools/dev/rename.sh.
28 #endif /* defined(STARPU_USE_DEPRECATED_API) || defined(STARPU_USE_DEPRECATED_ONE_ZERO_API) */
29 
30 #define starpu_permodel_history_based_expected_perf starpu_perfmodel_history_based_expected_perf
31 
32 #ifdef STARPU_USE_DEPRECATED_ONE_ZERO_API
33 
34 #define starpu_allocate_buffer_on_node starpu_malloc_on_node
35 #define starpu_free_buffer_on_node starpu_free_on_node
36 #define starpu_helper_cublas_init starpu_cublas_init
37 #define starpu_helper_cublas_shutdown starpu_cublas_shutdown
38 
39 #define starpu_canonical_block_filter_bcsr starpu_bcsr_filter_canonical_block
40 #define starpu_vertical_block_filter_func_csr starpu_csr_filter_vertical_block
41 
42 #define starpu_block_filter_func starpu_matrix_filter_block
43 #define starpu_block_shadow_filter_func starpu_matrix_filter_block_shadow
44 #define starpu_vertical_block_filter_func starpu_matrix_filter_vertical_block
45 #define starpu_vertical_block_shadow_filter_func starpu_matrix_filter_vertical_block_shadow
46 
47 #define starpu_block_filter_func_vector starpu_vector_filter_block
48 #define starpu_block_shadow_filter_func_vector starpu_vector_filter_block_shadow
49 #define starpu_vector_list_filter_func starpu_vector_filter_list
50 #define starpu_vector_divide_in_2_filter_func starpu_vector_filter_divide_in_2
51 
52 #define starpu_block_filter_func_block starpu_block_filter_block
53 #define starpu_block_shadow_filter_func_block starpu_block_filter_block_shadow
54 #define starpu_vertical_block_filter_func_block starpu_block_filter_vertical_block
55 #define starpu_vertical_block_shadow_filter_func_block starpu_block_filter_vertical_block_shadow
56 #define starpu_depth_block_filter_func_block starpu_block_filter_depth_block
57 #define starpu_depth_block_shadow_filter_func_block starpu_block_filter_depth_block_shadow
58 
59 #define starpu_display_codelet_stats starpu_codelet_display_stats
60 
61 #define starpu_access_mode starpu_data_access_mode
62 #define starpu_buffer_descr starpu_data_descr
63 #define starpu_memory_display_stats starpu_data_display_memory_stats
64 #define starpu_handle_to_pointer starpu_data_handle_to_pointer
65 #define starpu_handle_get_local_ptr starpu_data_get_local_ptr
66 #define starpu_crc32_be_n starpu_hash_crc32c_be_n
67 #define starpu_crc32_be starpu_hash_crc32c_be
68 #define starpu_crc32_string starpu_hash_crc32c_string
69 #define starpu_perf_archtype starpu_perfmodel_archtype
70 #define starpu_history_based_expected_perf starpu_perfmodel_history_based_expected_perf
71 #define starpu_task_profiling_info starpu_profiling_task_info
72 #define starpu_worker_profiling_info starpu_profiling_worker_info
73 #define starpu_bus_profiling_info starpu_profiling_bus_info
74 #define starpu_set_profiling_id starpu_profiling_set_id
75 #define starpu_worker_get_profiling_info starpu_profiling_worker_get_info
76 #define starpu_bus_profiling_helper_display_summary starpu_profiling_bus_helper_display_summary
77 #define starpu_worker_profiling_helper_display_summary starpu_profiling_worker_helper_display_summary
78 #define starpu_archtype starpu_worker_archtype
79 
80 #define starpu_handle_get_interface_id starpu_data_get_interface_id
81 #define starpu_handle_get_size starpu_data_get_size
82 #define starpu_handle_pack_data starpu_data_pack
83 #define starpu_handle_unpack_data starpu_data_unpack
84 
85 #endif /* STARPU_USE_DEPRECATED_ONE_ZERO_API */
86 
87 #ifdef STARPU_USE_DEPRECATED_API
88 typedef starpu_data_handle_t starpu_data_handle;
89 typedef struct starpu_block_interface starpu_block_interface_t;
90 typedef struct starpu_matrix_interface starpu_matrix_interface_t;
91 typedef struct starpu_vector_interface starpu_vector_interface_t;
92 typedef struct starpu_variable_interface starpu_variable_interface_t;
93 typedef struct starpu_csr_interface starpu_csr_interface_t;
94 typedef struct starpu_bcsr_interface starpu_bcsr_interface_t;
95 typedef struct starpu_multiformat_interface starpu_multiformat_interface_t;
96 #define starpu_machine_topology_s starpu_machine_topology
97 #define starpu_htbl32_node_s starpu_htbl32_node
98 #define starpu_history_list_t starpu_history_list
99 #define starpu_buffer_descr_t starpu_buffer_descr
100 #define starpu_regression_model_t starpu_regression_model
101 #define starpu_per_arch_perfmodel_t starpu_per_arch_perfmodel
102 #define starpu_perfmodel_t starpu_perfmodel
103 #define starpu_sched_policy_s starpu_sched_policy
104 #define starpu_data_interface_ops_t starpu_data_interface_ops
105 
106 typedef struct starpu_buffer_descr starpu_buffer_descr;
107 typedef struct starpu_codelet starpu_codelet;
108 typedef struct starpu_codelet starpu_codelet_t;
109 typedef enum starpu_access_mode starpu_access_mode;
110 
111 #define starpu_print_bus_bandwidth starpu_bus_print_bandwidth
112 #define starpu_get_handle_interface_id starpu_handle_get_interface_id
113 #define starpu_get_current_task starpu_task_get_current
114 #define starpu_unpack_cl_args starpu_codelet_unpack_args
115 #define starpu_pack_cl_args starpu_codelet_pack_args
116 #define starpu_task_deinit starpu_task_clean
117 
118 #endif /* STARPU_USE_DEPRECATED_API */
119 
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 #endif /* __STARPU_DEPRECATED_API_H__ */
starpu-1.1.5/doc/doxygen/html/FullSourceCodeVectorScal.html0000644000373600000000000007735012571536763020721 00000000000000 StarPU Handbook: Full source code for the ’Scaling a Vector’ example
Full source code for the ’Scaling a Vector’ example

Main Application

/*
* 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 <starpu.h>
#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 = {
/* CPU implementation of the codelet */
.cpu_funcs = { 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
#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
"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: 0 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, 0, (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 does not need to manipulate the array anymore so we can stop
* monitoring it */
starpu_data_unregister(vector_handle);
#ifdef STARPU_USE_OPENCL
#endif
/* terminate StarPU, no task can be submitted after */
fprintf(stderr, "AFTER First element is %f\n", vector[0]);
return 0;
}

CPU Kernel

#include <starpu.h>
#include <xmmintrin.h>
/* 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];
}
}
}

CUDA Kernel

#include <starpu.h>
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<<<nblocks,threads_per_block, 0, starpu_cuda_get_local_stream()>>>
(n, val, *factor);
cudaStreamSynchronize(starpu_cuda_get_local_stream());
}

OpenCL Kernel

Invoking the Kernel

#include <starpu.h>
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 */
err = starpu_opencl_load_kernel(&kernel, &queue,
"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);
}
{ /* OpenCL specific code */
size_t global=n;
size_t local;
size_t s;
cl_device_id device;
starpu_opencl_get_device(devid, &device);
err = clGetKernelWorkGroupInfo (kernel, device, CL_KERNEL_WORK_GROUP_SIZE,
sizeof(local), &local, &s);
if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
if (local > global) local=global;
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, &local, 0,
NULL, &event);
if (err != CL_SUCCESS) STARPU_OPENCL_REPORT_ERROR(err);
}
{ /* OpenCL specific code */
clFinish(queue);
clReleaseEvent(event);
}
}

Source of the Kernel

__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;
}
}
starpu-1.1.5/doc/doxygen/html/starpu__rand_8h_source.html0000644000373600000000000003677612571536757020527 00000000000000 StarPU Handbook: starpu_rand.h Source File
starpu_rand.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2012, 2013 Centre National de la Recherche Scientifique
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef __STARPU_RAND_H__
18 #define __STARPU_RAND_H__
19 
20 #include <stdlib.h>
21 #include <starpu_config.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
28 #ifdef STARPU_SIMGRID
29 /* In simgrid mode, force using seed 0 by default to get reproducible behavior by default */
30 #define starpu_seed(seed) starpu_get_env_number_default("STARPU_RAND_SEED", 0)
31 #else
32 #define starpu_seed(seed) starpu_get_env_number_default("STARPU_RAND_SEED", (seed))
33 #endif
34 
35 #ifdef STARPU_USE_DRAND48
36 # define starpu_srand48(seed) srand48(starpu_seed(seed))
37 # define starpu_drand48() drand48()
38 # define starpu_erand48(xsubi) erand48(xsubi)
39 # ifdef STARPU_USE_ERAND48_R
40 typedef struct drand48_data starpu_drand48_data;
41 # define starpu_srand48_r(seed, buffer) srand48_r(starpu_seed(seed), buffer)
42 # define starpu_erand48_r(xsubi, buffer, result) erand48_r(xsubi, buffer, result)
43 #else
44 typedef int starpu_drand48_data;
45 # define starpu_srand48_r(seed, buffer) srand48(starpu_seed(seed))
46 # define starpu_erand48_r(xsubi, buffer, result) do {*(result) = erand48(xsubi); } while (0)
47 # endif
48 #else
49 typedef int starpu_drand48_data;
50 # define starpu_srand48(seed) srand(starpu_seed(seed))
51 # define starpu_drand48() (double)(rand()) / RAND_MAX
52 # define starpu_erand48(xsubi) starpu_drand48()
53 # define starpu_srand48_r(seed, buffer) srand(starpu_seed(seed))
54 # define starpu_erand48_r(xsubi, buffer, result) do {*(result) = ((double)(rand()) / RAND_MAX);} while (0)
55 #endif
56 
57 #ifdef __cplusplus
58 }
59 #endif
60 
61 #endif /* __STARPU_RAND_H__ */
starpu-1.1.5/doc/doxygen/html/functions_0x70.html0000644000373600000000000002657712571536763016650 00000000000000 StarPU Handbook: Data Fields
StarPU Handbook
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:

- p -

starpu-1.1.5/doc/doxygen/html/functions_vars_0x6f.html0000644000373600000000000002104312571536763017747 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
 

- o -

starpu-1.1.5/doc/doxygen/html/bc_s.png0000644000373600000000000000125012571536757014570 00000000000000PNG  IHDR /9oIDATxMLANvKPJikR5^ChŃ!Dz *U4VbD1~`8x@^?@јn`JLLئXi v9)}aV&0)(zkNcFP'@KZK%!135}ݏd㰒>hGZ zڗi얺=@OȂ1ӯ3F[dJ`|^3\]'fy@Cos˧d:?$lhn nm\$cL6x@NoPΑՔG>9Q@.qܴ PCt(yQ$hN8 MNj$Őo_sLIENDB`starpu-1.1.5/doc/doxygen/html/sc__hypervisor__monitoring_8h.html0000644000373600000000000002347512571536757022120 00000000000000 StarPU Handbook: sc_hypervisor_monitoring.h File Reference
sc_hypervisor_monitoring.h File Reference
#include <sc_hypervisor.h>

Go to the source code of this file.

Data Structures

struct  sc_hypervisor_resize_ack
struct  sc_hypervisor_wrapper

Functions

struct sc_hypervisor_wrappersc_hypervisor_get_wrapper (unsigned sched_ctx)
unsigned * sc_hypervisor_get_sched_ctxs ()
int sc_hypervisor_get_nsched_ctxs ()
int sc_hypervisor_get_nworkers_ctx (unsigned sched_ctx, enum starpu_worker_archtype arch)
double sc_hypervisor_get_elapsed_flops_per_sched_ctx (struct sc_hypervisor_wrapper *sc_w)
double sc_hypervisor_get_total_elapsed_flops_per_sched_ctx (struct sc_hypervisor_wrapper *sc_w)
double sc_hypervisorsc_hypervisor_get_speed_per_worker_type (struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch)
double sc_hypervisor_get_speed (struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch)

Detailed Description

starpu-1.1.5/doc/doxygen/html/group__API__Standard__Memory__Library.html0000644000373600000000000005321412571536763023323 00000000000000 StarPU Handbook: Standard Memory Library
StarPU Handbook
Standard Memory Library

Macros

#define starpu_data_malloc_pinned_if_possible
#define starpu_data_free_pinned_if_possible
#define STARPU_MALLOC_PINNED
#define STARPU_MALLOC_COUNT

Functions

int starpu_malloc_flags (void **A, size_t dim, int flags)
void starpu_malloc_set_align (size_t align)
int starpu_malloc (void **A, size_t dim)
int starpu_free (void *A)
int starpu_free_flags (void *A, size_t dim, int flags)
int starpu_memory_pin (void *addr, size_t size)
int starpu_memory_unpin (void *addr, size_t size)
starpu_ssize_t starpu_memory_get_total (unsigned node)
starpu_ssize_t starpu_memory_get_available (unsigned node)
void starpu_memory_wait_available (unsigned node, size_t size)

Detailed Description

Macro Definition Documentation

#define starpu_data_malloc_pinned_if_possible
Deprecated:
Equivalent to starpu_malloc(). This macro is provided to avoid breaking old codes.
#define starpu_data_free_pinned_if_possible
Deprecated:
Equivalent to starpu_free(). This macro is provided to avoid breaking old codes.
#define STARPU_MALLOC_PINNED

Value passed to the function starpu_malloc_flags() to indicate the memory allocation should be pinned.

#define STARPU_MALLOC_COUNT

Value passed to the function starpu_malloc_flags() to indicate the memory allocation should be in the limit defined by the environment variables STARPU_LIMIT_CUDA_devid_MEM, STARPU_LIMIT_CUDA_MEM, STARPU_LIMIT_OPENCL_devid_MEM, STARPU_LIMIT_OPENCL_MEM and STARPU_LIMIT_CPU_MEM (see Section How to limit memory per node). 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.

Function Documentation

int starpu_malloc_flags ( void **  A,
size_t  dim,
int  flags 
)

Performs a memory allocation based on the constraints defined by the given flag.

void starpu_malloc_set_align ( size_t  align)

This function sets an alignment constraints for starpu_malloc() allocations. align must be a power of two. This is for instance called automatically by the OpenCL driver to specify its own alignment constraints.

int starpu_malloc ( void **  A,
size_t  dim 
)

This function allocates data of the given size in main memory. 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_free ( void *  A)

This function frees memory which has previously been allocated with starpu_malloc().

int starpu_free_flags ( void *  A,
size_t  dim,
int  flags 
)

This function frees memory by specifying its size. The given flags should be consistent with the ones given to starpu_malloc_flags() when allocating the memory.

int starpu_memory_pin ( void *  addr,
size_t  size 
)

This function pins the given memory area, so that CPU-GPU transfers can be done asynchronously with DMAs. The memory must be unpinned with starpu_memory_unpin() before being freed. Returns 0 on success, -1 on error.

int starpu_memory_unpin ( void *  addr,
size_t  size 
)

This function unpins the given memory area previously pinned with starpu_memory_pin(). Returns 0 on success, -1 on error.

starpu_ssize_t starpu_memory_get_total ( unsigned  node)

If a memory limit is defined on the given node (see Section How to limit memory per node), return the amount of total memory on the node. Otherwise return -1.

starpu_ssize_t starpu_memory_get_available ( unsigned  node)

If a memory limit is defined on the given node (see Section How to limit memory per node), return the amount of available memory on the node. Otherwise return -1.

void starpu_memory_wait_available ( unsigned  node,
size_t  size 
)

node (see Section How to limit memory per node), this will wait for size bytes to become available on 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.

starpu-1.1.5/doc/doxygen/html/nav_h.png0000644000373600000000000000014212571536757014754 00000000000000PNG  IHDR ,@)IDATxA @BQۛТ) ) aܿoRlIENDB`starpu-1.1.5/doc/doxygen/html/sc__hypervisor__config_8h.html0000644000373600000000000003004712571536757021171 00000000000000 StarPU Handbook: sc_hypervisor_config.h File Reference
sc_hypervisor_config.h File Reference
#include <sc_hypervisor.h>

Go to the source code of this file.

Data Structures

struct  sc_hypervisor_policy_config

Macros

#define SC_HYPERVISOR_MAX_IDLE
#define SC_HYPERVISOR_MIN_WORKING
#define SC_HYPERVISOR_PRIORITY
#define SC_HYPERVISOR_MIN_WORKERS
#define SC_HYPERVISOR_MAX_WORKERS
#define SC_HYPERVISOR_GRANULARITY
#define SC_HYPERVISOR_FIXED_WORKERS
#define SC_HYPERVISOR_MIN_TASKS
#define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE
#define SC_HYPERVISOR_TIME_TO_APPLY
#define SC_HYPERVISOR_NULL
#define SC_HYPERVISOR_ISPEED_W_SAMPLE
#define SC_HYPERVISOR_ISPEED_CTX_SAMPLE
#define SC_HYPERVISOR_TIME_SAMPLE
#define MAX_IDLE_TIME
#define MIN_WORKING_TIME

Functions

void sc_hypervisor_set_config (unsigned sched_ctx, void *config)
struct
sc_hypervisor_policy_config
sc_hypervisor_get_config (unsigned sched_ctx)
void sc_hypervisor_ctl (unsigned sched_ctx,...)

Detailed Description

starpu-1.1.5/doc/doxygen/html/sc__hypervisor__config_8h_source.html0000644000373600000000000005732012571536757022554 00000000000000 StarPU Handbook: sc_hypervisor_config.h Source File
sc_hypervisor_config.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2011 - 2013 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef SC_HYPERVISOR_CONFIG_H
18 #define SC_HYPERVISOR_CONFIG_H
19 
20 #include <sc_hypervisor.h>
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
27 /* ctl properties*/
28 #define SC_HYPERVISOR_MAX_IDLE -1
29 #define SC_HYPERVISOR_MIN_WORKING -2
30 #define SC_HYPERVISOR_PRIORITY -3
31 #define SC_HYPERVISOR_MIN_WORKERS -4
32 #define SC_HYPERVISOR_MAX_WORKERS -5
33 #define SC_HYPERVISOR_GRANULARITY -6
34 #define SC_HYPERVISOR_FIXED_WORKERS -7
35 #define SC_HYPERVISOR_MIN_TASKS -8
36 #define SC_HYPERVISOR_NEW_WORKERS_MAX_IDLE -9
37 #define SC_HYPERVISOR_TIME_TO_APPLY -10
38 #define SC_HYPERVISOR_NULL -11
39 #define SC_HYPERVISOR_ISPEED_W_SAMPLE -12
40 #define SC_HYPERVISOR_ISPEED_CTX_SAMPLE -13
41 #define SC_HYPERVISOR_TIME_SAMPLE -14
42 
43 
44 #define MAX_IDLE_TIME 5000000000
45 #define MIN_WORKING_TIME 500
46 
48 {
49  /* underneath this limit we cannot resize */
51 
52  /* above this limit we cannot resize */
54 
55  /*resize granularity */
57 
58  /* priority for a worker to stay in this context */
59  /* the smaller the priority the faster it will be moved */
60  /* to another context */
62 
63  /* above this limit the priority of the worker is reduced */
65 
66  /* underneath this limit the priority of the worker is reduced */
68 
69  /* workers that will not move */
71 
72  /* max idle for the workers that will be added during the resizing process*/
74 
75  /* sample used to compute the instant speed per worker*/
77 
78  /* sample used to compute the instant speed per ctx*/
80 
81  /* sample used to compute the instant speed per ctx (in seconds)*/
82  double time_sample;
83 };
84 
85 /* set a certain configuration to a context */
86 void sc_hypervisor_set_config(unsigned sched_ctx, void *config);
87 
88 /* check out the configuration of a context */
89 struct sc_hypervisor_policy_config *sc_hypervisor_get_config(unsigned sched_ctx);
90 
91 /* impose different parameters to a configuration of a context */
92 void sc_hypervisor_ctl(unsigned sched_ctx, ...);
93 
94 #ifdef __cplusplus
95 }
96 #endif
97 
98 #endif
starpu-1.1.5/doc/doxygen/html/closed.png0000644000373600000000000000020412571536757015131 00000000000000PNG  IHDR KIDATxm @!Gk7-`&sts@k}2 P%_N .:0Dk›x" ֛)x5IENDB`starpu-1.1.5/doc/doxygen/html/starpu__top_8h_source.html0000644000373600000000000010711012571536757020362 00000000000000 StarPU Handbook: starpu_top.h Source File
starpu_top.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2011 William Braik, Yann Courtois, Jean-Marie Couteyen, Anthony
4  * Roy
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_TOP_H__
19 #define __STARPU_TOP_H__
20 
21 #include <starpu.h>
22 #include <stdlib.h>
23 #include <time.h>
24 
25 #ifdef __cplusplus
26 extern "C"
27 {
28 #endif
29 
31 {
35 };
36 
38 {
39  unsigned int id;
40  const char *name;
45  int active;
48 };
49 
51 {
56 };
57 
59 {
60  unsigned int id;
61  const char *name;
63  void *value;
64  char **enum_values;
65  int nb_values;
66  void (*callback)(struct starpu_top_param*);
72 };
73 
75 {
83 };
84 
85 struct starpu_top_data *starpu_top_add_data_boolean(const char *data_name, int active);
86 struct starpu_top_data *starpu_top_add_data_integer(const char *data_name, int minimum_value, int maximum_value, int active);
87 struct starpu_top_data *starpu_top_add_data_float(const char *data_name, double minimum_value, double maximum_value, int active);
88 
89 struct starpu_top_param *starpu_top_register_parameter_boolean(const char *param_name, int *parameter_field, void (*callback)(struct starpu_top_param*));
90 struct starpu_top_param *starpu_top_register_parameter_integer(const char *param_name, int *parameter_field, int minimum_value, int maximum_value, void (*callback)(struct starpu_top_param*));
91 struct starpu_top_param *starpu_top_register_parameter_float(const char *param_name, double *parameter_field, double minimum_value, double maximum_value, void (*callback)(struct starpu_top_param*));
92 struct starpu_top_param *starpu_top_register_parameter_enum(const char *param_name, int *parameter_field, char **values, int nb_values, void (*callback)(struct starpu_top_param*));
93 
94 void starpu_top_init_and_wait(const char *server_name);
95 
96 void starpu_top_update_parameter(const struct starpu_top_param *param);
97 void starpu_top_update_data_boolean(const struct starpu_top_data *data, int value);
98 void starpu_top_update_data_integer(const struct starpu_top_data *data, int value);
99 void starpu_top_update_data_float(const struct starpu_top_data *data, double value);
100 void starpu_top_task_prevision(struct starpu_task *task, int devid, unsigned long long start, unsigned long long end);
101 
102 void starpu_top_debug_log(const char *message);
103 void starpu_top_debug_lock(const char *message);
104 
105 
106 #ifdef __cplusplus
107 }
108 #endif
109 
110 #endif /* __STARPU_TOP_H__ */
111 
starpu-1.1.5/doc/doxygen/html/sc__hypervisor__policy_8h.html0000644000373600000000000004624212571536757021227 00000000000000 StarPU Handbook: sc_hypervisor_policy.h File Reference
sc_hypervisor_policy.h File Reference
#include <sc_hypervisor.h>

Go to the source code of this file.

Data Structures

struct  types_of_workers
struct  sc_hypervisor_policy_task_pool

Macros

#define HYPERVISOR_REDIM_SAMPLE
#define HYPERVISOR_START_REDIM_SAMPLE
#define SC_NOTHING
#define SC_IDLE
#define SC_SPEED

Functions

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)
void sc_hypervisor_policy_remove_task_from_pool (struct starpu_task *task, uint32_t footprint, struct sc_hypervisor_policy_task_pool **task_pools)
struct
sc_hypervisor_policy_task_pool
sc_hypervisor_policy_clone_task_pool (struct sc_hypervisor_policy_task_pool *tp)
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)
unsigned sc_hypervisor_find_lowest_prio_sched_ctx (unsigned req_sched_ctx, int nworkers_to_move)
int * sc_hypervisor_get_idlest_workers (unsigned sched_ctx, int *nworkers, enum starpu_worker_archtype arch)
int * sc_hypervisor_get_idlest_workers_in_list (int *start, int *workers, int nall_workers, int *nworkers, enum starpu_worker_archtype arch)
int sc_hypervisor_get_movable_nworkers (struct sc_hypervisor_policy_config *config, unsigned sched_ctx, enum starpu_worker_archtype arch)
int sc_hypervisor_compute_nworkers_to_move (unsigned req_sched_ctx)
unsigned sc_hypervisor_policy_resize (unsigned sender_sched_ctx, unsigned receiver_sched_ctx, unsigned force_resize, unsigned now)
unsigned sc_hypervisor_policy_resize_to_unknown_receiver (unsigned sender_sched_ctx, unsigned now)
double sc_hypervisor_get_ctx_speed (struct sc_hypervisor_wrapper *sc_w)
double sc_hypervisor_get_slowest_ctx_exec_time (void)
double sc_hypervisor_get_fastest_ctx_exec_time (void)
double sc_hypervisor_get_speed_per_worker (struct sc_hypervisor_wrapper *sc_w, unsigned worker)
double sc_hypervisor_get_speed_per_worker_type (struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch)
double sc_hypervisor_get_ref_speed_per_worker_type (struct sc_hypervisor_wrapper *sc_w, enum starpu_worker_archtype arch)
void sc_hypervisor_group_workers_by_type (struct types_of_workers *tw, int *total_nw)
enum starpu_worker_archtype sc_hypervisor_get_arch_for_index (unsigned w, struct types_of_workers *tw)
unsigned sc_hypervisor_get_index_for_arch (enum starpu_worker_archtype arch, struct types_of_workers *tw)
unsigned sc_hypervisor_criteria_fulfilled (unsigned sched_ctx, int worker)
unsigned sc_hypervisor_check_idle (unsigned sched_ctx, int worker)
unsigned sc_hypervisor_check_speed_gap_btw_ctxs (void)
unsigned sc_hypervisor_get_resize_criteria ()
struct types_of_workerssc_hypervisor_get_types_of_workers (int *workers, unsigned nworkers)

Detailed Description


Data Structure Documentation

struct types_of_workers
Data Fields
unsigned ncpus
unsigned ncuda
unsigned nw
starpu-1.1.5/doc/doxygen/html/starpu__fxt_8h.html0000644000373600000000000002025012571536757017000 00000000000000 StarPU Handbook: starpu_fxt.h File Reference
starpu_fxt.h File Reference
#include <starpu_perfmodel.h>

Go to the source code of this file.

Data Structures

struct  starpu_fxt_codelet_event
struct  starpu_fxt_options

Macros

#define STARPU_FXT_MAX_FILES

Functions

void starpu_fxt_options_init (struct starpu_fxt_options *options)
void starpu_fxt_generate_trace (struct starpu_fxt_options *options)
void starpu_fxt_start_profiling (void)
void starpu_fxt_stop_profiling (void)

Detailed Description

starpu-1.1.5/doc/doxygen/html/dir_0543914dcc518140effd536bd92de93e.html0000644000373600000000000001263612571536763021273 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/starpufft/include/ Directory Reference
include Directory Reference

Files

file  starpufft.h [code]
starpu-1.1.5/doc/doxygen/html/ftv2lastnode.png0000644000373600000000000000012612571536757016276 00000000000000PNG  IHDRɪ|IDATxݱðScOx@ y}IENDB`starpu-1.1.5/doc/doxygen/html/group__API__Data__Interfaces.html0000644000373600000000000056463012571536763021435 00000000000000 StarPU Handbook: Data Interfaces
StarPU Handbook
Data Interfaces

Data Structures

struct  starpu_data_interface_ops
struct  starpu_data_copy_methods
struct  starpu_variable_interface
struct  starpu_vector_interface
struct  starpu_matrix_interface
struct  starpu_block_interface
struct  starpu_bcsr_interface
struct  starpu_csr_interface
struct  starpu_coo_interface

Enumerations

enum  starpu_data_interface_id {
  STARPU_UNKNOWN_INTERFACE_ID, STARPU_MATRIX_INTERFACE_ID, STARPU_BLOCK_INTERFACE_ID, STARPU_VECTOR_INTERFACE_ID,
  STARPU_CSR_INTERFACE_ID, STARPU_BCSR_INTERFACE_ID, STARPU_VARIABLE_INTERFACE_ID, STARPU_VOID_INTERFACE_ID,
  STARPU_MULTIFORMAT_INTERFACE_ID, STARPU_COO_INTERFACE_ID, STARPU_MAX_INTERFACE_ID
}

Registering Data

There are several ways to register a memory region so that it can be managed by StarPU. The functions below allow the registration of vectors, 2D matrices, 3D matrices as well as BCSR and CSR sparse matrices.

void starpu_void_data_register (starpu_data_handle_t *handle)
void starpu_variable_data_register (starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, size_t size)
void starpu_vector_data_register (starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, uint32_t nx, size_t elemsize)
void starpu_vector_ptr_register (starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset)
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)
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)
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)
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)
void starpu_bcsr_data_register (starpu_data_handle_t *handle, unsigned 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)
void starpu_csr_data_register (starpu_data_handle_t *handle, unsigned home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, size_t elemsize)
void starpu_coo_data_register (starpu_data_handle_t *handleptr, unsigned home_node, uint32_t nx, uint32_t ny, uint32_t n_values, uint32_t *columns, uint32_t *rows, uintptr_t values, size_t elemsize)
void * starpu_data_get_interface_on_node (starpu_data_handle_t handle, unsigned memory_node)

Accessing Data Interfaces

Each data interface is provided with a set of field access functions. The ones using a void * parameter aimed to be used in codelet implementations (see for example the code in Vector Scaling Using StarPU's API).

void * starpu_data_handle_to_pointer (starpu_data_handle_t handle, unsigned node)
void * starpu_data_get_local_ptr (starpu_data_handle_t handle)
enum starpu_data_interface_id starpu_data_get_interface_id (starpu_data_handle_t handle)
size_t starpu_data_get_size (starpu_data_handle_t handle)
int starpu_data_pack (starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count)
int starpu_data_unpack (starpu_data_handle_t handle, void *ptr, size_t count)

Accessing Variable Data Interfaces

#define STARPU_VARIABLE_GET_PTR(interface)
#define STARPU_VARIABLE_GET_ELEMSIZE(interface)
#define STARPU_VARIABLE_GET_DEV_HANDLE(interface)
#define STARPU_VARIABLE_GET_OFFSET
size_t starpu_variable_get_elemsize (starpu_data_handle_t handle)
uintptr_t starpu_variable_get_local_ptr (starpu_data_handle_t handle)

Accessing Vector Data Interfaces

#define STARPU_VECTOR_GET_PTR(interface)
#define STARPU_VECTOR_GET_DEV_HANDLE(interface)
#define STARPU_VECTOR_GET_OFFSET(interface)
#define STARPU_VECTOR_GET_NX(interface)
#define STARPU_VECTOR_GET_ELEMSIZE(interface)
uint32_t starpu_vector_get_nx (starpu_data_handle_t handle)
size_t starpu_vector_get_elemsize (starpu_data_handle_t handle)
uintptr_t starpu_vector_get_local_ptr (starpu_data_handle_t handle)

Accessing Matrix Data Interfaces

#define STARPU_MATRIX_GET_PTR(interface)
#define STARPU_MATRIX_GET_DEV_HANDLE(interface)
#define STARPU_MATRIX_GET_OFFSET(interface)
#define STARPU_MATRIX_GET_NX(interface)
#define STARPU_MATRIX_GET_NY(interface)
#define STARPU_MATRIX_GET_LD(interface)
#define STARPU_MATRIX_GET_ELEMSIZE(interface)
uint32_t starpu_matrix_get_nx (starpu_data_handle_t handle)
uint32_t starpu_matrix_get_ny (starpu_data_handle_t handle)
uint32_t starpu_matrix_get_local_ld (starpu_data_handle_t handle)
uintptr_t starpu_matrix_get_local_ptr (starpu_data_handle_t handle)
size_t starpu_matrix_get_elemsize (starpu_data_handle_t handle)

Accessing Block Data Interfaces

#define STARPU_BLOCK_GET_PTR(interface)
#define STARPU_BLOCK_GET_DEV_HANDLE(interface)
#define STARPU_BLOCK_GET_OFFSET(interface)
#define STARPU_BLOCK_GET_NX(interface)
#define STARPU_BLOCK_GET_NY(interface)
#define STARPU_BLOCK_GET_NZ(interface)
#define STARPU_BLOCK_GET_LDY(interface)
#define STARPU_BLOCK_GET_LDZ(interface)
#define STARPU_BLOCK_GET_ELEMSIZE(interface)
uint32_t starpu_block_get_nx (starpu_data_handle_t handle)
uint32_t starpu_block_get_ny (starpu_data_handle_t handle)
uint32_t starpu_block_get_nz (starpu_data_handle_t handle)
uint32_t starpu_block_get_local_ldy (starpu_data_handle_t handle)
uint32_t starpu_block_get_local_ldz (starpu_data_handle_t handle)
uintptr_t starpu_block_get_local_ptr (starpu_data_handle_t handle)
size_t starpu_block_get_elemsize (starpu_data_handle_t handle)

Accessing BCSR Data Interfaces

#define STARPU_BCSR_GET_NNZ(interface)
#define STARPU_BCSR_GET_NZVAL(interface)
#define STARPU_BCSR_GET_NZVAL_DEV_HANDLE(interface)
#define STARPU_BCSR_GET_COLIND(interface)
#define STARPU_BCSR_GET_COLIND_DEV_HANDLE(interface)
#define STARPU_BCSR_GET_ROWPTR(interface)
#define STARPU_BCSR_GET_ROWPTR_DEV_HANDLE(interface)
#define STARPU_BCSR_GET_OFFSET
uint32_t starpu_bcsr_get_nnz (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_nrow (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_firstentry (starpu_data_handle_t handle)
uintptr_t starpu_bcsr_get_local_nzval (starpu_data_handle_t handle)
uint32_t * starpu_bcsr_get_local_colind (starpu_data_handle_t handle)
uint32_t * starpu_bcsr_get_local_rowptr (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_r (starpu_data_handle_t handle)
uint32_t starpu_bcsr_get_c (starpu_data_handle_t handle)
size_t starpu_bcsr_get_elemsize (starpu_data_handle_t handle)

Accessing CSR Data Interfaces

#define STARPU_CSR_GET_NNZ(interface)
#define STARPU_CSR_GET_NROW(interface)
#define STARPU_CSR_GET_NZVAL(interface)
#define STARPU_CSR_GET_NZVAL_DEV_HANDLE(interface)
#define STARPU_CSR_GET_COLIND(interface)
#define STARPU_CSR_GET_COLIND_DEV_HANDLE(interface)
#define STARPU_CSR_GET_ROWPTR(interface)
#define STARPU_CSR_GET_ROWPTR_DEV_HANDLE(interface)
#define STARPU_CSR_GET_OFFSET
#define STARPU_CSR_GET_FIRSTENTRY(interface)
#define STARPU_CSR_GET_ELEMSIZE(interface)
uint32_t starpu_csr_get_nnz (starpu_data_handle_t handle)
uint32_t starpu_csr_get_nrow (starpu_data_handle_t handle)
uint32_t starpu_csr_get_firstentry (starpu_data_handle_t handle)
uintptr_t starpu_csr_get_local_nzval (starpu_data_handle_t handle)
uint32_t * starpu_csr_get_local_colind (starpu_data_handle_t handle)
uint32_t * starpu_csr_get_local_rowptr (starpu_data_handle_t handle)
size_t starpu_csr_get_elemsize (starpu_data_handle_t handle)

Accessing COO Data Interfaces

#define STARPU_COO_GET_COLUMNS(interface)
#define STARPU_COO_GET_COLUMNS_DEV_HANDLE(interface)
#define STARPU_COO_GET_ROWS(interface)
#define STARPU_COO_GET_ROWS_DEV_HANDLE(interface)
#define STARPU_COO_GET_VALUES(interface)
#define STARPU_COO_GET_VALUES_DEV_HANDLE(interface)
#define STARPU_COO_GET_OFFSET
#define STARPU_COO_GET_NX(interface)
#define STARPU_COO_GET_NY(interface)
#define STARPU_COO_GET_NVALUES(interface)
#define STARPU_COO_GET_ELEMSIZE(interface)

Defining Interface

Applications can provide their own interface as shown in Defining A New Data Interface.

uintptr_t starpu_malloc_on_node (unsigned dst_node, size_t size)
void starpu_free_on_node (unsigned dst_node, uintptr_t addr, size_t size)
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)
uint32_t starpu_hash_crc32c_be_n (const void *input, size_t n, uint32_t inputcrc)
uint32_t starpu_hash_crc32c_be (uint32_t input, uint32_t inputcrc)
uint32_t starpu_hash_crc32c_string (const char *str, uint32_t inputcrc)
int starpu_data_interface_get_next_id (void)

Detailed Description


Data Structure Documentation

struct starpu_data_interface_ops

Per-interface data transfer methods.

Data Fields

void(* register_data_handle )(starpu_data_handle_t handle, unsigned home_node, void *data_interface)
starpu_ssize_t(* allocate_data_on_node )(void *data_interface, unsigned node)
void(* free_data_on_node )(void *data_interface, unsigned node)
struct starpu_data_copy_methodscopy_methods
void *(* handle_to_pointer )(starpu_data_handle_t handle, unsigned node)
size_t(* get_size )(starpu_data_handle_t handle)
uint32_t(* footprint )(starpu_data_handle_t handle)
int(* compare )(void *data_interface_a, void *data_interface_b)
void(* display )(starpu_data_handle_t handle, FILE *f)
enum starpu_data_interface_id interfaceid
size_t interface_size
int is_multiformat
struct
starpu_multiformat_data_interface_ops *(* 
get_mf_ops )(void *data_interface)
int(* pack_data )(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count)
int(* unpack_data )(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count)

Field Documentation

starpu_data_interface_ops::register_data_handle

Register an existing interface into a data handle.

starpu_data_interface_ops::allocate_data_on_node

Allocate data for the interface on a given node.

starpu_data_interface_ops::free_data_on_node

Free data of the interface on a given node.

starpu_data_interface_ops::copy_methods

ram/cuda/opencl synchronous and asynchronous transfer methods.

starpu_data_interface_ops::handle_to_pointer

Return the current pointer (if any) for the handle on the given node.

starpu_data_interface_ops::get_size

Return an estimation of the size of data, for performance models.

starpu_data_interface_ops::footprint

Return a 32bit footprint which characterizes the data size.

starpu_data_interface_ops::compare

Compare the data size of two interfaces.

starpu_data_interface_ops::display

Dump the sizes of a handle to a file.

starpu_data_interface_ops::interfaceid

An identifier that is unique to each interface.

starpu_data_interface_ops::interface_size

The size of the interface data descriptor.

starpu_data_interface_ops::is_multiformat

todo

starpu_data_interface_ops::get_mf_ops
read

todo

starpu_data_interface_ops::pack_data

Pack the data handle into a contiguous buffer at the address ptr and set the size of the newly created buffer in count. If ptr is NULL, the function should not copy the data in the buffer but just set count to the size of the buffer which would have been allocated. The special value -1 indicates the size is yet unknown.

starpu_data_interface_ops::unpack_data

Unpack the data handle from the contiguous buffer at the address ptr of size count

struct starpu_data_copy_methods

Defines the per-interface methods. If the any_to_any method is provided, it will be used by default if no more specific method is provided. It can still be useful to provide more specific method in case of e.g. available particular CUDA or OpenCL support.

Data Fields

int(* can_copy )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_node)
int(* ram_to_ram )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* ram_to_cuda )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* ram_to_opencl )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* cuda_to_ram )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* cuda_to_cuda )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* cuda_to_opencl )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* opencl_to_ram )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* opencl_to_cuda )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* opencl_to_opencl )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node)
int(* ram_to_cuda_async )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream)
int(* cuda_to_ram_async )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream)
int(* cuda_to_cuda_async )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream)
int(* ram_to_opencl_async )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event)
int(* opencl_to_ram_async )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event)
int(* opencl_to_opencl_async )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event)
int(* any_to_any )(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data)

Field Documentation

starpu_data_copy_methods::can_copy

If defined, allows the interface to declare whether it supports transferring from src_interface on node src_node to dst_interface on node dst_node, run from node handling_node. If not defined, it is assumed that the interface supports all transfers.

starpu_data_copy_methods::ram_to_ram

Define how to copy data from the src_interface interface on the src_node CPU node to the dst_interface interface on the dst_node CPU node. Return 0 on success.

starpu_data_copy_methods::ram_to_cuda

Define how to copy data from the src_interface interface on the src_node CPU node to the dst_interface interface on the dst_node CUDA node. Return 0 on success.

starpu_data_copy_methods::ram_to_opencl

Define how to copy data from the src_interface interface on the src_node CPU node to the dst_interface interface on the dst_node OpenCL node. Return 0 on success.

starpu_data_copy_methods::cuda_to_ram

Define how to copy data from the src_interface interface on the src_node CUDA node to the dst_interface interface on the dst_node CPU node. Return 0 on success.

starpu_data_copy_methods::cuda_to_cuda

Define how to copy data from the src_interface interface on the src_node CUDA node to the dst_interface interface on the dst_node CUDA node. Return 0 on success.

starpu_data_copy_methods::cuda_to_opencl

Define how to copy data from the src_interface interface on the src_node CUDA node to the dst_interface interface on the dst_node OpenCL node. Return 0 on success.

starpu_data_copy_methods::opencl_to_ram

Define how to copy data from the src_interface interface on the src_node OpenCL node to the dst_interface interface on the dst_node CPU node. Return 0 on success.

starpu_data_copy_methods::opencl_to_cuda

Define how to copy data from the src_interface interface on the src_node OpenCL node to the dst_interface interface on the dst_node CUDA node. Return 0 on success.

starpu_data_copy_methods::opencl_to_opencl

Define how to copy data from the src_interface interface on the src_node OpenCL node to the dst_interface interface on the dst_node OpenCL node. Return 0 on success.

starpu_data_copy_methods::ram_to_cuda_async

Define how to copy data from the src_interface interface on the src_node CPU node to the dst_interface interface on the 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.

starpu_data_copy_methods::cuda_to_ram_async

Define how to copy data from the src_interface interface on the src_node CUDA node to the dst_interface interface on the 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.

starpu_data_copy_methods::cuda_to_cuda_async

Define how to copy data from the src_interface interface on the src_node CUDA node to the dst_interface interface on the 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.

starpu_data_copy_methods::ram_to_opencl_async

Define how to copy data from the src_interface interface on the src_node CPU node to the dst_interface interface on the dst_node OpenCL node, by recording in event, a pointer to a cl_event, the event of the last submitted transfer. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core.

starpu_data_copy_methods::opencl_to_ram_async

Define how to copy data from the src_interface interface on the src_node OpenCL node to the dst_interface interface on the dst_node CPU node, by recording in event, a pointer to a cl_event, the event of the last submitted transfer. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core.

starpu_data_copy_methods::opencl_to_opencl_async

Define how to copy data from the src_interface interface on the src_node OpenCL node to the dst_interface interface on the dst_node OpenCL node, by recording in event, a pointer to a cl_event, the event of the last submitted transfer. Must return 0 if the transfer was actually completed completely synchronously, or -EAGAIN if at least some transfers are still ongoing and should be awaited for by the core.

starpu_data_copy_methods::any_to_any

Define how to copy data from the src_interface interface on the src_node node to the dst_interface interface on the 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.

struct starpu_variable_interface

Variable interface for a single data (not a vector, a matrix, a list, ...)

Data Fields
uintptr_t ptr local pointer of the variable
size_t elemsize size of the variable
struct starpu_vector_interface

Vector interface

vector interface for contiguous (non-strided) buffers

Data Fields
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
struct starpu_matrix_interface

Matrix interface for dense matrices

Data Fields
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
struct starpu_block_interface

Block interface for 3D dense blocks

Data Fields
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.
struct starpu_bcsr_interface

BCSR interface for sparse matrices (blocked compressed sparse row representation)

Data Fields
uint32_t nnz number of non-zero BLOCKS
uint32_t nrow number of rows (in terms of BLOCKS)
uintptr_t nzval non-zero values
uint32_t * colind position of non-zero entried 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.
uint32_t r size of the blocks
uint32_t c size of the blocks
size_t elemsize size of the elements of the matrix
struct starpu_csr_interface

CSR interface for sparse matrices (compressed sparse row representation)

Data Fields
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
struct starpu_coo_interface

COO Matrices

Data Fields
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

Macro Definition Documentation

#define STARPU_VARIABLE_GET_PTR (   interface)

Return a pointer to the variable designated by interface.

#define STARPU_VARIABLE_GET_ELEMSIZE (   interface)

Return the size of the variable designated by interface.

#define STARPU_VARIABLE_GET_DEV_HANDLE (   interface)

Return a device handle for the variable designated by interface, to be used on OpenCL. The offset documented below has to be used in addition to this.

#define STARPU_VARIABLE_GET_OFFSET

Return the offset in the variable designated by interface, to be used with the device handle.

#define STARPU_VECTOR_GET_PTR (   interface)

Return a pointer to the array designated by interface, valid on CPUs and CUDA only. For OpenCL, the device handle and offset need to be used instead.

#define STARPU_VECTOR_GET_DEV_HANDLE (   interface)

Return a device handle for the array designated by interface, to be used on OpenCL. the offset documented below has to be used in addition to this.

#define STARPU_VECTOR_GET_OFFSET (   interface)

Return the offset in the array designated by interface, to be used with the device handle.

#define STARPU_VECTOR_GET_NX (   interface)

Return the number of elements registered into the array designated by interface.

#define STARPU_VECTOR_GET_ELEMSIZE (   interface)

Return the size of each element of the array designated by interface.

#define STARPU_MATRIX_GET_PTR (   interface)

Return a pointer to the matrix designated by 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_DEV_HANDLE (   interface)

Return a device handle for the matrix designated by interface, to be used on OpenCL. The offset documented below has to be used in addition to this.

#define STARPU_MATRIX_GET_OFFSET (   interface)

Return the offset in the matrix designated by interface, to be used with the device handle.

#define STARPU_MATRIX_GET_NX (   interface)

Return the number of elements on the x-axis of the matrix designated by interface.

#define STARPU_MATRIX_GET_NY (   interface)

Return the number of elements on the y-axis of the matrix designated by interface.

#define STARPU_MATRIX_GET_LD (   interface)

Return the number of elements between each row of the matrix designated by interface. May be equal to nx when there is no padding.

#define STARPU_MATRIX_GET_ELEMSIZE (   interface)

Return the size of the elements registered into the matrix designated by interface.

#define STARPU_BLOCK_GET_PTR (   interface)

Return a pointer to the block designated by interface.

#define STARPU_BLOCK_GET_DEV_HANDLE (   interface)

Return a device handle for the block designated by interface, to be used on OpenCL. The offset document below has to be used in addition to this.

#define STARPU_BLOCK_GET_OFFSET (   interface)

Return the offset in the block designated by interface, to be used with the device handle.

#define STARPU_BLOCK_GET_NX (   interface)

Return the number of elements on the x-axis of the block designated by interface.

#define STARPU_BLOCK_GET_NY (   interface)

Return the number of elements on the y-axis of the block designated by interface.

#define STARPU_BLOCK_GET_NZ (   interface)

Return the number of elements on the z-axis of the block designated by interface.

#define STARPU_BLOCK_GET_LDY (   interface)

Return the number of elements between each row of the block designated by interface. May be equal to nx when there is no padding.

#define STARPU_BLOCK_GET_LDZ (   interface)

Return the number of elements between each z plane of the block designated by interface. May be equal to nx*ny when there is no padding.

#define STARPU_BLOCK_GET_ELEMSIZE (   interface)

Return the size of the elements of the block designated by interface.

#define STARPU_BCSR_GET_NNZ (   interface)

Return the number of non-zero values in the matrix designated by interface.

#define STARPU_BCSR_GET_NZVAL (   interface)

Return a pointer to the non-zero values of the matrix designated by interface.

#define STARPU_BCSR_GET_NZVAL_DEV_HANDLE (   interface)

Return a device handle for the array of non-zero values in the matrix designated by interface. The offset documented below has to be used in addition to this.

#define STARPU_BCSR_GET_COLIND (   interface)

Return a pointer to the column index of the matrix designated by interface.

#define STARPU_BCSR_GET_COLIND_DEV_HANDLE (   interface)

Return a device handle for the column index of the matrix designated by interface. The offset documented below has to be used in addition to this.

#define STARPU_BCSR_GET_ROWPTR (   interface)

Return a pointer to the row pointer array of the matrix designated by interface.

#define STARPU_BCSR_GET_ROWPTR_DEV_HANDLE (   interface)

Return a device handle for the row pointer array of the matrix designated by interface. The offset documented below has to be used in addition to this.

#define STARPU_BCSR_GET_OFFSET

Return the offset in the arrays (coling, rowptr, nzval) of the matrix designated by interface, to be used with the device handles.

#define STARPU_CSR_GET_NNZ (   interface)

Return the number of non-zero values in the matrix designated by interface.

#define STARPU_CSR_GET_NROW (   interface)

Return the size of the row pointer array of the matrix designated by interface.

#define STARPU_CSR_GET_NZVAL (   interface)

Return a pointer to the non-zero values of the matrix designated by interface.

#define STARPU_CSR_GET_NZVAL_DEV_HANDLE (   interface)

Return a device handle for the array of non-zero values in the matrix designated by interface. The offset documented below has to be used in addition to this.

#define STARPU_CSR_GET_COLIND (   interface)

Return a pointer to the column index of the matrix designated by interface.

#define STARPU_CSR_GET_COLIND_DEV_HANDLE (   interface)

Return a device handle for the column index of the matrix designated by interface. The offset documented below has to be used in addition to this.

#define STARPU_CSR_GET_ROWPTR (   interface)

Return a pointer to the row pointer array of the matrix designated by interface.

#define STARPU_CSR_GET_ROWPTR_DEV_HANDLE (   interface)

Return a device handle for the row pointer array of the matrix designated by interface. The offset documented below has to be used in addition to this.

#define STARPU_CSR_GET_OFFSET

Return the offset in the arrays (colind, rowptr, nzval) of the matrix designated by interface, to be used with the device handles.

#define STARPU_CSR_GET_FIRSTENTRY (   interface)

Return the index at which all arrays (the column indexes, the row pointers...) of the interface start.

#define STARPU_CSR_GET_ELEMSIZE (   interface)

Return the size of the elements registered into the matrix designated by interface.

#define STARPU_COO_GET_COLUMNS (   interface)

Return a pointer to the column array of the matrix designated by interface.

#define STARPU_COO_GET_COLUMNS_DEV_HANDLE (   interface)

Return a device handle for the column array of the matrix designated by interface, to be used on OpenCL. The offset documented below has to be used in addition to this.

#define STARPU_COO_GET_ROWS (   interface)

Return a pointer to the rows array of the matrix designated by interface.

#define STARPU_COO_GET_ROWS_DEV_HANDLE (   interface)

Return a device handle for the row array of the matrix designated by interface, to be used on OpenCL. The offset documented below has to be used in addition to this.

#define STARPU_COO_GET_VALUES (   interface)

Return a pointer to the values array of the matrix designated by interface.

#define STARPU_COO_GET_VALUES_DEV_HANDLE (   interface)

Return a device handle for the value array of the matrix designated by interface, to be used on OpenCL. The offset documented below has to be used in addition to this.

#define STARPU_COO_GET_OFFSET

Return the offset in the arrays of the COO matrix designated by interface.

#define STARPU_COO_GET_NX (   interface)

Return the number of elements on the x-axis of the matrix designated by interface.

#define STARPU_COO_GET_NY (   interface)

Return the number of elements on the y-axis of the matrix designated by interface.

#define STARPU_COO_GET_NVALUES (   interface)

Return the number of values registered in the matrix designated by interface.

#define STARPU_COO_GET_ELEMSIZE (   interface)

Return the size of the elements registered into the matrix designated by interface.

Enumeration Type Documentation

Identifier for all predefined StarPU data interfaces

Enumerator:
STARPU_UNKNOWN_INTERFACE_ID 

Unknown interface

STARPU_MATRIX_INTERFACE_ID 

Identifier for the matrix data interface

STARPU_BLOCK_INTERFACE_ID 

Identifier for block data interface

STARPU_VECTOR_INTERFACE_ID 

Identifier for the vector data interface

STARPU_CSR_INTERFACE_ID 

Identifier for the csr data interface

STARPU_BCSR_INTERFACE_ID 

Identifier for the bcsr data interface

STARPU_VARIABLE_INTERFACE_ID 

Identifier for the variable data interface

STARPU_VOID_INTERFACE_ID 

Identifier for the void data interface

STARPU_MULTIFORMAT_INTERFACE_ID 

Identifier for the multiformat data interface

STARPU_COO_INTERFACE_ID 

Identifier for the coo data interface

STARPU_MAX_INTERFACE_ID 

Maximum number of data interfaces

Function Documentation

void starpu_void_data_register ( starpu_data_handle_t handle)

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_variable_data_register ( starpu_data_handle_t handle,
unsigned  home_node,
uintptr_t  ptr,
size_t  size 
)

Register the size byte element pointed to by ptr, which is typically a scalar, and initialize handle to represent this data item.

Here an example of how to use the function.

float var;
starpu_variable_data_register(&var_handle, 0, (uintptr_t)&var, sizeof(var));
void starpu_vector_data_register ( starpu_data_handle_t handle,
unsigned  home_node,
uintptr_t  ptr,
uint32_t  nx,
size_t  elemsize 
)

Register the nx elemsize-byte elements pointed to by ptr and initialize handle to represent it.

Here an example of how to use the function.

float vector[NX];
starpu_data_handle_t vector_handle;
starpu_vector_data_register(&vector_handle, 0, (uintptr_t)vector, NX, sizeof(vector[0]));
void starpu_vector_ptr_register ( starpu_data_handle_t  handle,
unsigned  node,
uintptr_t  ptr,
uintptr_t  dev_handle,
size_t  offset 
)

Register into the handle that to store data on node node it should use the buffer located at ptr, or device handle dev_handle and offset offset (for OpenCL, notably)

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 
)

Register the nx x ny 2D matrix of elemsize-byte elements pointed by ptr and initialize handle to represent it. ld specifies the number of elements between rows. a value greater than nx adds padding, which can be useful for alignment purposes.

Here an example of how to use the function.

float *matrix;
starpu_data_handle_t matrix_handle;
matrix = (float*)malloc(width * height * sizeof(float));
starpu_matrix_data_register(&matrix_handle, 0, (uintptr_t)matrix, width, width, height, sizeof(float));
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 
)

Register into the handle that to store data on node node it should use the buffer located at ptr, or device handle dev_handle and offset offset (for OpenCL, notably), with ld elements between rows.

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 
)

Register the nx x ny x nz 3D matrix of elemsize byte elements pointed by ptr and initialize handle to represent it. Again, ldy and ldz specify the number of elements between rows and between z planes.

Here an example of how to use the function.

float *block;
starpu_data_handle_t block_handle;
block = (float*)malloc(nx*ny*nz*sizeof(float));
starpu_block_data_register(&block_handle, 0, (uintptr_t)block, nx, nx*ny, nx, ny, nz, sizeof(float));
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 
)

Register into the handle that to store data on node node it should use the buffer located at ptr, or device handle dev_handle and offset offset (for OpenCL, notably), with ldy elements between rows and elements between z planes.

void starpu_bcsr_data_register ( starpu_data_handle_t handle,
unsigned  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 
)

This variant of starpu_data_register() uses the BCSR (Blocked Compressed Sparse Row Representation) sparse matrix interface. Register the sparse matrix made of nnz non-zero blocks of elements of size elemsize stored in nzval and initializes handle to represent it. Blocks have size r * c. nrow is the number of rows (in terms of blocks), colind[i] is the block-column index for block i in nzval, rowptr[i] is the block-index (in nzval) of the first block of row i. firstentry is the index of the first entry of the given arrays (usually 0 or 1).

void starpu_csr_data_register ( starpu_data_handle_t handle,
unsigned  home_node,
uint32_t  nnz,
uint32_t  nrow,
uintptr_t  nzval,
uint32_t *  colind,
uint32_t *  rowptr,
uint32_t  firstentry,
size_t  elemsize 
)

This variant of starpu_data_register() uses the CSR (Compressed Sparse Row Representation) sparse matrix interface. TODO

void starpu_coo_data_register ( starpu_data_handle_t handleptr,
unsigned  home_node,
uint32_t  nx,
uint32_t  ny,
uint32_t  n_values,
uint32_t *  columns,
uint32_t *  rows,
uintptr_t  values,
size_t  elemsize 
)

Register the nx x ny 2D matrix given in the COO format, using the columns, rows, values arrays, which must have n_values elements of size elemsize. Initialize handleptr.

void * starpu_data_get_interface_on_node ( starpu_data_handle_t  handle,
unsigned  memory_node 
)

Return the interface associated with handle on memory_node.

void * starpu_data_handle_to_pointer ( starpu_data_handle_t  handle,
unsigned  node 
)

Return the pointer associated with handle on node node or NULL if handle’s interface does not support this operation or data for this handle is not allocated on that node.

void * starpu_data_get_local_ptr ( starpu_data_handle_t  handle)

Return the local pointer associated with handle or NULL if handle’s interface does not have data allocated locally

enum starpu_data_interface_id starpu_data_get_interface_id ( starpu_data_handle_t  handle)

Return the unique identifier of the interface associated with the given handle.

size_t starpu_data_get_size ( starpu_data_handle_t  handle)

Return the size of the data associated with handle.

int starpu_data_pack ( starpu_data_handle_t  handle,
void **  ptr,
starpu_ssize_t *  count 
)

Execute the packing operation of the interface of the data registered at handle (see starpu_data_interface_ops). This packing operation must allocate a buffer large enough at ptr and copy into the newly allocated buffer the data associated to handle. count will be set to the size of the allocated buffer. If ptr is NULL, the function should not copy the data in the buffer but just set count to the size of the buffer which would have been allocated. The special value -1 indicates the size is yet unknown.

int starpu_data_unpack ( starpu_data_handle_t  handle,
void *  ptr,
size_t  count 
)

Unpack in handle the data located at ptr of size count as described by the interface of the data. The interface registered at handle must define a unpacking operation (see starpu_data_interface_ops). The memory at the address ptr is freed after calling the data unpacking operation.

size_t starpu_variable_get_elemsize ( starpu_data_handle_t  handle)

Return the size of the variable designated by handle.

uintptr_t starpu_variable_get_local_ptr ( starpu_data_handle_t  handle)

Return a pointer to the variable designated by handle.

uint32_t starpu_vector_get_nx ( starpu_data_handle_t  handle)

Return the number of elements registered into the array designated by handle.

size_t starpu_vector_get_elemsize ( starpu_data_handle_t  handle)

Return the size of each element of the array designated by handle.

uintptr_t starpu_vector_get_local_ptr ( starpu_data_handle_t  handle)

Return the local pointer associated with handle.

uint32_t starpu_matrix_get_nx ( starpu_data_handle_t  handle)

Return the number of elements on the x-axis of the matrix designated by handle.

uint32_t starpu_matrix_get_ny ( starpu_data_handle_t  handle)

Return the number of elements on the y-axis of the matrix designated by handle.

uint32_t starpu_matrix_get_local_ld ( starpu_data_handle_t  handle)

Return the number of elements between each row of the matrix designated by handle. Maybe be equal to nx when there is no padding.

uintptr_t starpu_matrix_get_local_ptr ( starpu_data_handle_t  handle)

Return the local pointer associated with handle.

size_t starpu_matrix_get_elemsize ( starpu_data_handle_t  handle)

Return the size of the elements registered into the matrix designated by handle.

uint32_t starpu_block_get_nx ( starpu_data_handle_t  handle)

Return the number of elements on the x-axis of the block designated by handle.

uint32_t starpu_block_get_ny ( starpu_data_handle_t  handle)

Return the number of elements on the y-axis of the block designated by handle.

uint32_t starpu_block_get_nz ( starpu_data_handle_t  handle)

Return the number of elements on the z-axis of the block designated by handle.

uint32_t starpu_block_get_local_ldy ( starpu_data_handle_t  handle)

Return the number of elements between each row of the block designated by handle, in the format of the current memory node.

uint32_t starpu_block_get_local_ldz ( starpu_data_handle_t  handle)

Return the number of elements between each z plane of the block designated by handle, in the format of the current memory node.

uintptr_t starpu_block_get_local_ptr ( starpu_data_handle_t  handle)

Return the local pointer associated with handle.

size_t starpu_block_get_elemsize ( starpu_data_handle_t  handle)

Return the size of the elements of the block designated by handle.

uint32_t starpu_bcsr_get_nnz ( starpu_data_handle_t  handle)

Return the number of non-zero elements in the matrix designated by handle.

uint32_t starpu_bcsr_get_nrow ( starpu_data_handle_t  handle)

Return the number of rows (in terms of blocks of size r*c) in the matrix designated by handle.

uint32_t starpu_bcsr_get_firstentry ( starpu_data_handle_t  handle)

Return the index at which all arrays (the column indexes, the row pointers...) of the matrix desginated by handle.

uintptr_t starpu_bcsr_get_local_nzval ( starpu_data_handle_t  handle)

Return a pointer to the non-zero values of the matrix designated by handle.

uint32_t * starpu_bcsr_get_local_colind ( 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 handle.

uint32_t * starpu_bcsr_get_local_rowptr ( starpu_data_handle_t  handle)

Return the row pointer array of the matrix designated by handle.

uint32_t starpu_bcsr_get_r ( starpu_data_handle_t  handle)

Return the number of rows in a block.

uint32_t starpu_bcsr_get_c ( starpu_data_handle_t  handle)

Return the numberof columns in a block.

size_t starpu_bcsr_get_elemsize ( starpu_data_handle_t  handle)

Return the size of the elements in the matrix designated by handle.

uint32_t starpu_csr_get_nnz ( starpu_data_handle_t  handle)

Return the number of non-zero values in the matrix designated by handle.

uint32_t starpu_csr_get_nrow ( starpu_data_handle_t  handle)

Return the size of the row pointer array of the matrix designated by handle.

uint32_t starpu_csr_get_firstentry ( starpu_data_handle_t  handle)

Return the index at which all arrays (the column indexes, the row pointers...) of the matrix designated by handle.

uintptr_t starpu_csr_get_local_nzval ( starpu_data_handle_t  handle)

Return a local pointer to the non-zero values of the matrix designated by handle.

uint32_t * starpu_csr_get_local_colind ( starpu_data_handle_t  handle)

Return a local pointer to the column index of the matrix designated by handle.

uint32_t * starpu_csr_get_local_rowptr ( starpu_data_handle_t  handle)

Return a local pointer to the row pointer array of the matrix designated by handle.

size_t starpu_csr_get_elemsize ( starpu_data_handle_t  handle)

Return the size of the elements registered into the matrix designated by handle.

uintptr_t starpu_malloc_on_node ( unsigned  dst_node,
size_t  size 
)

Allocate size bytes on node dst_node. 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.

void starpu_free_on_node ( unsigned  dst_node,
uintptr_t  addr,
size_t  size 
)

Free addr of size bytes on node dst_node which was previously allocated with starpu_malloc_on_node.

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 size bytes from byte offset src_offset of src on src_node to byte offset dst_offset of dst on dst_node. This is to be used in the any_to_any() copy method, which is provided with the async_data to be passed to starpu_interface_copy(). this returns -EAGAIN if the transfer is still ongoing, or 0 if the transfer is already completed.

uint32_t starpu_hash_crc32c_be_n ( const void *  input,
size_t  n,
uint32_t  inputcrc 
)

Compute the CRC of a byte buffer seeded by the 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 32bit number seeded by the 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 
)

Compute the CRC of a string seeded by the 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.

int starpu_data_interface_get_next_id ( void  )

Return the next available id for a newly created data interface (Defining A New Data Interface).

starpu-1.1.5/doc/doxygen/html/starpu__task__bundle_8h_source.html0000644000373600000000000003022212571536757022211 00000000000000 StarPU Handbook: starpu_task_bundle.h Source File
starpu_task_bundle.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010, 2011, 2014 Université de Bordeaux
4  * Copyright (C) 2011 Télécom-SudParis
5  * Copyright (C) 2012 Inria
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_TASK_BUNDLE_H__
20 #define __STARPU_TASK_BUNDLE_H__
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
27 struct starpu_task;
28 
29 typedef struct _starpu_task_bundle *starpu_task_bundle_t;
30 
31 void starpu_task_bundle_create(starpu_task_bundle_t *bundle);
32 
33 int starpu_task_bundle_insert(starpu_task_bundle_t bundle, struct starpu_task *task);
34 
35 int starpu_task_bundle_remove(starpu_task_bundle_t bundle, struct starpu_task *task);
36 
37 void starpu_task_bundle_close(starpu_task_bundle_t bundle);
38 
39 #ifdef __cplusplus
40 }
41 #endif
42 
43 #endif /* __STARPU_TASK_BUNDLE_H__ */
starpu-1.1.5/doc/doxygen/html/starpu__scheduler_8h.html0000644000373600000000000003761112571536757020166 00000000000000 StarPU Handbook: starpu_scheduler.h File Reference
starpu_scheduler.h File Reference
#include <starpu.h>

Go to the source code of this file.

Data Structures

struct  starpu_sched_policy

Functions

struct starpu_sched_policy ** starpu_sched_get_predefined_policies ()
void starpu_worker_get_sched_condition (int workerid, starpu_pthread_mutex_t **sched_mutex, starpu_pthread_cond_t **sched_cond)
int starpu_wakeup_worker (int workerid, starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex)
int starpu_worker_can_execute_task (unsigned workerid, struct starpu_task *task, unsigned nimpl)
int starpu_push_local_task (int workerid, struct starpu_task *task, int back)
int starpu_push_task_end (struct starpu_task *task)
int starpu_combined_worker_assign_workerid (int nworkers, int workerid_array[])
int starpu_combined_worker_get_description (int workerid, int *worker_size, int **combined_workerid)
int starpu_combined_worker_can_execute_task (unsigned workerid, struct starpu_task *task, unsigned nimpl)
int starpu_get_prefetch_flag (void)
int starpu_prefetch_task_input_on_node (struct starpu_task *task, unsigned node)
uint32_t starpu_task_footprint (struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_expected_length (struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_worker_get_relative_speedup (enum starpu_perfmodel_archtype perf_archtype)
double starpu_task_expected_data_transfer_time (unsigned memory_node, struct starpu_task *task)
double starpu_data_expected_transfer_time (starpu_data_handle_t handle, unsigned memory_node, enum starpu_data_access_mode mode)
double starpu_task_expected_power (struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_expected_conversion_time (struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_bundle_expected_length (starpu_task_bundle_t bundle, enum starpu_perfmodel_archtype arch, unsigned nimpl)
double starpu_task_bundle_expected_data_transfer_time (starpu_task_bundle_t bundle, unsigned memory_node)
double starpu_task_bundle_expected_power (starpu_task_bundle_t bundle, enum starpu_perfmodel_archtype arch, unsigned nimpl)
void starpu_sched_ctx_worker_shares_tasks_lists (int workerid, int sched_ctx_id)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__task_8h.html0000644000373600000000000006557012571536757017157 00000000000000 StarPU Handbook: starpu_task.h File Reference
starpu_task.h File Reference
#include <starpu.h>
#include <starpu_data.h>
#include <starpu_util.h>
#include <starpu_task_bundle.h>
#include <errno.h>
#include <cuda.h>

Go to the source code of this file.

Data Structures

struct  starpu_codelet
struct  starpu_task

Macros

#define STARPU_NOWHERE
#define STARPU_CPU
#define STARPU_CUDA
#define STARPU_OPENCL
#define STARPU_TASK_INVALID
#define STARPU_MULTIPLE_CPU_IMPLEMENTATIONS
#define STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS
#define STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS
#define STARPU_TASK_INITIALIZER
#define STARPU_TASK_GET_HANDLE(task, i)
#define STARPU_TASK_SET_HANDLE(task, handle, i)
#define STARPU_CODELET_GET_MODE(codelet, i)
#define STARPU_CODELET_SET_MODE(codelet, mode, i)
#define STARPU_CODELET_GET_NODE(codelet, i)
#define STARPU_CODELET_SET_NODE(codelet, __node, i)

Typedefs

typedef uint64_t starpu_tag_t
typedef void(* starpu_cpu_func_t )(void **, void *)
typedef void(* starpu_cuda_func_t )(void **, void *)
typedef void(* starpu_opencl_func_t )(void **, void *)

Enumerations

enum  starpu_codelet_type { STARPU_SEQ, STARPU_SPMD, STARPU_FORKJOIN }
enum  starpu_task_status {
  STARPU_TASK_INVALID, STARPU_TASK_INVALID, STARPU_TASK_BLOCKED, STARPU_TASK_READY,
  STARPU_TASK_RUNNING, STARPU_TASK_FINISHED, STARPU_TASK_BLOCKED_ON_TAG, STARPU_TASK_BLOCKED_ON_TASK,
  STARPU_TASK_BLOCKED_ON_DATA
}

Functions

void starpu_tag_declare_deps (starpu_tag_t id, unsigned ndeps,...)
void starpu_tag_declare_deps_array (starpu_tag_t id, unsigned ndeps, starpu_tag_t *array)
void starpu_task_declare_deps_array (struct starpu_task *task, unsigned ndeps, struct starpu_task *task_array[])
int starpu_tag_wait (starpu_tag_t id)
int starpu_tag_wait_array (unsigned ntags, starpu_tag_t *id)
void starpu_tag_notify_from_apps (starpu_tag_t id)
void starpu_tag_restart (starpu_tag_t id)
void starpu_tag_remove (starpu_tag_t id)
void starpu_task_init (struct starpu_task *task)
void starpu_task_clean (struct starpu_task *task)
struct starpu_taskstarpu_task_create (void)
void starpu_task_destroy (struct starpu_task *task)
int starpu_task_submit (struct starpu_task *task) STARPU_WARN_UNUSED_RESULT
int starpu_task_submit_to_ctx (struct starpu_task *task, unsigned sched_ctx_id)
int starpu_task_wait (struct starpu_task *task) STARPU_WARN_UNUSED_RESULT
int starpu_task_wait_for_all (void)
int starpu_task_wait_for_n_submitted (unsigned n)
int starpu_task_wait_for_all_in_ctx (unsigned sched_ctx_id)
int starpu_task_wait_for_n_submitted_in_ctx (unsigned sched_ctx_id, unsigned n)
int starpu_task_wait_for_no_ready (void)
int starpu_task_nready (void)
int starpu_task_nsubmitted (void)
void starpu_codelet_init (struct starpu_codelet *cl)
void starpu_codelet_display_stats (struct starpu_codelet *cl)
struct starpu_taskstarpu_task_get_current (void)
void starpu_parallel_task_barrier_init (struct starpu_task *task, int workerid)
void starpu_parallel_task_barrier_init_n (struct starpu_task *task, int worker_size)
struct starpu_taskstarpu_task_dup (struct starpu_task *task)
void starpu_task_set_implementation (struct starpu_task *task, unsigned impl)
unsigned starpu_task_get_implementation (struct starpu_task *task)

Detailed Description

starpu-1.1.5/doc/doxygen/html/group__API__FFT__Support.html0000644000373600000000000004473512571536763020573 00000000000000 StarPU Handbook: FFT Support
StarPU Handbook
FFT Support

Functions

void * starpufft_malloc (size_t n)
void starpufft_free (void *p)
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)
struct starpu_taskstarpufft_start (starpufft_plan p, void *in, void *out)
struct starpu_taskstarpufft_start_handle (starpufft_plan p, starpu_data_handle_t in, starpu_data_handle_t out)
int starpufft_execute (starpufft_plan p, void *in, void *out)
int starpufft_execute_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)

Detailed Description

Function Documentation

void * starpufft_malloc ( size_t  n)

Allocates memory for n bytes. This is preferred over malloc(), since it allocates pinned memory, which allows overlapped transfers.

void * starpufft_free ( void *  p)

Release memory previously allocated.

struct starpufft_plan * starpufft_plan_dft_1d ( int  n,
int  sign,
unsigned  flags 
)

Initializes a plan for 1D FFT of size n. sign can be STARPUFFT_FORWARD or STARPUFFT_INVERSE. flags must be 0.

struct starpufft_plan * starpufft_plan_dft_2d ( int  n,
int  m,
int  sign,
unsigned  flags 
)

Initializes a plan for 2D FFT of size (n, m). sign can be STARPUFFT_FORWARD or STARPUFFT_INVERSE. flags must be 0.

struct starpu_task * starpufft_start ( starpufft_plan  p,
void *  in,
void *  out 
)
read

Start an FFT previously planned as p, using in and 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

struct starpu_task * starpufft_start_handle ( starpufft_plan  p,
starpu_data_handle_t  in,
starpu_data_handle_t  out 
)
read

Start an FFT previously planned as p, using data handles in and 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.

void starpufft_execute ( starpufft_plan  p,
void *  in,
void *  out 
)

Execute an FFT previously planned as p, using in and out as input and output. This submits and waits for the task.

void starpufft_execute_handle ( starpufft_plan  p,
starpu_data_handle_t  in,
starpu_data_handle_t  out 
)

Execute an FFT previously planned as p, using data handles in and out as input and output (assumed to be vectors of elements of the expected types). This submits and waits for the task.

void starpufft_cleanup ( starpufft_plan  p)

Releases data for plan p, in the starpufft_start() case.

void starpufft_destroy_plan ( starpufft_plan  p)

Destroys plan p, i.e. release all CPU (fftw) and GPU (cufft) resources.

starpu-1.1.5/doc/doxygen/html/deprecated.html0000644000373600000000000002652112571536763016147 00000000000000 StarPU Handbook: Deprecated List
Deprecated List
Global starpu_codelet::cpu_func
Optional field which has been made deprecated. One should use instead the field starpu_codelet::cpu_funcs.
Global starpu_codelet::cuda_func
Optional field which has been made deprecated. One should use instead the starpu_codelet::cuda_funcs field.
Global starpu_codelet::opencl_func
Optional field which has been made deprecated. One should use instead the starpu_codelet::opencl_funcs field.
Global starpu_data_free_pinned_if_possible
Equivalent to starpu_free(). This macro is provided to avoid breaking old codes.
Global starpu_data_malloc_pinned_if_possible
Equivalent to starpu_malloc(). This macro is provided to avoid breaking old codes.
Global starpu_mpi_initialize (void)

This function has been made deprecated. One should use instead the function starpu_mpi_init(). This function does not call MPI_Init(), it should be called beforehand.

Global starpu_mpi_initialize_extended (int *rank, int *world_size)

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, ...).

Global STARPU_MULTIPLE_CPU_IMPLEMENTATIONS

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.

Global STARPU_MULTIPLE_CUDA_IMPLEMENTATIONS

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.

Global STARPU_MULTIPLE_OPENCL_IMPLEMENTATIONS

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.

Global starpu_perfmodel::cost_model )(struct starpu_data_descr *)
This field is deprecated. Use instead the field starpu_perfmodel::cost_function field.
Global starpu_perfmodel_per_arch::cost_model )(struct starpu_data_descr *t)
This field is deprecated. Use instead the field starpu_perfmodel_per_arch::cost_function.
Global starpu_task::buffers [STARPU_NMAXBUFS]
This field has been made deprecated. One should use instead the field starpu_task::handles to specify the data handles accessed by the task. The access modes are now defined in the field starpu_codelet::modes.
starpu-1.1.5/doc/doxygen/html/sync_off.png0000644000373600000000000000152512571536757015475 00000000000000PNG  IHDRw=IDATxKhTW1I&38MII3b$c I1V1-(T.* t!K[čf`l(l"Y6gT}sgܹ d{8?̝;u`:!FB?Űm'y>ѝlU_?]Y(N8f1qn-etm 0}b%׌=0?1s08;_ W|%\Zð >舽lnp.a{ )t; b n652?>Oдunm`׭ZWjC~>־0+ {{fMŕټ` ݛ%uA6,]kWu]7ihu1 l Ҷ̺:\cxhRQt$ fd<4B[fd7=.M9//O a},j?.5ښm?X2#d p(?c!a1ޗةܾ7dK:)3],H+ku<|`LhC7e םt H$^2%l.aeÉ|s }D^hz~Rá]|#@חև[k<|(*ݹdtM:,]' X_n| /cfOIENDB`starpu-1.1.5/doc/doxygen/html/starpu__cublas_8h.html0000644000373600000000000001412712571536757017456 00000000000000 StarPU Handbook: starpu_cublas.h File Reference
starpu_cublas.h File Reference

Go to the source code of this file.

Functions

void starpu_cublas_init (void)
void starpu_cublas_shutdown (void)

Detailed Description

starpu-1.1.5/doc/doxygen/html/group__API__CUDA__Extensions.html0000644000373600000000000004336412571536763021350 00000000000000 StarPU Handbook: CUDA Extensions
StarPU Handbook
CUDA Extensions

Macros

#define STARPU_USE_CUDA
#define STARPU_MAXCUDADEVS
#define STARPU_CUDA_REPORT_ERROR(status)
#define STARPU_CUBLAS_REPORT_ERROR(status)

Functions

cudaStream_t starpu_cuda_get_local_stream (void)
struct cudaDeviceProp * starpu_cuda_get_device_properties (unsigned workerid)
void starpu_cuda_report_error (const char *func, const char *file, int line, cudaError_t status)
int starpu_cuda_copy_async_sync (void *src_ptr, unsigned src_node, void *dst_ptr, unsigned dst_node, size_t ssize, cudaStream_t stream, enum cudaMemcpyKind kind)
void starpu_cuda_set_device (unsigned devid)
void starpu_cublas_init (void)
void starpu_cublas_shutdown (void)

Detailed Description

Macro Definition Documentation

#define STARPU_USE_CUDA

This macro is defined when StarPU has been installed with CUDA support. It should be used in your code to detect the availability of CUDA as shown in Full source code for the ’Scaling a Vector’ example.

#define STARPU_MAXCUDADEVS

This macro defines the maximum number of CUDA devices that are supported by StarPU.

#define STARPU_CUDA_REPORT_ERROR (   status)

Calls starpu_cuda_report_error(), passing the current function, file and line position.

#define STARPU_CUBLAS_REPORT_ERROR (   status)

Calls starpu_cublas_report_error(), passing the current function, file and line position.

Function Documentation

cudaStream_t starpu_cuda_get_local_stream ( void  )

This function gets the current worker’s CUDA stream. StarPU provides a stream for every CUDA device controlled by StarPU. This function is only provided for convenience so that programmers can easily use asynchronous operations within codelets without having to create a stream by hand. Note that the application is not forced to use the stream provided by starpu_cuda_get_local_stream() and may also create its own streams. Synchronizing with cudaThreadSynchronize() is allowed, but will reduce the likelihood of having all transfers overlapped.

const struct cudaDeviceProp * starpu_cuda_get_device_properties ( unsigned  workerid)
read

This function returns a pointer to device properties for worker workerid (assumed to be a CUDA worker).

void starpu_cuda_report_error ( const char *  func,
const char *  file,
int  line,
cudaError_t  status 
)

Report a CUDA error.

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 ssize bytes from the pointer src_ptr on src_node to the pointer dst_ptr on dst_node. The function first tries to copy the data asynchronous (unless stream is NULL). If the asynchronous copy fails or if stream is NULL, it copies the data synchronously. The function returns -EAGAIN if the asynchronous launch was successfull. It returns 0 if the synchronous copy was successful, or fails otherwise.

void starpu_cuda_set_device ( unsigned  devid)

Calls cudaSetDevice(devid) or cudaGLSetGLDevice(devid), according to whether devid is among the field starpu_conf::cuda_opengl_interoperability.

void starpu_cublas_init ( void  )

This function initializes CUBLAS on every CUDA device. The CUBLAS library must be initialized prior to any CUBLAS call. Calling starpu_cublas_init() will initialize CUBLAS on every CUDA device controlled by StarPU. This call blocks until CUBLAS has been properly initialized on every device.

void starpu_cublas_shutdown ( void  )

This function synchronously deinitializes the CUBLAS library on every CUDA device.

starpu-1.1.5/doc/doxygen/html/dir_22c8bdf0d79243eb209c21ccad3f4652.html0000644000373600000000000001270212571536763021325 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/doc/doxygen/ Directory Reference
doxygen Directory Reference

Directories

directory  chapters
starpu-1.1.5/doc/doxygen/html/starpu__profiling_8h.html0000644000373600000000000003307112571536757020175 00000000000000 StarPU Handbook: starpu_profiling.h File Reference
starpu_profiling.h File Reference
#include <starpu.h>
#include <errno.h>
#include <time.h>
#include <starpu_util.h>

Go to the source code of this file.

Data Structures

struct  starpu_profiling_task_info
struct  starpu_profiling_worker_info
struct  starpu_profiling_bus_info

Macros

#define STARPU_PROFILING_DISABLE
#define STARPU_PROFILING_ENABLE
#define starpu_timespec_cmp(a, b, CMP)

Functions

void starpu_profiling_init ()
void starpu_profiling_set_id (int new_id)
int starpu_profiling_status_set (int status)
int starpu_profiling_status_get (void)
int starpu_profiling_worker_get_info (int workerid, struct starpu_profiling_worker_info *worker_info)
int starpu_bus_get_count (void)
int starpu_bus_get_id (int src, int dst)
int starpu_bus_get_src (int busid)
int starpu_bus_get_dst (int busid)
int starpu_bus_get_profiling_info (int busid, struct starpu_profiling_bus_info *bus_info)
static __starpu_inline void starpu_timespec_clear (struct timespec *tsp)
static __starpu_inline void starpu_timespec_add (struct timespec *a, struct timespec *b, struct timespec *result)
static __starpu_inline void starpu_timespec_accumulate (struct timespec *result, struct timespec *a)
static __starpu_inline void starpu_timespec_sub (const struct timespec *a, const struct timespec *b, struct timespec *result)
double starpu_timing_timespec_delay_us (struct timespec *start, struct timespec *end)
double starpu_timing_timespec_to_us (struct timespec *ts)
void starpu_profiling_bus_helper_display_summary (void)
void starpu_profiling_worker_helper_display_summary (void)

Detailed Description

starpu-1.1.5/doc/doxygen/html/group__API__Miscellaneous__Helpers.html0000644000373600000000000002373512571536763022702 00000000000000 StarPU Handbook: Miscellaneous Helpers
StarPU Handbook
Miscellaneous Helpers

Functions

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)
void starpu_execute_on_each_worker (void(*func)(void *), void *arg, uint32_t where)

Detailed Description

Function Documentation

int starpu_data_cpy ( starpu_data_handle_t  dst_handle,
starpu_data_handle_t  src_handle,
int  asynchronous,
void(*)(void *)  callback_func,
void *  callback_arg 
)

Copy the content of src_handle into dst_handle. The parameter 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 callback_func is not NULL, this callback function is executed after the handle has been copied, and it is given the pointer callback_arg as argument.

void starpu_execute_on_each_worker ( void(*)(void *)  func,
void *  arg,
uint32_t  where 
)

This function executes the given function on a subset of workers. When calling this method, the offloaded function func is executed by every StarPU worker that may execute the function. The argument arg is passed to the offloaded function. The argument where specifies on which types of processing units the function should be executed. Similarly to the field starpu_codelet::where, it is possible to specify that the function should be executed on every CUDA device and every CPU by passing STARPU_CPU|STARPU_CUDA. This function blocks until the function has been executed on every appropriate processing units, so that it may not be called from a callback function for instance.

starpu-1.1.5/doc/doxygen/html/functions_vars_0x6e.html0000644000373600000000000003154412571536763017755 00000000000000 StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/html/starpu__perfmodel_8h.html0000644000373600000000000004232212571536757020160 00000000000000 StarPU Handbook: starpu_perfmodel.h File Reference
starpu_perfmodel.h File Reference
#include <starpu.h>
#include <stdio.h>
#include <starpu_util.h>

Go to the source code of this file.

Data Structures

struct  starpu_perfmodel_history_entry
struct  starpu_perfmodel_history_list
struct  starpu_perfmodel_regression_model
struct  starpu_perfmodel_per_arch
struct  starpu_perfmodel

Macros

#define STARPU_NARCH_VARIATIONS
#define starpu_per_arch_perfmodel

Enumerations

enum  starpu_perfmodel_archtype { STARPU_CPU_DEFAULT, STARPU_CUDA_DEFAULT, STARPU_OPENCL_DEFAULT }
enum  starpu_perfmodel_type {
  STARPU_PER_ARCH, STARPU_COMMON, STARPU_HISTORY_BASED, STARPU_REGRESSION_BASED,
  STARPU_NL_REGRESSION_BASED
}

Functions

enum starpu_perfmodel_archtype starpu_worker_get_perf_archtype (int workerid)
void starpu_perfmodel_free_sampling_directories (void)
int starpu_perfmodel_load_symbol (const char *symbol, struct starpu_perfmodel *model)
int starpu_perfmodel_unload_model (struct starpu_perfmodel *model)
void starpu_perfmodel_debugfilepath (struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, char *path, size_t maxlen, unsigned nimpl)
void starpu_perfmodel_get_arch_name (enum starpu_perfmodel_archtype arch, char *archname, size_t maxlen, unsigned nimpl)
double starpu_perfmodel_history_based_expected_perf (struct starpu_perfmodel *model, enum starpu_perfmodel_archtype arch, uint32_t footprint)
int starpu_perfmodel_list (FILE *output)
void starpu_perfmodel_print (struct starpu_perfmodel *model, enum starpu_perfmodel_archtype 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)
void starpu_perfmodel_directory (FILE *output)
void starpu_perfmodel_update_history (struct starpu_perfmodel *model, struct starpu_task *task, enum starpu_perfmodel_archtype arch, unsigned cpuid, unsigned nimpl, double measured)
void starpu_bus_print_bandwidth (FILE *f)
void starpu_bus_print_affinity (FILE *f)
double starpu_transfer_bandwidth (unsigned src_node, unsigned dst_node)
double starpu_transfer_latency (unsigned src_node, unsigned dst_node)
double starpu_transfer_predict (unsigned src_node, unsigned dst_node, size_t size)

Detailed Description

starpu-1.1.5/doc/doxygen/html/tab_b.png0000644000373600000000000000024712571536757014736 00000000000000PNG  IHDR$[nIDATxQ 0RXcI7IӨg|ٜgY3u{WS1 CjiCGJ+| s7+ٛ`t3܂aKGqQZT=@*C݇LIENDB`starpu-1.1.5/doc/doxygen/html/AdvancedExamples.html0000644000373600000000000037653412571536761017265 00000000000000 StarPU Handbook: Advanced Examples
Advanced Examples

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:

#include <xmmintrin.h>
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]);
}
struct starpu_codelet cl = {
.cpu_funcs = { scal_cpu_func, scal_sse_func},
.nbuffers = 1,
.modes = { STARPU_RW }
};

Schedulers which are multi-implementation aware (only dmda and pheft for now) will use the performance models of all the implementations it was given, and pick the one that seems to be the fastest.

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:

static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl)
{
const struct cudaDeviceProp *props;
return 1;
/* Cuda device */
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},
.cuda_funcs = { gpu_func}
.nbuffers = 1,
.modes = { STARPU_RW }
};

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:

static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl)
{
const struct cudaDeviceProp *props;
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. */
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},
.cuda_funcs = { scal_gpu_13, scal_gpu_20},
.nbuffers = 1,
.modes = { STARPU_RW }
};

Another example is having specialized implementations for some given common sizes, for instance here we have a specialized implementation for 1024x1024 matrices:

static int can_execute(unsigned workerid, struct starpu_task *task, unsigned nimpl)
{
const struct cudaDeviceProp *props;
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 = {
.cpu_funcs = { cpu_func},
.cpu_funcs_name = { "cpu_func"},
.cuda_funcs = { potrf_gpu_generic, potrf_gpu_1024},
.nbuffers = 1,
.modes = { STARPU_RW }
};

Note: the most generic variant should be provided first, as some schedulers are not able to try the different variants.

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/.

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) */
/* The task is finished, get profiling information */
/* 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 don't need the task structure anymore */
/* 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);
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);
}

Partitioning Data

An existing piece of data can be partitioned in sub parts to be used by different tasks, for instance:

int vector[NX];
/* Declare data to StarPU */
starpu_vector_data_register(&handle, 0, (uintptr_t)vector,
NX, sizeof(vector[0]));
/* Partition the vector in PARTS sub-vectors */
{
.nchildren = PARTS
};

The task submission then uses the function starpu_data_get_sub_data() to retrieve the sub-handles to be passed as tasks parameters.

/* Submit a task on each sub-vector */
for (i=0; i<starpu_data_get_nb_children(handle); i++) {
/* Get subdata number i (there is only 1 dimension) */
starpu_data_handle_t sub_handle = starpu_data_get_sub_data(handle, 1, i);
struct starpu_task *task = starpu_task_create();
task->handles[0] = sub_handle;
task->cl = &cl;
task->synchronous = 1;
task->cl_arg = &factor;
task->cl_arg_size = sizeof(factor);
}

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 handles. The kernel thus needs to be also passed the offset within the OpenCL buffer:

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);
...
}

And the kernel has to shift from the pointer passed by the OpenCL driver:

__kernel void opencl_kernel(__global int *vector, unsigned offset)
{
block = (__global void *)block + offset;
...
}

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.

Multiple views

Partitioning is synchronous, which can be a problem for dynamic applications. Another way is to register several views on the same piece of data. fmultiple_manual is a complete example using this technique.

In short, we first register the same matrix several times:

starpu_matrix_data_register(&handle, 0, (uintptr_t)matrix, NX, NX, NY, sizeof(matrix[0]));
for (i = 0; i < PARTS; i++)
starpu_matrix_data_register(&vert_handle[i], 0, (uintptr_t)&matrix[0][i*(NX/PARTS)], NX, NX/PARTS, NY, sizeof(matrix[0][0]));

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:

for (i = 0; i < PARTS; i++)
starpu_data_invalidate(vert_handle[i]);

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:

void empty(void *buffers[] STARPU_ATTRIBUTE_UNUSED, void *cl_arg STARPU_ATTRIBUTE_UNUSED)
{ }
struct starpu_codelet cl_switch =
{
.cpu_funcs = {empty},
.nbuffers = 3,
.modes = {STARPU_RW, STARPU_W, STARPU_W},
};
ret = starpu_task_insert(&cl_switch, STARPU_RW, handle,
STARPU_W, vert_handle[0],
STARPU_W, vert_handle[1],
0);

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:

\end
And now we can start using vertical slices, etc.
\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
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.
<ul>
<li>
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 <c>$STARPU_HOME/.starpu/sampling/codelets</c>
for further executions, and can be observed by using the tool
<c>starpu_perfmodel_display</c>, or drawn by using
the tool <c>starpu_perfmodel_plot</c> (\ref PerformanceModelCalibration). The
models are indexed by machine name. To
share the models between machines (e.g. for a homogeneous cluster), use
<c>export STARPU_HOSTNAME=some_global_name</c>. Measurements are only done
when using a task scheduler which makes use of it, such as
<c>dmda</c>. 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 = {
.symbol = "mult_perf_model"
};
struct starpu_codelet cl = {
.cpu_funcs = { 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
};

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 STARPU_CALIBRATE to 1 and run the application on varying input sizes with 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 (Performance Model Calibration); when their output look good, STARPU_CALIBRATE can be reset to 0 to let StarPU use the resulting performance model without recording new measures, and 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 STARPU_CALIBRATE to 0, otherwise StarPU will continue adding the measures, and result with a very big performance model, which will take time a lot of time to load and save.

For non-linear regression, since computing it is quite expensive, it is only done at termination of the application. This means that the first execution of the application will use only history-based performance model to perform scheduling, without using regression.

Provided as an estimation from the application itself (model type STARPU_COMMON and field starpu_perfmodel::cost_function), see for instance examples/common/blas_model.h and examples/common/blas_model.c.

Provided explicitly by the application (model type STARPU_PER_ARCH): 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.

For STARPU_HISTORY_BASED, STARPU_REGRESSION_BASED, and STARPU_NL_REGRESSION_BASED, the total size of task data (both input and output) is used as an index by default. The field starpu_perfmodel::size_base however permits 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.

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 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 Task Scheduling Policy.

The same can be done for task power consumption estimation, by setting the field starpu_codelet::power_model the same way as the field starpu_codelet::model. Note: for now, the application has to give to the power 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_power() 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.

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.

Insert Task Utility

StarPU provides the wrapper function starpu_insert_task() to ease the creation and submission of tasks.

Here the implementation of the codelet:

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},
.nbuffers = 2,
.modes = { STARPU_RW, STARPU_RW }
};

And the call to the function starpu_insert_task():

starpu_insert_task(&mycodelet,
STARPU_VALUE, &ifactor, sizeof(ifactor),
STARPU_VALUE, &ffactor, sizeof(ffactor),
STARPU_RW, data_handles[0], STARPU_RW, data_handles[1],
0);

The call to starpu_insert_task() is equivalent to the following code:

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);

Here a similar call using STARPU_DATA_ARRAY.

starpu_insert_task(&mycodelet,
STARPU_DATA_ARRAY, data_handles, 2,
STARPU_VALUE, &ifactor, sizeof(ifactor),
STARPU_VALUE, &ffactor, sizeof(ffactor),
0);

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]:

/* Compute which portion we will work on, e.g. pivot */
starpu_insert_task(&which_index, STARPU_W, i_handle, 0);
/* And submit the corresponding task */
starpu_insert_task(&work, STARPU_RW, A_handle[i], 0));

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.

Data Reduction

In various cases, some piece of data is used to accumulate intermediate results. For instances, the dot product of a vector, maximum/minimum finding, the histogram of a photograph, etc. When these results are produced along the whole machine, it would not be efficient to accumulate them in only one place, incurring data transmission each and access concurrency.

StarPU provides a mode STARPU_REDUX, which permits to optimize that case: it will allocate a buffer on each memory node, and accumulate intermediate results there. When the data is eventually accessed in the normal mode STARPU_R, StarPU will collect the intermediate results in just one buffer.

For this to work, the user has to use the function starpu_data_set_reduction_methods() to declare how to initialize these buffers, and how to assemble partial results.

For instance, cg uses that to optimize its dot product: it first defines the codelets for initialization and reduction:

struct starpu_codelet bzero_variable_cl =
{
.cpu_funcs = { 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},
.cuda_funcs = { accumulate_variable_cuda},
.nbuffers = 1,
}

and attaches them as reduction methods for its handle dtq:

starpu_variable_data_register(&dtq_handle, -1, NULL, sizeof(type));
&accumulate_variable_cl, &bzero_variable_cl);

and dtq_handle can now be used in mode STARPU_REDUX for the dot products with partitioned vectors:

for (b = 0; b < nblocks; b++)
starpu_insert_task(&dot_kernel_cl,
STARPU_REDUX, dtq_handle,
0);

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_insert_task() in the MPI case. That will however not produce any MPI communication, but just pass STARPU_REDUX to the underlying starpu_insert_task(). It is up to the application to call starpu_mpi_redux_data(), which posts tasks that will reduce the partial results among MPI nodes into the MPI node which owns the data. For instance, some hypothetical application which collects partial results into data res, then uses it for other computation, before looping again with a new reduction:

for (i = 0; i < 100; i++) {
starpu_mpi_insert_task(MPI_COMM_WORLD, &init_res, STARPU_W, res, 0);
starpu_mpi_insert_task(MPI_COMM_WORLD, &work, STARPU_RW, A,
STARPU_R, B, STARPU_REDUX, res, 0);
starpu_mpi_redux_data(MPI_COMM_WORLD, res);
starpu_mpi_insert_task(MPI_COMM_WORLD, &work2, STARPU_RW, B, STARPU_R, res, 0);
}

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.

Temporary Data

Data can sometimes be entirely produced by a task, and entirely consumed by another task, without the need for other parts of the application to access it. In such case, registration can be done without prior allocation, by using the special memory node number -1, and passing a zero pointer. StarPU will actually allocate memory only when the task creating the content gets scheduled, and destroy it on unregistration.

In addition to that, it can be tedious for the application to have to unregister the data, since it will not use its content anyway. The unregistration can be done lazily by using the function starpu_data_unregister_submit(), which will record that no more tasks accessing the handle will be submitted, so that it can be freed as soon as the last task accessing it is over.

The following code examplifies both points: it registers the temporary data, submits three tasks accessing it, and records the data for automatic unregistration.

starpu_vector_data_register(&handle, -1, 0, n, sizeof(float));
starpu_insert_task(&produce_data, STARPU_W, handle, 0);
starpu_insert_task(&compute_data, STARPU_RW, handle, 0);
starpu_insert_task(&summarize_data, STARPU_R, handle, STARPU_W, result_handle, 0);

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).

Scratch Data

Some kernels sometimes need temporary data to achieve the computations, i.e. a workspace. The application could allocate it at the start of the codelet function, and free it at the end, but that would be costly. It could also allocate one buffer per worker (similarly to How To Initialize A Computation Library Once For Each Worker?), but that would make them systematic and permanent. A more optimized way is to use the data access mode STARPU_SCRATCH, as examplified below, which provides per-worker buffers without content consistency.

starpu_vector_data_register(&workspace, -1, 0, sizeof(float));
for (i = 0; i < N; i++)
starpu_insert_task(&compute, STARPU_R, input[i],
STARPU_SCRATCH, workspace, STARPU_W, output[i], 0);

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 GPU 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.

Parallel Tasks

StarPU can leverage existing parallel computation libraries by the means of parallel tasks. A parallel task is a task which gets worked on by a set of CPUs (called a parallel or combined worker) at the same time, by using an existing parallel CPU implementation of the computation to be achieved. This can also be useful to improve the load balance between slow CPUs and fast GPUs: since CPUs work collectively on a single task, the completion time of tasks on CPUs become comparable to the completion time on GPUs, thus relieving from granularity discrepancy concerns. hwloc support needs to be enabled to get good performance, otherwise StarPU will not know how to better group cores.

Two modes of execution exist to accomodate with existing usages.

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):

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},
.nbuffers = 1,
};

Other examples include for instance calling a BLAS parallel CPU implementation (see examples/mult/xgemm.c).

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:

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 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 },
.where = STARP_CPU,
.type = STARPU_SPMD,
.max_parallelism = INT_MAX,
.cpu_funcs = { func},
.nbuffers = 1,
}

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.

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.

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 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 STARPU_SCHED has to be set to a combined worker-aware scheduler such as pheft or peager).

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 STARPU_SINGLE_COMBINED_WORKER to 1. StarPU will then run only one parallel task at a time (but other CPU and GPU tasks are not affected and can be run concurrently). The parallel task scheduler will however still however still try varying combined worker sizes to look for the most efficient ones.

applications

StarPU provides several tools to help debugging aplications. Execution traces can be generated and displayed graphically, see Generating Traces With FxT.

Some gdb helpers are also provided to show the whole StarPU state:

(gdb) source tools/gdbinit
(gdb) help starpu

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 STARPU_DISABLE_KERNELS environment variable can also be set to 1 to make StarPU do 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.

The Temanejo task debugger can also be used, see Using The Temanejo Task Debugger.

The Multiformat Interface

It may be interesting to represent the same piece of data using two different data structures: one that would only be used on CPUs, and one that would only be used on GPUs. This can be done by using the multiformat interface. StarPU will be able to convert data from one data structure to the other when needed. Note that the scheduler dmda is the only one optimized for this interface. The user must provide StarPU with conversion codelets:

#define NX 1024
struct point array_of_structs[NX];
/*
* 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 = {
.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 = {
.cpu_funcs = { opencl_to_cpu_func},
.nbuffers = 1,
.modes = { STARPU_RW }
};
#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 = 2 * sizeof(float),
...
};
starpu_multiformat_data_register(handle, 0, &array_of_structs, NX, &format_ops);

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.

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]);
...
}

A full example may be found in examples/basic_examples/multiformat.c.

Using The Driver API

Running Drivers

int ret;
struct starpu_driver = {
.id.cuda_id = 0
};
if (ret != 0)
error();
while (some_condition) {
if (ret != 0)
error();
}
if (ret != 0)
error();

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.

Defining A New Scheduling Policy

A full example showing how to define a new scheduling policy is available in the StarPU sources in the directory examples/scheduler/.

See Scheduling Policy

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,
.push_prio_task = NULL,
.pop_task = pop_task_dummy,
.post_exec_hook = NULL,
.pop_every_task = NULL,
.policy_name = "dummy",
.policy_description = "dummy scheduling strategy"
};

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 --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:

/* Get the CUDA worker id */
for (workerid = 0; workerid < starpu_worker_get_count(); workerid++)
break;
/* Build a CUDA pointer pointing at the OpenGL buffer */
cudaGraphicsResourceGetMappedPointer((void**)&output, &num_bytes, resource);
/* And register it to StarPU */
output, num_bytes / sizeof(float4), sizeof(float4));
/* The handle can now be used as usual */
starpu_insert_task(&cl, STARPU_RW, handle, 0);
/* ... */
/* This gets back data into the OpenGL buffer */

and display it e.g. in the callback function.

Defining A New Data Interface

Let's define a new data interface to manage complex numbers.

/* interface for complex numbers */
struct starpu_complex_interface
{
double *real;
double *imaginary;
int nx;
};

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.

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);
}

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.

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,
.interface_size = sizeof(struct starpu_complex_interface),
};

Functions need to be defined to access the different fields of the complex interface from a StarPU data handle.

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, 0);
return complex_interface->real;
}
double *starpu_complex_get_imaginary(starpu_data_handle_t handle);
int starpu_complex_get_nx(starpu_data_handle_t handle);

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.

#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)

Complex data interfaces can then be registered to StarPU.

double real = 45.0;
double imaginary = 12.0;
starpu_complex_data_register(&handle1, 0, &real, &imaginary, 1);
starpu_insert_task(&cl_display, STARPU_R, handle1, 0);

and used by codelets.

void display_complex_codelet(void *descr[], __attribute__ ((unused)) void *_args)
{
int nx = STARPU_COMPLEX_GET_NX(descr[0]);
double *real = STARPU_COMPLEX_GET_REAL(descr[0]);
double *imaginary = STARPU_COMPLEX_GET_IMAGINARY(descr[0]);
int i;
for(i=0 ; i<nx ; i++)
{
fprintf(stderr, "Complex[%d] = %3.2f + %3.2f i\n", i, real[i], imaginary[i]);
}
}

The whole code for this complex data interface is available in the directory examples/interface/.

Setting The Data Handles For A Task

The number of data a task can manage is fixed by the environment variable STARPU_NMAXBUFS which has a default value which can be changed through the configure option --enable-maxbuffers.

However, it is possible to define tasks managing more data by using the field starpu_task::dyn_handles when defining a task and the field starpu_codelet::dyn_modes when defining the corresponding codelet.

};
struct starpu_codelet dummy_big_cl =
{
.cuda_funcs = {dummy_big_kernel},
.opencl_funcs = {dummy_big_kernel},
.cpu_funcs = {dummy_big_kernel},
.nbuffers = STARPU_NMAXBUFS+1,
.dyn_modes = modes
};
task->cl = &dummy_big_cl;
task->dyn_handles = malloc(task->cl->nbuffers * sizeof(starpu_data_handle_t));
for(i=0 ; i<task->cl->nbuffers ; i++)
{
task->dyn_handles[i] = handle;
}
starpu_data_handle_t *handles = malloc(dummy_big_cl.nbuffers * sizeof(starpu_data_handle_t));
for(i=0 ; i<dummy_big_cl.nbuffers ; i++)
{
handles[i] = handle;
}
starpu_insert_task(&dummy_big_cl,
STARPU_VALUE, &dummy_big_cl.nbuffers, sizeof(dummy_big_cl.nbuffers),
STARPU_DATA_ARRAY, handles, dummy_big_cl.nbuffers,
0);

The whole code for this complex data interface is available in the directory examples/basic_examples/dynamic_handles.c.

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 STARPU_NMAXBUFS) with the node numbers where data should be copied to, or -1 to let StarPU copy it to the memory node where the task will be executed. For instance, with the following codelet:

struct starpu_codelet cl =
{
.cuda_funcs = { kernel},
.nbuffers = 2,
.modes = {STARPU_RW, STARPU_RW},
.specific_nodes = 1,
.nodes = {0, -1},
};

the first data of the task will be kept in the main memory, while the second data will be copied to the CUDA GPU as usual.

More Examples

More examples are 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 Basic Examples), matrix product examples (as shown in 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.
fortran/
Example of Fortran bindings.

More advanced examples include:

filters/
Examples using filters, as shown in Partitioning Data.
lu/
LU matrix factorization, see for instance xlu_implicit.c
cholesky/
Cholesky matrix factorization, see for instance cholesky_implicit.c.
starpu-1.1.5/doc/doxygen/html/starpu__profiling_8h_source.html0000644000373600000000000011137112571536757021555 00000000000000 StarPU Handbook: starpu_profiling.h Source File
starpu_profiling.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_PROFILING_H__
19 #define __STARPU_PROFILING_H__
20 
21 #include <starpu.h>
22 #include <errno.h>
23 #include <time.h>
24 #include <starpu_util.h>
25 
26 #ifdef __cplusplus
27 extern "C"
28 {
29 #endif
30 
31 #define STARPU_PROFILING_DISABLE 0
32 #define STARPU_PROFILING_ENABLE 1
33 
35 {
36  struct timespec submit_time;
37 
38  struct timespec push_start_time;
39  struct timespec push_end_time;
40  struct timespec pop_start_time;
41  struct timespec pop_end_time;
42 
43  struct timespec acquire_data_start_time;
44  struct timespec acquire_data_end_time;
45 
46  struct timespec start_time;
47  struct timespec end_time;
48 
49  struct timespec release_data_start_time;
50  struct timespec release_data_end_time;
51 
52  struct timespec callback_start_time;
53  struct timespec callback_end_time;
54 
55  /* TODO add expected length, expected start/end ? */
56  int workerid;
57 
58  uint64_t used_cycles;
59  uint64_t stall_cycles;
61 };
62 
64 {
65  struct timespec start_time;
66  struct timespec total_time;
67  struct timespec executing_time;
68  struct timespec sleeping_time;
70 
71  uint64_t used_cycles;
72  uint64_t stall_cycles;
74 };
75 
77 {
78  struct timespec start_time;
79  struct timespec total_time;
80  int long long transferred_bytes;
82 };
83 
85 void starpu_profiling_set_id(int new_id);
86 int starpu_profiling_status_set(int status);
88 
89 #ifdef BUILDING_STARPU
90 #include <common/utils.h>
91 #ifdef __GNUC__
92 extern int _starpu_profiling;
93 #define starpu_profiling_status_get() ({ \
94  int __ret; \
95  ANNOTATE_HAPPENS_AFTER(&_starpu_profiling); \
96  __ret = _starpu_profiling; \
97  ANNOTATE_HAPPENS_BEFORE(&_starpu_profiling); \
98  __ret; \
99 })
100 #endif
101 #endif
102 
103 int starpu_profiling_worker_get_info(int workerid, struct starpu_profiling_worker_info *worker_info);
104 
105 int starpu_bus_get_count(void);
106 int starpu_bus_get_id(int src, int dst);
107 int starpu_bus_get_src(int busid);
108 int starpu_bus_get_dst(int busid);
109 
110 int starpu_bus_get_profiling_info(int busid, struct starpu_profiling_bus_info *bus_info);
111 
112 /* Some helper functions to manipulate profiling API output */
113 /* Reset timespec */
114 static __starpu_inline void starpu_timespec_clear(struct timespec *tsp)
115 {
116  tsp->tv_sec = 0;
117  tsp->tv_nsec = 0;
118 }
119 
120 /* Computes result = a + b */
121 static __starpu_inline void starpu_timespec_add(struct timespec *a,
122  struct timespec *b,
123  struct timespec *result)
124 {
125  result->tv_sec = a->tv_sec + b->tv_sec;
126  result->tv_nsec = a->tv_nsec + b->tv_nsec;
127 
128  if (result->tv_nsec >= 1000000000)
129  {
130  ++(result)->tv_sec;
131  result->tv_nsec -= 1000000000;
132  }
133 }
134 
135 /* Computes res += b */
136 static __starpu_inline void starpu_timespec_accumulate(struct timespec *result,
137  struct timespec *a)
138 {
139  result->tv_sec += a->tv_sec;
140  result->tv_nsec += a->tv_nsec;
141 
142  if (result->tv_nsec >= 1000000000)
143  {
144  ++(result)->tv_sec;
145  result->tv_nsec -= 1000000000;
146  }
147 }
148 
149 /* Computes result = a - b */
150 static __starpu_inline void starpu_timespec_sub(const struct timespec *a,
151  const struct timespec *b,
152  struct timespec *result)
153 {
154  result->tv_sec = a->tv_sec - b->tv_sec;
155  result->tv_nsec = a->tv_nsec - b->tv_nsec;
156 
157  if ((result)->tv_nsec < 0)
158  {
159  --(result)->tv_sec;
160  result->tv_nsec += 1000000000;
161  }
162 }
163 
164 #define starpu_timespec_cmp(a, b, CMP) \
165  (((a)->tv_sec == (b)->tv_sec) ? ((a)->tv_nsec CMP (b)->tv_nsec) : ((a)->tv_sec CMP (b)->tv_sec))
166 
167 double starpu_timing_timespec_delay_us(struct timespec *start, struct timespec *end);
168 double starpu_timing_timespec_to_us(struct timespec *ts);
169 
172 
173 #ifdef __cplusplus
174 }
175 #endif
176 
177 #endif /* __STARPU_PROFILING_H__ */
starpu-1.1.5/doc/doxygen/html/group__API__StarPUTop__Interface.html0000644000373600000000000014131012571536763022224 00000000000000 StarPU Handbook: StarPU-Top Interface
StarPU Handbook
StarPU-Top Interface

Data Structures

struct  starpu_top_data
struct  starpu_top_param

Enumerations

enum  starpu_top_data_type { STARPU_TOP_DATA_BOOLEAN, STARPU_TOP_DATA_INTEGER, STARPU_TOP_DATA_FLOAT }
enum  starpu_top_param_type { STARPU_TOP_PARAM_BOOLEAN, STARPU_TOP_PARAM_INTEGER, STARPU_TOP_PARAM_FLOAT, STARPU_TOP_PARAM_ENUM }
enum  starpu_top_message_type {
  TOP_TYPE_GO, TOP_TYPE_SET, TOP_TYPE_CONTINUE, TOP_TYPE_ENABLE,
  TOP_TYPE_DISABLE, TOP_TYPE_DEBUG, TOP_TYPE_UNKNOW
}

Functions to call before the initialisation

struct starpu_top_datastarpu_top_add_data_boolean (const char *data_name, int active)
struct starpu_top_datastarpu_top_add_data_integer (const char *data_name, int minimum_value, int maximum_value, int active)
struct starpu_top_datastarpu_top_add_data_float (const char *data_name, double minimum_value, double maximum_value, int active)
struct starpu_top_paramstarpu_top_register_parameter_boolean (const char *param_name, int *parameter_field, void(*callback)(struct starpu_top_param *))
struct starpu_top_paramstarpu_top_register_parameter_float (const char *param_name, double *parameter_field, double minimum_value, double maximum_value, void(*callback)(struct starpu_top_param *))
struct starpu_top_paramstarpu_top_register_parameter_integer (const char *param_name, int *parameter_field, int minimum_value, int maximum_value, void(*callback)(struct starpu_top_param *))
struct starpu_top_paramstarpu_top_register_parameter_enum (const char *param_name, int *parameter_field, char **values, int nb_values, void(*callback)(struct starpu_top_param *))

Initialisation

void starpu_top_init_and_wait (const char *server_name)

To call after initialisation

void starpu_top_update_parameter (const struct starpu_top_param *param)
void starpu_top_update_data_boolean (const struct starpu_top_data *data, int value)
void starpu_top_update_data_integer (const struct starpu_top_data *data, int value)
void starpu_top_update_data_float (const struct starpu_top_data *data, double value)
void starpu_top_task_prevision (struct starpu_task *task, int devid, unsigned long long start, unsigned long long end)
void starpu_top_debug_log (const char *message)
void starpu_top_debug_lock (const char *message)

Detailed Description


Data Structure Documentation

struct starpu_top_data

todo

Data Fields
unsigned int id todo
const char * name todo
int int_min_value todo
int int_max_value todo
double double_min_value todo
double double_max_value todo
int active todo
enum starpu_top_data_type type todo
struct starpu_top_data * next todo
struct starpu_top_param

todo

Data Fields

unsigned int id
const char * name
enum starpu_top_param_type type
void * value
char ** enum_values
int nb_values
void(* callback )(struct starpu_top_param *)
int int_min_value
int int_max_value
double double_min_value
double double_max_value
struct starpu_top_paramnext

Field Documentation

starpu_top_param::id

todo

starpu_top_param::name

todo

starpu_top_param::type

todo

starpu_top_param::value

todo

starpu_top_param::enum_values

only for enum type can be NULL

starpu_top_param::nb_values

todo

starpu_top_param::callback

todo

starpu_top_param::int_min_value

only for integer type

starpu_top_param::int_max_value

todo

starpu_top_param::double_min_value

only for double type

starpu_top_param::double_max_value

todo

starpu_top_param::next

todo

Enumeration Type Documentation

StarPU-Top Data type

Enumerator:
STARPU_TOP_DATA_BOOLEAN 

todo

STARPU_TOP_DATA_INTEGER 

todo

STARPU_TOP_DATA_FLOAT 

todo

StarPU-Top Parameter type

Enumerator:
STARPU_TOP_PARAM_BOOLEAN 

todo

STARPU_TOP_PARAM_INTEGER 

todo

STARPU_TOP_PARAM_FLOAT 

todo

STARPU_TOP_PARAM_ENUM 

todo

StarPU-Top Message type

Enumerator:
TOP_TYPE_GO 

todo

TOP_TYPE_SET 

todo

TOP_TYPE_CONTINUE 

todo

TOP_TYPE_ENABLE 

todo

TOP_TYPE_DISABLE 

todo

TOP_TYPE_DEBUG 

todo

TOP_TYPE_UNKNOW 

todo

Function Documentation

struct starpu_top_data * starpu_top_add_data_boolean ( const char *  data_name,
int  active 
)
read

This fonction register a data named data_name of type boolean. If active=0, the value will NOT be displayed to user by default. Any other value will make the value displayed by default.

struct starpu_top_data * starpu_top_add_data_integer ( const char *  data_name,
int  minimum_value,
int  maximum_value,
int  active 
)
read

This fonction register a data named data_name of type integer. The minimum and maximum value will be usefull to define the scale in UI. If active=0, the value will NOT be displayed to user by default. Any other value will make the value displayed by default.

struct starpu_top_data * starpu_top_add_data_float ( const char *  data_name,
double  minimum_value,
double  maximum_value,
int  active 
)
read

This fonction register a data named data_name of type float. The minimum and maximum value will be usefull to define the scale in UI. If active=0, the value will NOT be displayed to user by default. Any other value will make the value displayed by default.

struct starpu_top_param * starpu_top_register_parameter_boolean ( const char *  param_name,
int *  parameter_field,
void(*)(struct starpu_top_param *)  callback 
)
read

This fonction register a parameter named parameter_name, of type boolean. The callback fonction will be called when the parameter is modified by UI, and can be null.

struct starpu_top_param * starpu_top_register_parameter_float ( const char *  param_name,
double *  parameter_field,
double  minimum_value,
double  maximum_value,
void(*)(struct starpu_top_param *)  callback 
)
read

his fonction register a parameter named param_name, of type integer. Minimum and maximum value will be used to prevent user seting incorrect value. The callback fonction will be called when the parameter is modified by UI, and can be null.

struct starpu_top_param * starpu_top_register_parameter_integer ( const char *  param_name,
int *  parameter_field,
int  minimum_value,
int  maximum_value,
void(*)(struct starpu_top_param *)  callback 
)
read

This fonction register a parameter named param_name, of type float. Minimum and maximum value will be used to prevent user seting incorrect value. The callback fonction will be called when the parameter is modified by UI, and can be null.

struct starpu_top_param * starpu_top_register_parameter_enum ( const char *  param_name,
int *  parameter_field,
char **  values,
int  nb_values,
void(*)(struct starpu_top_param *)  callback 
)
read

This fonction register a parameter named param_name, of type enum. Minimum and maximum value will be used to prevent user seting incorrect value. The callback fonction will be called when the parameter is modified by UI, and can be null.

void starpu_top_init_and_wait ( const char *  server_name)

This function must be called when all parameters and data have been registered AND initialised (for parameters). This function will wait for a TOP to connect, send initialisation sentences, and wait for the GO message.

void starpu_top_update_parameter ( const struct starpu_top_param param)

This function should be called after every modification of a parameter from something other than starpu_top. This fonction notice UI that the configuration changed.

void starpu_top_update_data_boolean ( const struct starpu_top_data data,
int  value 
)

This function updates the value of the starpu_top_data on UI.

void starpu_top_update_data_integer ( const struct starpu_top_data data,
int  value 
)

This function updates the value of the starpu_top_data on UI.

void starpu_top_update_data_float ( const struct starpu_top_data data,
double  value 
)

This function updates the value of the starpu_top_data on UI.

void starpu_top_task_prevision ( struct starpu_task task,
int  devid,
unsigned long long  start,
unsigned long long  end 
)

This function notifies UI than the task have been planed to run from start to end, on computation-core.

void starpu_top_debug_log ( const char *  message)

This function is useful in debug mode. The starpu developper doesn't need to check if the debug mode is active. This is checked by starpu_top itsefl. It just send a message to display by UI.

void starpu_top_debug_lock ( const char *  message)

This function is useful in debug mode. The starpu developper doesn't need to check if the debug mode is active. This is checked by starpu_top itsefl. It send a message and wait for a continue message from UI to return. The lock (wich create a stop-point) should be called only by the main thread. Calling it from more than one thread is not supported.

starpu-1.1.5/doc/doxygen/html/starpufft_8h_source.html0000644000373600000000000003651612571536757020054 00000000000000 StarPU Handbook: starpufft.h Source File
starpufft.h
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009, 2011 Université de Bordeaux
4  * Copyright (C) 2010, 2012 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #include <stdio.h>
19 #include <complex.h>
20 #include <starpu.h>
21 #ifdef STARPU_USE_CUDA
22 #include <cufft.h>
23 #define STARPU_CUFFT_REPORT_ERROR(status) \
24  STARPUFFT(report_error)(__starpu_func__, __FILE__, __LINE__, status)
25 #endif /* !STARPU_USE_CUDA */
26 
27 #define STARPUFFT_FORWARD -1
28 #define STARPUFFT_INVERSE 1
29 
30 #define __STARPUFFT(name) starpufft_##name
31 #define __STARPUFFTF(name) starpufftf_##name
32 #define __STARPUFFTL(name) starpufftl_##name
33 
34 #define __STARPUFFT_INTERFACE(starpufft,real) \
35 typedef real _Complex starpufft(complex); \
36 \
37 typedef struct starpufft(plan) *starpufft(plan); \
38 \
39 starpufft(plan) starpufft(plan_dft_1d)(int n, int sign, unsigned flags); \
40 starpufft(plan) starpufft(plan_dft_2d)(int n, int m, int sign, unsigned flags); \
41 starpufft(plan) starpufft(plan_dft_r2c_1d)(int n, unsigned flags); \
42 starpufft(plan) starpufft(plan_dft_c2r_1d)(int n, unsigned flags); \
43 \
44 void *starpufft(malloc)(size_t n); \
45 void starpufft(free)(void *p); \
46 \
47 int starpufft(execute)(starpufft(plan) p, void *in, void *out); \
48 struct starpu_task *starpufft(start)(starpufft(plan) p, void *in, void *out); \
49 \
50 int starpufft(execute_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \
51 struct starpu_task *starpufft(start_handle)(starpufft(plan) p, starpu_data_handle_t in, starpu_data_handle_t out); \
52 \
53 void starpufft(cleanup)(starpufft(plan) p); \
54 void starpufft(destroy_plan)(starpufft(plan) p); \
55 \
56 void starpufft(startstats)(void); \
57 void starpufft(stopstats)(void); \
58 void starpufft(showstats)(FILE *out);
59 
60 __STARPUFFT_INTERFACE(__STARPUFFT, double)
61 __STARPUFFT_INTERFACE(__STARPUFFTF, float)
62 __STARPUFFT_INTERFACE(__STARPUFFTL, long double)
63 
64 /* Internal use */
65 extern int starpufft_last_plan_number;
starpu-1.1.5/doc/doxygen/html/starpu__config_8h.html0000644000373600000000000005260012571536757017450 00000000000000 StarPU Handbook: starpu_config.h File Reference
starpu_config.h File Reference
#include <sys/types.h>

Go to the source code of this file.

Macros

#define STARPU_MAJOR_VERSION
#define STARPU_MINOR_VERSION
#define STARPU_RELEASE_VERSION
#define STARPU_USE_CPU
#define STARPU_USE_CUDA
#define STARPU_USE_OPENCL
#define STARPU_SIMGRID
#define STARPU_HAVE_SIMGRID_MSG_H
#define STARPU_HAVE_ICC
#define STARPU_ATLAS
#define STARPU_GOTO
#define STARPU_MKL
#define STARPU_SYSTEM_BLAS
#define STARPU_BUILD_DIR
#define STARPU_OPENCL_DATADIR
#define STARPU_HAVE_MAGMA
#define STARPU_OPENGL_RENDER
#define STARPU_USE_GTK
#define STARPU_HAVE_X11
#define STARPU_HAVE_POSIX_MEMALIGN
#define STARPU_HAVE_MEMALIGN
#define STARPU_HAVE_MALLOC_H
#define STARPU_HAVE_SYNC_BOOL_COMPARE_AND_SWAP
#define STARPU_HAVE_SYNC_FETCH_AND_ADD
#define STARPU_HAVE_SYNC_FETCH_AND_OR
#define STARPU_HAVE_SYNC_LOCK_TEST_AND_SET
#define STARPU_HAVE_SYNC_SYNCHRONIZE
#define STARPU_MODEL_DEBUG
#define STARPU_NO_ASSERT
#define STARPU_HAVE_FFTW
#define STARPU_HAVE_FFTWF
#define STARPU_HAVE_FFTWL
#define STARPU_HAVE_CURAND
#define STARPU_MAXNODES
#define STARPU_NMAXBUFS
#define STARPU_MAXCPUS
#define STARPU_MAXCUDADEVS
#define STARPU_MAXOPENCLDEVS
#define STARPU_NMAXWORKERS
#define STARPU_NMAX_SCHED_CTXS
#define STARPU_MAXIMPLEMENTATIONS
#define STARPU_USE_SC_HYPERVISOR
#define STARPU_HAVE_GLPK_H
#define STARPU_HAVE_LIBNUMA
#define STARPU_HAVE_WINDOWS
#define STARPU_HAVE_UNSETENV
#define __starpu_func__
#define __starpu_inline
#define STARPU_QUICK_CHECK
#define STARPU_USE_DRAND48
#define STARPU_USE_ERAND48_R
#define STARPU_HAVE_NEARBYINTF
#define STARPU_HAVE_RINTF
#define STARPU_USE_TOP
#define STARPU_HAVE_HWLOC
#define STARPU_HAVE_PTHREAD_BARRIER
#define STARPU_HAVE_STRUCT_TIMESPEC
#define STARPU_HAVE_HELGRIND_H
Initialisation
#define STARPU_USE_MPI

Typedefs

typedef ssize_t starpu_ssize_t

Detailed Description

starpu-1.1.5/doc/doxygen/html/ftv2mnode.png0000644000373600000000000000036612571536757015575 00000000000000PNG  IHDRɪ|IDATx!NA\ Um@`5i`h W7] b&ofdY4 c 3v=]\B I=BB;k WN@vy4]Y|M}]x6a }dׇY>||5?>|B"'IENDB`starpu-1.1.5/doc/doxygen/html/FFTSupport.html0000644000373600000000000001763212571536762016065 00000000000000 StarPU Handbook: FFT Support
FFT Support

StarPU provides libstarpufft, a library whose design is very similar to both fftw and cufft, the difference being that it takes benefit from both CPUs and GPUs. It should however be noted that GPUs do not have the same precision as CPUs, so the results may different by a negligible amount.

Different precisions are available, namely float, double and long double precisions, with the following fftw naming conventions:

  • double precision structures and functions are named e.g. starpufft_execute()
  • float precision structures and functions are named e.g. starpufftf_execute()
  • long double precision structures and functions are named e.g. starpufftl_execute()

The documentation below is given with names for double precision, replace starpufft_ with starpufftf_ or starpufftl_ as appropriate.

Only complex numbers are supported at the moment.

The application has to call starpu_init() before calling starpufft functions.

Either main memory pointers or data handles can be provided.

All functions are defined in FFT Support.

Compilation

The flags required to compile or link against the FFT library are accessible with the following commands:

$ pkg-config --cflags starpufft-1.1  # options for the compiler
$ pkg-config --libs starpufft-1.1    # options for the linker

Also pass the option –static if the application is to be linked statically.

starpu-1.1.5/doc/doxygen/html/starpu_non_linear_memset_regression_based.png0000644000373600000000000002055112571536761024354 00000000000000PNG  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.1.5/doc/doxygen/html/SchedulingContexts.html0000644000373600000000000003474012571536762017665 00000000000000 StarPU Handbook: Scheduling Contexts
Scheduling Contexts

TODO: improve!

General Ideas

Scheduling contexts represent abstracts sets of workers that allow the programmers to control the distribution of computational resources (i.e. CPUs and GPUs) to concurrent parallel kernels. The main goal is to minimize interferences between the execution of multiple parallel kernels, by partitioning the underlying pool of workers using contexts.

Creating A Context

By default, the application submits tasks to an initial context, which disposes of all the computation resources available to StarPU (all the workers). If the application programmer plans to launch several parallel kernels simultaneously, by default these kernels will be executed within this initial context, using a single scheduler policy(see Task Scheduling Policy). 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 (Scheduling Context Hypervisor)

Both cases require a call to the function starpu_sched_ctx_create, which requires as input the worker list (the exact list or a NULL pointer) and the scheduling policy. The latter one can be a character list corresponding to the name of a StarPU predefined policy or the pointer to a custom policy. The function returns an identifier of the context created which you will use to indicate the context you want to submit the tasks to.

/* the list of resources the context will manage */
int workerids[3] = {1, 3, 10};
/* indicate the scheduling policy to be used within the context, the list of
workers assigned to it, the number of workers, the name of the context */
int id_ctx = starpu_sched_ctx_create("dmda", workerids, 3, "my_ctx");
/* let StarPU know that the following tasks will be submitted to this context */
starpu_sched_ctx_set_task_context(id);
/* submit the task to StarPU */

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.

Modifying A Context

A scheduling context can be modified dynamically. The applications may change its requirements during the execution and the programmer can add additional workers to a context or remove if no longer needed. In the following example we have two scheduling contexts sched_ctx1 and sched_ctx2. After executing a part of the tasks some of the workers of sched_ctx1 will be moved to context sched_ctx2.

/* 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);

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 STARPU_SCHED_CTX for starpu_insert_task.

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).

/* 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 */
/* wait for the tasks of both contexts to finish */
/* delete context 2 */
/* delete context 1 */

Emptying A Context

A context may have no resources at the begining or at a certain moment of the execution. Task can still be submitted to these contexts and they will be executed as soon as the contexts will have resources. A list of tasks pending to be executed is kept and when workers are added to the contexts these tasks start being submitted. However, if resources are never allocated to the context the program will not terminate. If these tasks have low priority the programmer can forbid the application to submit them by calling the function starpu_sched_ctx_stop_task_submission().

Contexts Sharing Workers

Contexts may share workers when a single context cannot execute efficiently enough alone on these workers or when the application decides to express a hierarchy of contexts. The workers apply an alogrithm of ``Round-Robin'' to chose the context on which they will ``pop'' next. By using the function starpu_sched_ctx_set_turn_to_other_ctx, the programmer can impose the workerid to ``pop'' in the context sched_ctx_id next.

starpu-1.1.5/doc/doxygen/html/starpu__bound_8h_source.html0000644000373600000000000003024412571536757020672 00000000000000 StarPU Handbook: starpu_bound.h Source File
starpu_bound.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2011 Université de Bordeaux
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef __STARPU_BOUND_H__
18 #define __STARPU_BOUND_H__
19 
20 #include <stdio.h>
21 
22 #ifdef __cplusplus
23 extern "C"
24 {
25 #endif
26 
27 void starpu_bound_start(int deps, int prio);
28 void starpu_bound_stop(void);
29 
30 void starpu_bound_print_dot(FILE *output);
31 
32 void starpu_bound_compute(double *res, double *integer_res, int integer);
33 
34 void starpu_bound_print_lp(FILE *output);
35 void starpu_bound_print_mps(FILE *output);
36 void starpu_bound_print(FILE *output, int integer);
37 
38 #ifdef __cplusplus
39 }
40 #endif
41 
42 #endif /* __STARPU_BOUND_H__ */
starpu-1.1.5/doc/doxygen/html/tasks_size_overhead.png0000644000373600000000000006613112571536760017721 00000000000000PNG  IHDRb pHYs  ~tIME )H IDATx{x[WU[iBvڦHr&ʱݦ"ama IX043Јpf`KXSne ÔV2}a}w{"J)RaSY_yۻ:D봗̃Pv~*?ìf>}s jPB!g˱crc͚56m!Ls' aϮD*-~B!EJH)0]/}U_i}B\BR*q2H8[,Re!xB!UÀx`p%d75-b2L&P2BY:2>L #ӡ-QuObRX,@{R !CƉd+Nv޻#iV"BH%&,|" Haln8eݶn!Bumw}Gm_>~uݑ-/pĉ794֊iD!c !;;;xl<|x7Wrt69s3A!0=r7,R?~|A4X,x<O]AB!-s={N8+6ovo9p*0I* ~?H0&R0D uشiUW]\[kwRX7.KRXzNa4h4 u]w"BrAqF:z1/]< q0RIhC&iUB)XupClgqm]{r~~Y&^۽M Z@4L&#*M!PO![$:nxѴ{k:N{ DF~$i91O!-eCA s_?_bLbuC$x<>99kYv-\U^xuNB:ʑ\RyDwݼyGU&[3@gbG2`KA s'ͬPo^F.t᧮;;gdfɷ֬r#q6 000PH$244Ts8 !iF\@JiF٧J`躞`YV"D"AJ!u0QEѨC,KաP  9ah4H${ t갸b9 DŒ%P>(BH'þSRJ)L !֬???_Yu1#e@BH!!DVPq=+D fYk(V?2y!^ u )!n|(E\0a6/L|z (BHaŊWyLSrot0!j℅ItS RJH]&~GVƷBY:x< lC!LV0::g۷o/l1y`؃fx<m) @5^fM_5B:LMMtJa7HizBhuOO pXE'wU4B!UW7^uU23buWKђ qM9 H$ qJ BȊա N=KEWXLU&HX%095T'ע Ӏa0 p !ZR:(P6U!#^RQrYMizi+躮^ 9BB@-%u("b.xy(@h~GQMӔ4T*%j_;!h\u0 EUJWf pfEeԴ\S aNJ44k݊B)3n˅ӕC%.㞿^MZѨJu2~mq _.=zzBu(D龑.~Z:TZ!eQ)Ph޽jK&Yn{K HoLBH u"gzu0G2=;+7ˢ1h@M~^S %eBAHϺSSSS!ȏӸLݧ5cdA\"Hx 100ЮJtW},˲,RIA!R.a! Aa1eK#o4ξw|` K3ԗlHĽ%Z DR`0dTʚ&QgMA!uII wtJϞ<[Η,H@DX,6==]:܍3b1)u}hhv8KPA:!3'i1EuX(20NJ'O}kP=jbl:4mrr!(bAhu=+&0S}f4k{u_?ҲT*544ijZ5!}hv*)RY+vϊJt@ 5{oURPhًps iMFB!튐"WT dv|5 !T [d>oӽze\S_Xv^[-5!t*1eAuPlW*xbY߯N*>ŚݹOmB%V>EW {ix Q@ v 7!L?pP+ȗ,82vwwW5@ {Q{:y/Q]i=ou ܵkע7AUC*6"eAB!AJΦ|]73Yb?\sSO}3 Cy۶WP GC 2ɴM!JI)-J$L&OͨZL& P(TgbN-,\!O$kWq̝Mgk7损_۷ #xh7{h"P5DO<bnYV@,]U1p8\n ~hPI4{+_9{~ GÇ/d IJɆRPc{֡ePi~?HFeo[c!@iiui4L"i8ds7FmwY^ !_ц!4-L5mQ!hVWOWrY`Ԗ O>?p;|羨+ ~#(FUTT*ԧsBH{H;nٳsuݶWY}l<+/[Zk Dkd`P?LH1;qaI0eFG7nSO=<31 _OgqGUo:( C,W̥pX%TVabbɷO> >wM^sB::LMOgAl<y1~jxhA@B)eiX]$ ?!}AJi&!Z^!b5bü| ƃp)EكaJY]~*uTk; !a׮]p: X{۾>\hf33jR N 4MK$N҃eYeZۃl(l~A^U5f>һ%.(AH$TJhTu% CCCpGdԪ%Q[sA 4:I9RJi 1 չY눅 D,s˄S: iY& Wl!!M}"-Ab$ >h.vN̗,gaި^"%?9B:xM:9::ꪫ\vw* _к-j1bR !4Zvϊ$PpȑM6娃ro|jy-/YSB :ض*%iӦJjbdz+JB!-ҸL Ҩ3%)BZAS>8u QB!}>_MÍHt <(u$D"K~ggGk( ? Y[L#˶GGG1: _pP U.Ԥ@4lStRJdTIWI>MDVRBH!)SG8m3saƌdr.}nEpgQwaL&sرGST 4mzzVBȊۦTQ jWi\הu]մTu,Ǎ6` *upQ龑i5|BM D3aYV&IRDDZ$zC* < UC291rBxBM DFH$244Tpx<^V-9aA:*W?F4&PKR !w,4MM;$p8+<_KbLi-O/>BS龑q9/*DYRTOOO(ڻw u}ll,G,A_*#L$T2JH^19]K{_@ldAӬ&{S}LlUt]\x_RKe B!%TJR&- `,s~X%!:D:HPrY$}x@:gәgh~TR:,HDUp BAiyuԄ0ԥ آa D4 zx(BV RJllYIdKCQ HiR u.pAuA,roL6Q !C ,p-X9gc#@?\u +hT moM!:bzPͧ*$Q|@˲T[L&)Rku@+^1a]:H) è5s K@DQ˲UUB!Se!oyMD^~?9F:Z^CC, Wha*І!E)(ZJՍ{韚S\4oH)tNIJBY Bg|uPxrz_ʑ\6gܐC EיĎP(lR g7%Kرc*b۶2=mܿ&=".„0ag~p]n,!a (++mضm直ňj{|rT2/F !T)owsJ˽߿d|ӷmD,hEN~7hLBӴD" e;_.%eD<W}*g}Vq#Xl H Hw?xӮڞd6=|uTwK237ρ ===BL&|!P(#tVdD"7Y٧/Og iuGDwߞ5u%Ǟuvx#n255CͧɎl-hva4Mg4u`@ @4{7~ՇS}$0Rqƒ >1.laﴅ8~߹p z-~?buXC}i}j} 0¹Yo"U94e%H$6!:Wo}h5O??-[# ƻ 5hi.h~<.DrgffqTI9DX,V7BR>`VR^sD$}b$ [o4;;{Igx'?sGmS[9믿As }zCNRdok1bd-BijicccB*TH qi@ߺuoڴqƓ'Os bbәe=bN 9,h1b<f@HGYIBuo߾%{مK{+x<}}}oi|^s];USP !\ueot/7/.I8pΗ?/k4aѹ 23BKW8]K_Ga,Umn͚SO?]9 9b !:`???_ۙ 24BCWcEu(U#JI)U L&DCL&' Lՠtd2hTTJBu0?~F:k|P5CUPge+DU4MuUeD"1005M4Y.(B ,뺞J,066VJϿg&QAs M?<ܕW/ebE|wvd xCwTpth %q6jW~HilT* hT D",KNR===x 5EfA/:l_: [PftHWH!%ziTT]UiܮjQUK}H/7!uS $bD UAJ))عsgWb DS!hTMpT9BP : zO|lz|֍7nϑjpML  E| FRt0ʤH D ǝVI0ϹiilIB~$,Whysȯ&qwwO\F+Up)ّzI$p"R}jm+G TpE9?G:KG0ff 4MBǼCd0~ؘJbX(ڻwD֭[Ŝ-%oDgmYABp2}|nTUb@d9 OݮP Zx< n{@6iwITu.ԂBjǷn#xeP2/. ΝC۪gd)mkȮH$Ni)˲r$D_rC:~ӊWf:iiǐe6uC DkH$TJ%hTP(dYV8 c4VaH)@0d2E J,8%+3UC9uXlEThcCQvc`ж҇رcHIu4Z>SӶa"oHseB>1Sq ۆm[ %86 IDAT ʽ TňR֝x`$!U:Ƿn=kWWr$K,\g|Ht{ZkA~I%\Rd5Xs!UP_맶o++3+Xܡ6]F]4N6 BȲ{9Ц7,(XDr;hbSN*CKS !)8鵇w՛(VvZdbGaʦl^i BGFdzUQ*V%s`gq4EA!W޵%s$W,lȡ 9F^oI(p;m^f\Yȡ4 :liEN!XL& ;DQRD/F===֭x>FzP&uGo?xŷͷ޺83f:K x<΄Js$`d$K5ߡ֨d>i#d ꟩i4-J :96eYbpةl] m:NBaꠢ;޽c$[턱՛0\Wޒ<jzNʱ%,C؞U-OBRMOĸorŇ}ЬqI"XdN-H'Pg@DQw5ֲ1D '@eYHMͻkzd zF6dmMW]I=\*-ˬNȡ}0',HҼS%-Afh4JAŲT*&,RT&q:esSP*WU/tdVgPNW'+{Z2!hC x~?n]ו iQ'wj.@롡@Ζgpp뮻;<5ĝoܸqA*XY"M@i -,K"~-Bռ[000݆ǝRa5Riʵ  wq .GHuG,Ey~~?c[fF9yO$|KO2U9T]h dy4ouuoi"rawܹl)8D׈ #"LƝ=CR1Xitww$HoAJ@uwغs7gn/NtX -% 1DiYVN_}f*iKuf,?ʩoc=ęۦ67n,]lB=ԗwP(Hb1U)arru+JB$0=ӏ|mS7b>~?~A:x<i[uR4ߤ\RAG%QV0䨃{Ç?1ϝ>{#@>f'Ib= 9+hd{Yr,#GruX@BZU3}@J-| bv&78}ybk҄C2Ѩg)Dy4Jb10֭[xѨP&b======a>:8=-G6n܈<1'= xܷXݰ,mf9UQ y<beY,+~]5MSTm:Ad>ń4:L Ƭ:/}^+/|B48ǷnJT9EMӂCS j!]קHR@ C F̠@&W^/7߿EYC+Jz+0miKUF۱inbպ D4b-`X)F(X9U(EPmN("B 'ͧ'?o7߿Ԃ/A-cxhd'[f5ʧyPx!D(L&J)ѨDT* WQ5Y8y#2={ȲݷbbbC'ȱّdAuF˞ĹsrlifZ}8*]eY9Mj}9b2 i^upNQEX xخU`0 :E*0~ؘҕjB) q~!HrqZ:C B 1BB3uavw [U`0ݶwdN_֨UR{X | C&Q*@ɢRHvhLL.lXa8t+uX,d,YlB. Bh|MI0~]ׇ. ҕ A \mD}1;a1xNMs!(#A}uT҅wgm,2$W UY5 ב4t@D`iIKeYC$yՉD"K)~(r Ie2xoĞ={s9_=~luxw|/9@V YoXr!!WGx;l<שJ)'#ΈD"9 "2HLOOw}SSS7nL*To m~8x;Gr9 MّՔ:Qr D@g4کbn2L8D"u zǜo ݻWmbXVaTb o v|cVT=z+~7nd -7{^ ǜD$q('{RZH$"FפsTk68h%;|>{R0t5M ̄Bcǎ9GlYZ'fg?ss}дm[ϔ79Ӷmömu{Wտ—FkE@d:d#f(+ԊUgvބgϞ />]ţ7uQ\&pd 9;5rVV" :FV7#`Pu 'Nv|{mѧvvCI͇>;a_+KX dVPT =Apz4 IޒT*@3_יVgWޟ*`ԛ]P[.)e(P%]B8\QVFX4@ FSrߟJu iΝ]T<6co_Nua)$`ٵd%m1H"RD"բu iُNr'nz׌KBV|I}bP>HBU]׫XY]gsssN'@7t&Mؽ{w_i3WlxE?+f%XM9Uhd~ŵ9 zNuEW Z}g_dP꠸d9Ǥ&]*X@HewUCer t]W8-TʲtSٓEMx]3Ȇ Bj,e*rG9(;G D8ηDwtqh4 R2C*2&&ݍ^LL ^+-/Q ?ݯjG~i ,i!]3\m/ nZb@Ȋ(x%!UJ*!ɨQ~ ArC1iXVuؕrJi@V-`X!ȟ?hO *Iu c" Rͪb4mΎ:f!č00iP%'ie(,:v{*n0:O=CsOO͖,3ي!gJ I#iex b1xUkKsFў300aݺuatHeQ )7\z_/_w{M @Bvh&Aw4arb@ U F'-JO$,+RdDi8뺪QmYVNH ,Kdܿz/T%snѱi{ F *l=%UHjlllll4M!j?=D-$BR)ROOO۶===4z\pUR* s|}wJUJB]/ l=(3[,Xܨ|=dNYF *\4MMTH@D"ηJ*k \}뺦i9J}vlg,Lž+VQ!-2bYw(Ars4r&uw1wC&QTT*djZWcxJЇ> f H yǷſwחv|̕P h^)V&45f2>cdgFU䠒Rr)iZ<u]=40 FKӴjQ|81X:u}u#w^fɕNi!s( t@mG& HqPߺa(P~F;qGMpXVBʕ Z5wX"zi G?rȝ̾7G( ޽{slFرc94+BLU Ywʟpo}9>ysg?ztKK8 IDAT}Blբy萟DB:,ⴲwjF*rL&u2GdFUPC0TjBEq腳ڳv/G@x8Ie Wux01+=M6M!tELw!CDiHWaB8Q'O  A˲ ~QD"D=x<>44f.T%(!sܜ ^GD"$=XHdS2w 볟岃^^a +О4pnR@ L #& g޽{@ BR)){J,S[[d2{:J144{zzLFJiZU̝ٔ,ANJRW/M2׃jXiYY7-s@)A_@ct*#A];":Dc P]PkrrRUR֕//-DeB},\6C˿Ͻ޼)P8IhXEQ}켄i 9(S: *CJzzzjr/ iU`Q4yE.ևk 2[&R">1Lah6== ?MjZԎ\{Y:<]݇cquH, .Y.ЪA}$T2N)ұQɳ'Np9twD Bg:M{.1 =FRi#,,HeR}(B6 t =BQ 2L<O$2`0 8H3?=@2 !Ԋ-ˊFTJUcL$pQe.ѨQ%._ggn)~#ܖk^k=^!ػXF)(*r!܄$+Bv0Һ F7Rn!#OOObU&۸Sy䇮wd˖-sss^w||u+ s_5ls/0MLDJ )ar>@oQe'.tAo7U8  Oy3_c{f94u1R!:클@8XdR7ǥCCCm"PͅnHRxܲ,U3 9T*2x́W-?[ Z3sF8uXQ(x_^.ΟdG9PEB:kTi-뺮&,ܫRS N^:Q˿Yoxmǡ7ܨvę۾^Q1КQ;{ s^uQ$9Wd /JѮQE;/XD"֪444dF PVUhR4TMx\u畒[^zçN1௿|=ui{h:Cg:u,6qP A}hiRCB,5âUCbrr2ؘ*έiZ$QnszY_lKO=7\#'Nc7f? !1\Ֆіߏdߏ+,*$HТ%JJ!e cvZt7'ͨS?=!LF/9(N7,v415\sFG[ 3 |><$ygs]N0lW<\kyScY.,0?9ckh":bP:JR.,Y|ѾnKpl53 o@o/W41is :wMXA,X6 O΂M=!(ɥ=fa[Ta!u8 xXBE(kW2E m?!DuL3XVV) Ϗ!:P) ()* $TI:4:\ܷoCS͸Fx:8%H.ӔDK:A_o_֤U ̇E>"T٬2a~G"jz{_[8٥CR8p/յ@]¨w ECP Hco?zFn?u]V]ѱEJ58PJ~6@!*X !(B>οո r^=4C aegxs%>#+0Hҟ@n(gF+/Rzb]L)I%lI3bR H]g[ߐe KBJx7SJ7o )'&$J`v?'qE b]3=;W/,(lHx)蝅zM+'d8T1ůM *bI(Y7Ipn-/ɳa:g+ L ٍ^1H;2?x7>=!Hk+]b`k^gwF/R+3CQb3FĈ>s1 `brV&f dtź V4yE.__}K{ (_[*麒BMRE{@vbڻw:_=5]t/xEd|{{= x}W_u+!VC __{.k.m~ Oyp;>|lV0ŁBH eYp@0b!795| ]nLU0@!P Yƽ{; SBHÄʙ|*!P :;nͿak/3; BwL'~d~;a>x֜yY_=a! D{sɞO xYKŠލşZ.׻x\ !CDR`UqFk=0p^V[׋> =Y{su^/-!,Wtvci C { DKq+xC'nRtbPFV|}Ha0 C2 njJ!a=t&baWxo=>q ^xحq G`x !)MsdS@ vN?$dO{S"V(u{ŷ='OG?Eu9~% cAl FΉ7(6p 2`J·9z5=t"!h Nof70AMXB![>R3ffwAKaipA{`tPª;|C`u_>+Q\~o^wlꇹP$GNLs!LgjsP Ct|Y tɐ!PvfI# 69S ^,GRyPQ% Lx݁u2=;Ӏ1!.G(h9Pv?i=OhHȿ|_nֆa WUSS[zԏC"gy] ܎IU#߱'tJ.7m#%J$l $pO*5ubt Jָ.Ww 3)|#يFz9D';3PZ3lVUxkΑC4=+|*t0]M\-xE'4B Etm/NaTWNXOtp7ZnLPS@?6n78R&%V'F$ oiu#ڐm8~`@9+Oֵ͏"`im6,qLw%t? F"xH>>Çr_'䉬G5C3΂_b(2?}[ʿޤ7]D䔈N5f6 N?Ε&3:l4@xWjCR~k?bvߖo_K=rϰ5 *=!6jҰbWkL6OߵyWGyLu}Kt=C@;=7Cl)U mg%S{ #ߒ[fZӃ-1,:|8~Fhz+چ8l{/Rz/SEK'3#Ts0? 1-}o/tۘΡGW^-;CїlA>w:Mzt6Frvr !:gfFAVN2K5&ImZ_KnHHzӒB^|#g\wID֟Vb$-5Ҷ"O{|ybpW"W}{tgrWyPoCQ?':Ͽ+}L|\YfɧmfT>g:ꇖNqAIK"WH Jt3?ƭ5FB NۏIrz+7/e+++CGo^MO`{y?Dg{C>7ȨwUm='kkrLO_y]ޭ~ffFq[O~?ROE׿;N]]ێ|SS&뉁1{bd@}HpL<&krȆ8뭈"~x)ZR+_^zf+ƭ"c5 $IeYr9Ðo_wD?{s՟yϊ""N1M9bCU~~b3UCa(2D 8dfESp.:,G'b$SG&~p=}wM,.d=[ mKs(I4I E(+|y|+K3cg]/Ȋ25:q_6$m $rdZ^'ß9xE9q\]97.l#@$o+I9OYumlfZ$ @h O}#Ԡ];8ŚIc^剧{''թtNw#I@ "*@&!2paȓmoQZ|zSxą޲BOHE# 6JdIu IDATsشu=5@pwlyS](;n' 5U6It5:QKK""εGZ,IoAM'DGځ|a;˺xQ.^\ueEdrRr3OO%Heey 2e .=2}[?uJN|OlkL&e#Gzp{AjYw$@$1^%6T!,-I6BgO*CE~ފk!'I ߈"&Q? @m-1kkmkmFI "`[ځpXZ=$"ط:161zI$@DF]$whiY{:/g"en0vbTZ3_eԅj2W=EW._e/+ڛ)t|=Sh@Y-hCRI8ݾkk6M?>3aj-DdwF  0"Ibn5n0 =I{st%3m߾k oxQNZo30+_U2!UMՔ!"#@3Pբ: @@7y@9P^֘C 8<00 rIJ8]J>_ dqzBDi.,,FQ. h6|7(n(mj]mX%"I@۶4`h TYbfW曓OMMihS@9Pv13@ Xb` ܅8N[ m; lЃHH 1j $I277gYf3"uLDoQA.,˵Z8Joy @ @i6AxwA0|K4R4;;;;;yB`0 04\wuWҘ=x𠆻FF7RIdR5 cnnRDQ04-Io۶eYiFQEiZ ,UqGQi۩+ѹ,t2eYsssIX8B>oYVq M0 nߨR$mj0 0\XXPwؾhj4Fj-,,HZm… .\΅jThiu]uաSW+қ*r=B2i;b=UK?l==a욯~uGΓK˲[h(8/\T{|NO7ǢLTVk~di6jvݓ$IӴlXRj}o6 wf:,ft2jm۶mo:2al6w_ GIh[wժLjlyGKqFQԇ<5\4ZVύF<6z1&8T*:Ws,ngqah44\dǥR) C=[ՀAuLRNm٩uU}!zimǎ`uuU9o/K m{E^HV㐨}HjN2JeY*FP eٶpտM`D,)ui{\=\">m:@ZM\qx֭¨^Myg?=$IEٴ(pB._jF7Qq&qGmZ JdnnNUǵB:Yͦzhh;}~o{{UP # 4Mb%0vRUY͚'x(n8EzIe^ ˲}@ ȨjY-RD;'I"ahK27]rZ-bF -zժ/dP?FQԶ3T׀zD]Q0@XAlnu"\u'MS. Umn8I$c5lBDjyOeioj͹̆Yy3EJeX$IJR\6M3M(T@ƐeYz]S?o4Bj>c5\.ahAk4D@ [x6`sS.,,a xTWXlu=¶jOض=??dZ-Jl c   "*EIENDB`starpu-1.1.5/doc/doxygen/html/sc__hypervisor__lp_8h_source.html0000644000373600000000000005545212571536757021726 00000000000000 StarPU Handbook: sc_hypervisor_lp.h Source File
sc_hypervisor_lp.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2013 INRIA
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 #ifndef SC_HYPERVISOR_LP_H
18 #define SC_HYPERVISOR_LP_H
19 
20 #include <sc_hypervisor.h>
21 #include <starpu_config.h>
22 
23 #ifdef __cplusplus
24 extern "C"
25 {
26 #endif
27 
28 /*
29  * GNU Linear Programming Kit backend
30  */
31 #ifdef STARPU_HAVE_GLPK_H
32 #include <glpk.h>
33 #endif //STARPU_HAVE_GLPK_H
34 
36 struct types_of_workers;
37 /* returns tmax, and computes in table res the nr of workers needed by each context st the system ends up in the smallest tmax*/
38 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);
39 
40 /* returns tmax of the system */
41 double sc_hypervisor_lp_get_tmax(int nw, int *workers);
42 
43 /* the linear programme determins a rational number of ressources for each ctx, we round them depending on the type of ressource */
44 void sc_hypervisor_lp_round_double_to_int(int ns, int nw, double res[ns][nw], int res_rounded[ns][nw]);
45 
46 /* redistribute the ressource in contexts by assigning the first x available ressources to each one */
47 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);
48 
49 /* make the first distribution of ressource in contexts by assigning the first x available ressources to each one */
50 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);
51 
52 /* place resources in contexts dependig on whether they already have workers or not */
53 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);
54 
55 /* not used resources are shared between all contexts */
56 void sc_hypervisor_lp_share_remaining_resources(int ns, unsigned *sched_ctxs, int nworkers, int *workers);
57 
58 /* dichotomy btw t1 & t2 */
59 double sc_hypervisor_lp_find_tmax(double t1, double t2);
60 
61 /* execute the lp trough dichotomy */
62 unsigned sc_hypervisor_lp_execute_dichotomy(int ns, int nw, double w_in_s[ns][nw], unsigned solve_lp_integer, void *specific_data,
63  double tmin, double tmax, double smallest_tmax,
64  double (*lp_estimated_distrib_func)(int ns, int nw, double draft_w_in_s[ns][nw],
65  unsigned is_integer, double tmax, void *specifc_data));
66 
67 #ifdef STARPU_HAVE_GLPK_H
68 /* linear program that returns 1/tmax, and computes in table res the nr of workers needed by each context st
69  the system ends up in the smallest tmax*/
70 double sc_hypervisor_lp_simulate_distrib_flops(int nsched_ctxs, int ntypes_of_workers, double speed[nsched_ctxs][ntypes_of_workers],
71  double flops[nsched_ctxs], double res[nsched_ctxs][ntypes_of_workers], int total_nw[ntypes_of_workers],
72  unsigned sched_ctxs[nsched_ctxs], double vmax);
73 
74 /* linear program that simulates a distribution of tasks that minimises the execution time of the tasks in the pool */
75 double sc_hypervisor_lp_simulate_distrib_tasks(int ns, int nw, int nt, double w_in_s[ns][nw], double tasks[nw][nt],
76  double times[nw][nt], unsigned is_integer, double tmax, unsigned *in_sched_ctxs,
77  struct sc_hypervisor_policy_task_pool *tmp_task_pools);
78 
79 /* linear program that simulates a distribution of flops over the workers on particular sample of the execution
80  of the application such that the entire sample would finish in a minimum amount of time */
81 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,
82  double **speed, double flops[ns], double **final_flops_on_w);
83 #endif // STARPU_HAVE_GLPK_H
84 
85 #ifdef __cplusplus
86 }
87 #endif
88 
89 #endif
starpu-1.1.5/doc/doxygen/html/starpu__driver_8h_source.html0000644000373600000000000003603012571536757021055 00000000000000 StarPU Handbook: starpu_driver.h Source File
starpu_driver.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2009-2013 Université de Bordeaux
4  * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_DRIVER_H__
19 #define __STARPU_DRIVER_H__
20 
21 #include <starpu_config.h>
22 #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__)
23 #include <starpu_opencl.h>
24 #endif
25 
26 #ifdef __cplusplus
27 extern "C"
28 {
29 #endif
30 
32 {
34  union
35  {
36  unsigned cpu_id;
37  unsigned cuda_id;
38 #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__)
39  cl_device_id opencl_id;
40 #elif defined(STARPU_SIMGRID)
41  unsigned opencl_id;
42 #endif
43  } id;
44 };
45 
46 int starpu_driver_run(struct starpu_driver *d);
48 
49 int starpu_driver_init(struct starpu_driver *d);
51 int starpu_driver_deinit(struct starpu_driver *d);
52 
53 #ifdef __cplusplus
54 }
55 #endif
56 
57 #endif /* __STARPU_DRIVER_H__ */
starpu-1.1.5/doc/doxygen/html/nav_g.png0000644000373600000000000000013712571536757014757 00000000000000PNG  IHDR1&IDATx1 OHf_ ->~M iMS<IENDB`starpu-1.1.5/doc/doxygen/html/dir_bfc149d6adddbd740b500817bd909996.html0000644000373600000000000001522512571536763021353 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/sc_hypervisor/include/ Directory Reference
include Directory Reference
starpu-1.1.5/doc/doxygen/html/dir_0e66ac16851b3c6cadc08f94da74ca64.html0000644000373600000000000001267512571536763021425 00000000000000 StarPU Handbook: /net/dalton/nfurmento/softs/starpu/soft/tags/starpu-1.1.5/mpi/include/ Directory Reference
include Directory Reference

Files

file  starpu_mpi.h [code]
starpu-1.1.5/doc/doxygen/html/starpu__top_8h.html0000644000373600000000000004131012571536757017001 00000000000000 StarPU Handbook: starpu_top.h File Reference
starpu_top.h File Reference
#include <starpu.h>
#include <stdlib.h>
#include <time.h>

Go to the source code of this file.

Data Structures

struct  starpu_top_data
struct  starpu_top_param

Enumerations

enum  starpu_top_data_type { STARPU_TOP_DATA_BOOLEAN, STARPU_TOP_DATA_INTEGER, STARPU_TOP_DATA_FLOAT }
enum  starpu_top_param_type { STARPU_TOP_PARAM_BOOLEAN, STARPU_TOP_PARAM_INTEGER, STARPU_TOP_PARAM_FLOAT, STARPU_TOP_PARAM_ENUM }
enum  starpu_top_message_type {
  TOP_TYPE_GO, TOP_TYPE_SET, TOP_TYPE_CONTINUE, TOP_TYPE_ENABLE,
  TOP_TYPE_DISABLE, TOP_TYPE_DEBUG, TOP_TYPE_UNKNOW
}

Functions

Functions to call before the initialisation
struct starpu_top_datastarpu_top_add_data_boolean (const char *data_name, int active)
struct starpu_top_datastarpu_top_add_data_integer (const char *data_name, int minimum_value, int maximum_value, int active)
struct starpu_top_datastarpu_top_add_data_float (const char *data_name, double minimum_value, double maximum_value, int active)
struct starpu_top_paramstarpu_top_register_parameter_boolean (const char *param_name, int *parameter_field, void(*callback)(struct starpu_top_param *))
struct starpu_top_paramstarpu_top_register_parameter_integer (const char *param_name, int *parameter_field, int minimum_value, int maximum_value, void(*callback)(struct starpu_top_param *))
struct starpu_top_paramstarpu_top_register_parameter_float (const char *param_name, double *parameter_field, double minimum_value, double maximum_value, void(*callback)(struct starpu_top_param *))
struct starpu_top_paramstarpu_top_register_parameter_enum (const char *param_name, int *parameter_field, char **values, int nb_values, void(*callback)(struct starpu_top_param *))
Initialisation
void starpu_top_init_and_wait (const char *server_name)
To call after initialisation
void starpu_top_update_parameter (const struct starpu_top_param *param)
void starpu_top_update_data_boolean (const struct starpu_top_data *data, int value)
void starpu_top_update_data_integer (const struct starpu_top_data *data, int value)
void starpu_top_update_data_float (const struct starpu_top_data *data, double value)
void starpu_top_task_prevision (struct starpu_task *task, int devid, unsigned long long start, unsigned long long end)
void starpu_top_debug_log (const char *message)
void starpu_top_debug_lock (const char *message)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__opencl_8h.html0000644000373600000000000004247212571536757017471 00000000000000 StarPU Handbook: starpu_opencl.h File Reference
starpu_opencl.h File Reference
#include <starpu_config.h>
#include <CL/cl.h>
#include <assert.h>

Go to the source code of this file.

Data Structures

struct  starpu_opencl_program

Functions

cl_int starpu_opencl_allocate_memory (int devid, cl_mem *addr, size_t size, cl_mem_flags flags)
Writing OpenCL kernels
void starpu_opencl_get_context (int devid, cl_context *context)
void starpu_opencl_get_device (int devid, cl_device_id *device)
void starpu_opencl_get_queue (int devid, cl_command_queue *queue)
void starpu_opencl_get_current_context (cl_context *context)
void starpu_opencl_get_current_queue (cl_command_queue *queue)
int starpu_opencl_set_kernel_args (cl_int *err, cl_kernel *kernel,...)
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).

void starpu_opencl_load_program_source (const char *source_file_name, char *located_file_name, char *located_dir_name, char *opencl_program_source)
int starpu_opencl_compile_opencl_from_file (const char *source_file_name, const char *build_options)
int starpu_opencl_compile_opencl_from_string (const char *opencl_program_source, const char *file_name, const char *build_options)
int starpu_opencl_load_binary_opencl (const char *kernel_id, struct starpu_opencl_program *opencl_programs)
int starpu_opencl_load_opencl_from_file (const char *source_file_name, struct starpu_opencl_program *opencl_programs, const char *build_options)
int starpu_opencl_load_opencl_from_string (const char *opencl_program_source, struct starpu_opencl_program *opencl_programs, const char *build_options)
int starpu_opencl_unload_opencl (struct starpu_opencl_program *opencl_programs)
Loading OpenCL kernels
int starpu_opencl_load_kernel (cl_kernel *kernel, cl_command_queue *queue, struct starpu_opencl_program *opencl_programs, const char *kernel_name, int devid)
int starpu_opencl_release_kernel (cl_kernel kernel)
OpenCL statistics
int starpu_opencl_collect_stats (cl_event event)

OpenCL utilities

#define STARPU_OPENCL_DISPLAY_ERROR(status)
#define STARPU_OPENCL_REPORT_ERROR(status)
#define STARPU_OPENCL_REPORT_ERROR_WITH_MSG(msg, status)
const char * starpu_opencl_error_string (cl_int status)
void starpu_opencl_display_error (const char *func, const char *file, int line, const char *msg, cl_int status)
static __starpu_inline void starpu_opencl_report_error (const char *func, const char *file, int line, const char *msg, cl_int status)
cl_int starpu_opencl_copy_ram_to_opencl (void *ptr, unsigned src_node, cl_mem buffer, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret)
cl_int starpu_opencl_copy_opencl_to_ram (cl_mem buffer, unsigned src_node, void *ptr, unsigned dst_node, size_t size, size_t offset, cl_event *event, int *ret)
cl_int starpu_opencl_copy_opencl_to_opencl (cl_mem src, unsigned src_node, size_t src_offset, cl_mem dst, unsigned dst_node, size_t dst_offset, size_t size, cl_event *event, int *ret)
cl_int starpu_opencl_copy_async_sync (uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t size, cl_event *event)

Detailed Description

starpu-1.1.5/doc/doxygen/html/starpu__data__interfaces_8h_source.html0000644000373600000000000032504212571536757023041 00000000000000 StarPU Handbook: starpu_data_interfaces.h Source File
starpu_data_interfaces.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2014 Université de Bordeaux
4  * Copyright (C) 2010-2013 Centre National de la Recherche Scientifique
5  * Copyright (C) 2011-2012 Institut National de Recherche en Informatique et Automatique
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_DATA_INTERFACES_H__
20 #define __STARPU_DATA_INTERFACES_H__
21 
22 #include <starpu.h>
23 
24 #ifdef STARPU_USE_CUDA
25 /* to use CUDA streams */
26 # ifdef STARPU_DONT_INCLUDE_CUDA_HEADERS
27 typedef void *starpu_cudaStream_t;
28 # else
29 # include <cuda_runtime.h>
30 typedef cudaStream_t starpu_cudaStream_t;
31 # endif
32 #endif
33 
34 #ifdef __cplusplus
35 extern "C"
36 {
37 #endif
38 
40 {
41  int (*can_copy)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, unsigned handling_node);
42 
43  int (*ram_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
44  int (*ram_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
45  int (*ram_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
46 
47  int (*cuda_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
48  int (*cuda_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
49  int (*cuda_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
50 
51  int (*opencl_to_ram)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
52  int (*opencl_to_cuda)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
53  int (*opencl_to_opencl)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node);
54 
55 #ifdef STARPU_USE_CUDA
56  int (*ram_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream);
57  int (*cuda_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream);
58  int (*cuda_to_cuda_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, starpu_cudaStream_t stream);
59 #else
60 #ifdef STARPU_SIMGRID
62 #endif
63 #endif
64 
65 #if defined(STARPU_USE_OPENCL) && !defined(__CUDACC__)
66  int (*ram_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event);
67  int (*opencl_to_ram_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event);
68  int (*opencl_to_opencl_async)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, cl_event *event);
69 #endif
70 
71  int (*any_to_any)(void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, void *async_data);
72 };
73 
74 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);
75 uintptr_t starpu_malloc_on_node(unsigned dst_node, size_t size);
76 void starpu_free_on_node(unsigned dst_node, uintptr_t addr, size_t size);
77 
79 {
91 };
92 
94 {
96  unsigned home_node, void *data_interface);
97  starpu_ssize_t (*allocate_data_on_node)(void *data_interface, unsigned node);
98  void (*free_data_on_node)(void *data_interface, unsigned node);
100  void * (*handle_to_pointer)(starpu_data_handle_t handle, unsigned node);
101  size_t (*get_size)(starpu_data_handle_t handle);
102  uint32_t (*footprint)(starpu_data_handle_t handle);
103  int (*compare)(void *data_interface_a, void *data_interface_b);
104  void (*display)(starpu_data_handle_t handle, FILE *f);
107 
109  struct starpu_multiformat_data_interface_ops* (*get_mf_ops)(void *data_interface);
110 
111  int (*pack_data)(starpu_data_handle_t handle, unsigned node, void **ptr, starpu_ssize_t *count);
112  int (*unpack_data)(starpu_data_handle_t handle, unsigned node, void *ptr, size_t count);
113 };
114 
116 
117 void starpu_data_register(starpu_data_handle_t *handleptr, unsigned home_node, void *data_interface, struct starpu_data_interface_ops *ops);
118 void starpu_data_ptr_register(starpu_data_handle_t handle, unsigned node);
120 
121 void *starpu_data_handle_to_pointer(starpu_data_handle_t handle, unsigned node);
123 
124 void *starpu_data_get_interface_on_node(starpu_data_handle_t handle, unsigned memory_node);
125 
126 extern struct starpu_data_interface_ops starpu_interface_matrix_ops;
127 
129 {
130  uintptr_t ptr;
131  uintptr_t dev_handle;
132  size_t offset;
133  uint32_t nx;
134  uint32_t ny;
135  uint32_t ld;
136  size_t elemsize;
137 };
138 
139 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);
140 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);
146 
147 #define STARPU_MATRIX_GET_PTR(interface) (((struct starpu_matrix_interface *)(interface))->ptr)
148 #define STARPU_MATRIX_GET_DEV_HANDLE(interface) (((struct starpu_matrix_interface *)(interface))->dev_handle)
149 #define STARPU_MATRIX_GET_OFFSET(interface) (((struct starpu_matrix_interface *)(interface))->offset)
150 #define STARPU_MATRIX_GET_NX(interface) (((struct starpu_matrix_interface *)(interface))->nx)
151 #define STARPU_MATRIX_GET_NY(interface) (((struct starpu_matrix_interface *)(interface))->ny)
152 #define STARPU_MATRIX_GET_LD(interface) (((struct starpu_matrix_interface *)(interface))->ld)
153 #define STARPU_MATRIX_GET_ELEMSIZE(interface) (((struct starpu_matrix_interface *)(interface))->elemsize)
154 
156 {
157  uint32_t *columns;
158  uint32_t *rows;
159  uintptr_t values;
160  uint32_t nx;
161  uint32_t ny;
162  uint32_t n_values;
163  size_t elemsize;
164 };
165 
166 void starpu_coo_data_register(starpu_data_handle_t *handleptr, unsigned home_node, uint32_t nx, uint32_t ny, uint32_t n_values, uint32_t *columns, uint32_t *rows, uintptr_t values, size_t elemsize);
167 
168 #define STARPU_COO_GET_COLUMNS(interface) \
169  (((struct starpu_coo_interface *)(interface))->columns)
170 #define STARPU_COO_GET_COLUMNS_DEV_HANDLE(interface) \
171  (((struct starpu_coo_interface *)(interface))->columns)
172 #define STARPU_COO_GET_ROWS(interface) \
173  (((struct starpu_coo_interface *)(interface))->rows)
174 #define STARPU_COO_GET_ROWS_DEV_HANDLE(interface) \
175  (((struct starpu_coo_interface *)(interface))->rows)
176 #define STARPU_COO_GET_VALUES(interface) \
177  (((struct starpu_coo_interface *)(interface))->values)
178 #define STARPU_COO_GET_VALUES_DEV_HANDLE(interface) \
179  (((struct starpu_coo_interface *)(interface))->values)
180 #define STARPU_COO_GET_OFFSET 0
181 #define STARPU_COO_GET_NX(interface) \
182  (((struct starpu_coo_interface *)(interface))->nx)
183 #define STARPU_COO_GET_NY(interface) \
184  (((struct starpu_coo_interface *)(interface))->ny)
185 #define STARPU_COO_GET_NVALUES(interface) \
186  (((struct starpu_coo_interface *)(interface))->n_values)
187 #define STARPU_COO_GET_ELEMSIZE(interface) \
188  (((struct starpu_coo_interface *)(interface))->elemsize)
189 
190 /* TODO: rename to 3dmatrix? */
192 {
193  uintptr_t ptr;
194  uintptr_t dev_handle;
195  size_t offset;
196  uint32_t nx;
197  uint32_t ny;
198  uint32_t nz;
199  uint32_t ldy;
200  uint32_t ldz;
201  size_t elemsize;
202 };
203 
204 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);
205 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);
213 
214 #define STARPU_BLOCK_GET_PTR(interface) (((struct starpu_block_interface *)(interface))->ptr)
215 #define STARPU_BLOCK_GET_DEV_HANDLE(interface) (((struct starpu_block_interface *)(interface))->dev_handle)
216 #define STARPU_BLOCK_GET_OFFSET(interface) (((struct starpu_block_interface *)(interface))->offset)
217 #define STARPU_BLOCK_GET_NX(interface) (((struct starpu_block_interface *)(interface))->nx)
218 #define STARPU_BLOCK_GET_NY(interface) (((struct starpu_block_interface *)(interface))->ny)
219 #define STARPU_BLOCK_GET_NZ(interface) (((struct starpu_block_interface *)(interface))->nz)
220 #define STARPU_BLOCK_GET_LDY(interface) (((struct starpu_block_interface *)(interface))->ldy)
221 #define STARPU_BLOCK_GET_LDZ(interface) (((struct starpu_block_interface *)(interface))->ldz)
222 #define STARPU_BLOCK_GET_ELEMSIZE(interface) (((struct starpu_block_interface *)(interface))->elemsize)
223 
225 {
226  uintptr_t ptr;
227  uintptr_t dev_handle;
228  size_t offset;
229  uint32_t nx;
230  size_t elemsize;
231 };
232 
233 void starpu_vector_data_register(starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, uint32_t nx, size_t elemsize);
234 void starpu_vector_ptr_register(starpu_data_handle_t handle, unsigned node, uintptr_t ptr, uintptr_t dev_handle, size_t offset);
238 
239 #define STARPU_VECTOR_GET_PTR(interface) (((struct starpu_vector_interface *)(interface))->ptr)
240 #define STARPU_VECTOR_GET_DEV_HANDLE(interface) (((struct starpu_vector_interface *)(interface))->dev_handle)
241 #define STARPU_VECTOR_GET_OFFSET(interface) (((struct starpu_vector_interface *)(interface))->offset)
242 #define STARPU_VECTOR_GET_NX(interface) (((struct starpu_vector_interface *)(interface))->nx)
243 #define STARPU_VECTOR_GET_ELEMSIZE(interface) (((struct starpu_vector_interface *)(interface))->elemsize)
244 
246 {
247  uintptr_t ptr;
248  size_t elemsize;
249  /* No dev_handle, since it can not be filtered, offset will always be zero */
250 };
251 
252 void starpu_variable_data_register(starpu_data_handle_t *handle, unsigned home_node, uintptr_t ptr, size_t size);
255 
256 #define STARPU_VARIABLE_GET_PTR(interface) (((struct starpu_variable_interface *)(interface))->ptr)
257 #define STARPU_VARIABLE_GET_ELEMSIZE(interface) (((struct starpu_variable_interface *)(interface))->elemsize)
258 #define STARPU_VARIABLE_GET_DEV_HANDLE(interface) \
259  (((struct starpu_variable_interface *)(interface))->ptr)
260 #define STARPU_VARIABLE_GET_OFFSET 0
261 
263 
265 {
266  uint32_t nnz;
267  uint32_t nrow;
268  uintptr_t nzval;
269  uint32_t *colind;
270  uint32_t *rowptr;
271 
272  uint32_t firstentry;
273 
274  size_t elemsize;
275 };
276 
277 void starpu_csr_data_register(starpu_data_handle_t *handle, unsigned home_node, uint32_t nnz, uint32_t nrow, uintptr_t nzval, uint32_t *colind, uint32_t *rowptr, uint32_t firstentry, size_t elemsize);
285 
286 #define STARPU_CSR_GET_NNZ(interface) (((struct starpu_csr_interface *)(interface))->nnz)
287 #define STARPU_CSR_GET_NROW(interface) (((struct starpu_csr_interface *)(interface))->nrow)
288 #define STARPU_CSR_GET_NZVAL(interface) (((struct starpu_csr_interface *)(interface))->nzval)
289 #define STARPU_CSR_GET_NZVAL_DEV_HANDLE(interface) \
290  (((struct starpu_csr_interface *)(interface))->nnz)
291 #define STARPU_CSR_GET_COLIND(interface) (((struct starpu_csr_interface *)(interface))->colind)
292 #define STARPU_CSR_GET_COLIND_DEV_HANDLE(interface) \
293  (((struct starpu_csr_interface *)(interface))->colind)
294 #define STARPU_CSR_GET_ROWPTR(interface) (((struct starpu_csr_interface *)(interface))->rowptr)
295 #define STARPU_CSR_GET_ROWPTR_DEV_HANDLE(interface) \
296  (((struct starpu_csr_interface *)(interface))->rowptr)
297 #define STARPU_CSR_GET_OFFSET 0
298 #define STARPU_CSR_GET_FIRSTENTRY(interface) (((struct starpu_csr_interface *)(interface))->firstentry)
299 #define STARPU_CSR_GET_ELEMSIZE(interface) (((struct starpu_csr_interface *)(interface))->elemsize)
300 
302 {
303  uint32_t nnz;
304  uint32_t nrow;
305 
306  uintptr_t nzval;
307  uint32_t *colind;
308  uint32_t *rowptr;
309 
310  uint32_t firstentry;
311 
312  uint32_t r;
313  uint32_t c;
314 
315  size_t elemsize;
316 };
317 
318 void starpu_bcsr_data_register(starpu_data_handle_t *handle, unsigned 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);
319 
320 #define STARPU_BCSR_GET_NNZ(interface) (((struct starpu_bcsr_interface *)(interface))->nnz)
321 #define STARPU_BCSR_GET_NZVAL(interface) (((struct starpu_bcsr_interface *)(interface))->nzval)
322 #define STARPU_BCSR_GET_NZVAL_DEV_HANDLE(interface) \
323  (((struct starpu_bcsr_interface *)(interface))->nnz)
324 #define STARPU_BCSR_GET_COLIND(interface) (((struct starpu_bcsr_interface *)(interface))->colind)
325 #define STARPU_BCSR_GET_COLIND_DEV_HANDLE(interface) \
326  (((struct starpu_bcsr_interface *)(interface))->colind)
327 #define STARPU_BCSR_GET_ROWPTR(interface) (((struct starpu_bcsr_interface *)(interface))->rowptr)
328 #define STARPU_BCSR_GET_ROWPTR_DEV_HANDLE(interface) \
329  (((struct starpu_bcsr_interface *)(interface))->rowptr)
330 #define STARPU_BCSR_GET_OFFSET 0
337 uint32_t starpu_bcsr_get_r(starpu_data_handle_t handle);
338 uint32_t starpu_bcsr_get_c(starpu_data_handle_t handle);
340 
342 {
343  size_t cpu_elemsize;
350 };
351 
353 {
354  void *cpu_ptr;
355  void *cuda_ptr;
356  void *opencl_ptr;
357  uint32_t nx;
359 };
360 
361 void starpu_multiformat_data_register(starpu_data_handle_t *handle, unsigned home_node, void *ptr, uint32_t nobjects, struct starpu_multiformat_data_interface_ops *format_ops);
362 
363 #define STARPU_MULTIFORMAT_GET_CPU_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->cpu_ptr)
364 #define STARPU_MULTIFORMAT_GET_CUDA_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->cuda_ptr)
365 #define STARPU_MULTIFORMAT_GET_OPENCL_PTR(interface) (((struct starpu_multiformat_interface *)(interface))->opencl_ptr)
366 #define STARPU_MULTIFORMAT_GET_NX(interface) (((struct starpu_multiformat_interface *)(interface))->nx)
367 
369 
370 int starpu_data_pack(starpu_data_handle_t handle, void **ptr, starpu_ssize_t *count);
371 int starpu_data_unpack(starpu_data_handle_t handle, void *ptr, size_t count);
373 
375 
376 #ifdef __cplusplus
377 }
378 #endif
379 
380 #endif /* __STARPU_DATA_INTERFACES_H__ */
starpu-1.1.5/doc/doxygen/html/starpu_starpu_slu_lu_model_11.png0000644000373600000000000001671512571536761021651 00000000000000PNG  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>( StarPU Handbook: Data Fields - Variables
StarPU Handbook
starpu-1.1.5/doc/doxygen/starpu.pdf0000644000373600000000000560260112571536773014233 00000000000000%PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 828 /Length 1610 /Filter /FlateDecode >> stream xY[o6~Z`k;k$+qh*g5(G>%ډ!,QΕB YHQ 5, nRxn6xaJ @)J%^RZ;+}uq-KRB*iFaB c#\c L.C^0AX dPEa9p@%^+ux B"_Zz@| ㊏Yy 0`)-%4I* Bh ܥ? Kh%(; @B9]6D<Aј K0HXØ;'h2\}{(^ơ28!Wq)YGz S˼/A_0Uj ?!CM0ɯ֟ A֒qazH:_3HZ OESWO] s}rcp0^q'R U-ݎv⺭a.i N1ZO> 9тmo5F+uЄK?"Zص~F12'f&\jͷ _zFJZ;b"RS2߇e;"I {XL]!'nFWk9'􏼔}i1;<פT5EU*4hYrPxqѴ,6Ցy*̹[V}u_f-Vt䛥Q+ՓޱzW? dhө3"I7VFq=dc_L[["C ۝Eu\l]!>[29'4kY[G筺ytS)?$:Q8K2]YvM(>E5jJ5Qdxշ:^|Lw\Yxc>5C[~ '^56);"3.1uj njkq+-QTWpem{ѽ9l<%:}۟BxqC|p"$=m6xCk/xH^:NﲚÄy#?OD?2d-[W7q_Qp~!(^$, FAjkm]6 8p9|ۚ:\Hmn.tcgzq۠% ;xFQ'L"Ox+kg3 Ǻ3ȝT}O NWe8h; vw#s˾z7kաUF8GY[k/i<.x@'WM8qƦ6x7l}̕UFe"PKϚnqT/C endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 887 /Length 1686 /Filter /FlateDecode >> stream xYMo7Wcn|um4NzE؈2UR]+vЃ(JKͼ7RxKcWEPƻ.nD$ޝ*ZYJQWz$eYDҊRb-kU)Je*L4&abDYUaRCEIjr#!!6X QB_c0=&LCjZ56Kҧu1VA_ eๅPK-d ^[Cυ**Nfk7NbH:%"U H*<\9Ŷ$j!&6Z2.B -&0Nְ X0!_@mځrv&0lWq#MIi Eq  M?Tk+1Ac !40ASC6"`P`҆|1!Gb" 3 VuF V5-[Jm  lk% gL Z8ZXXUȐ oe§:Fl<>(_!/hr)G7^EP"!xpg1^f!3NR撉,(:|}YBon7mMWm8N<7?IcN$!캟s~ T%x2gB'CGU^Orcc<x0<č칻 MMblÕ9u"jfܙ!t.o X&(b%j/[R8R B_piSI e1%-yC-wF NYe89tמ)aC]pnbm0H M oxk[804F,xkz#;)[mb7Y̛T.܋x{@+~4A9Hu⬹8J]/î8܎lb 1晱u^o HaXvnXOx\g꓉ݾ^> stream xY[s7~#̔kg:@ e Si8NpqL¯'SYe7N]rwV55L5Ics&S04Iq>≟LiB2m@ ŌoscmyV*<MU¥'\:@Q b1zfbH?db@_9ƭw5(`4(,nMÄ𰍄xM;P'QZ4Ѐ[XSU˪[:@)^-'b@9!e8&5V_j/E T-k0Hk(;E7B f=-BI⅄&4̦4 hyp9V9_!o;,ϓ 45/`!0`Am HMPvڿs x0\2#xiA4 y͊m=CÌq5,d,iX8!SjaA¸^Um 'a0`,hCY%K9-@}9аuкB8f[Кma=xs`A'xt"Ϟ4M7\7S }ѹof9iT3ş|3wbD&|8%R4uF54I,Jԇ1&g}^-{&e!69Ѻ&DzDZ}C=7?6{cͮ_l<-gP"Cbysl֝a/X"+DѓؚD&!0HN+v$~GB#) 'ġ@;cDhHj˝R`} 9_vH^R.uA2皔wL(HoWޒ/3`kyI95$sHb[uPNHGX>%2G3U웝b/'JC,w x6}{c [ulGܷ1ZoB{^uE c&CesEw}^S䏉MI(>5T-xm5rcR]@ïO(` ",c̊/Iȟ.,k/y)4{K"E>MRi*$^gnjP;\Sei^|~m%JY&qXXjl"{U)xG{ͩY4vE˜I'yG&5elq? `,v' }wL}W^_2ZPs2^Ne-o ̹79Y9v]6^I??\DZ0OQi*)S#~'.2qs> =\9lN9tW ~=1=dY~C#Љ tǭYb_\qq iR@n_CU,vRN X& endstream endobj 605 0 obj << /Type /ObjStm /N 100 /First 885 /Length 1505 /Filter /FlateDecode >> stream xYKS[7WhdC޺30tڴ4ٰqyLAH~}s[,_Y$K|;UFTUAhZJ 'PS mh4U%Xoi~P= E"NM3^HpZjkёB@3FH+m+dthd_c kt Pg!6XuJit:.#asF(#sV([Ӛ v$xPBwl]AB2XѪ=,(%rql֠Uvdr i!9~_Ar0HAt]۪+HkRU-I;-5:;SK7l8_G{Rݻޫ3YUU',D-5̹i#j.9C)5}jfͽdxyfy#=bUCj!m^ aqm,L}y,q-5qž`dS!gmd>I&syS‡'&);?F{mǔDQ>=;ְdΒ>_8n:ɕۮ\<鵄F=955lS0Et)P穛g*I\׸XCbZ0bArW"xNY)kˉ|sBRQm[gd>]lg[S`ƙ9̟Ŀ/r\VUA7}"w?͂=ֽ%nYpTx/K }$qX8F1+cRkOU@.RV7f՞'|ϔ7gRGR/}X 1K=;S[k%>)cVyHaf@|,f_hf6a]a\EN=V2^v/i6-MʖNi6R3E2|Uy~gE຅yJRXwėys;>w_e:"ջe.} endstream endobj 806 0 obj << /Type /ObjStm /N 100 /First 888 /Length 1328 /Filter /FlateDecode >> stream xXNG}߯G}.ɲ8V\$^Eqϩah%驮:UzJIyĀ_ ezn\|*[ż*ߠӽl"opMWk0`ZXp^y&A< ư\eo" Lҡ}TAdO",Npj^uBde-h $Q!HM u;MZ: ą́orf)+!g8X2,! BBVH+9 ELgB+#.{Hr,ڄKY3H$7o8 C{bp#{%籴G/h0C%` f.؀`0x pgB@6 '0=!E.X:#,;:"jBC.`t.FD!,tR x Ƅ\_"'`$04P2 &X pza49LJB6!$[Y%NѠ0%hC ArkvֶFZ{^oN`4\5iծUZQo^񟎵c>p5WuRJl x66V <ׅv؆F\kws> ֶ:bLN\5]os;w&gl]1|4h:6Yi:+GbF~^u܍gZCO2sٮNt Mk k qnˡ2z/dݹ /(v><$QؖaIf{veJ|~6eHdg}s#{!N4f m~?7] qm2WzzT bs WJTC˅qU1}č/SǓY^kr ua(l3}T rc/JB[w~z^(mIs4};HV*ضfJ 3s{y]h5@6D/);Oս6 -{%?YTM ݺ*n?pR5bx%HzV ff׳~Uaf~e#^u/"s}mj}-{I$Ż$QتE4bCiyH :g fސ)QwW跷֣[{ m%t6[QxפQ?{(h_&NEx4WۉǏ^i<`0i4-;zۜm4j0q}!Wz= endstream endobj 1007 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1244 /Filter /FlateDecode >> stream xXMSG+h.bzz*I8.8%!ƆBr^JȻ['mݳY5dɚ?Y@0Γh| $(&rp$afdgwؔV"J4DPI`kb%GXĎ,b®"1;0.^G(,"G",cPQ9b aq+J@ȑظlj&UX"3E]kuHJ9{DGN@It@Q,Ṕ/%rH:Q$2Yi oK @P4@]xFC&:_QOUߗ ~啢nM7Yv Xi#4ot6T=x.AfGy8+Z{MmZzI~Gd{S뵳U[s g(8Q oAGLM7FGhqd+Wfyoy`S]hWq׷u&فZ;qh:Q۹q>w~\60=3U_ie]+f~?,'Yf,dF/`䍚VϏ\iusUNy;,J[noTe yّ?Zu{l߮](TH; LBmځ**hj4|~RB?Bnax ܷ3oy Rۧ‡7߆*V׿f|^Ln8fnq;p6GR4Jzl/pQ\)WẫX8|}QF ̻|x g<Ǒ|ua 7)F`K-t~>0-_tS-q4ZVѨXq]?yÜ^g6ο]Nuz endstream endobj 1208 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1395 /Filter /FlateDecode >> stream xYS#7 ~e[ʹv::/P w$slJI(-QHR*x>'@>0Cu0Z_R0Q8j@0r`)Iy@)o (=P7%Q0!|m+9eVC:ZP-`PXZzDkS%+,r4rn}@G`n@Nb|Di=pRqm)D[9Fpd’GR EދnٍOmR>,wjuj7n.7Dp;"p*dix ,Qf+"xllG(/^r;YN/{;:;abÞϻk;!|7,$~Z ڼ+\Е 瓌kvuU=ta+n5`{ϫ[$)dէg;~Ov?NQՑoYm]a׋$l~X-/nʅ5, >}Vm8|T}Wpmb UOvF~}n(X= Fi )Mz:vEJ早F]M+aB(hC|s3E2} f62?ɖAܪy8C`4 K7]S[qeFOfj٥E+nۮwX[梱{_6G履kHW|CCʹnʥ9߳KQfzxj=, endstream endobj 1409 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1208 /Filter /FlateDecode >> stream xXOG~_vwvEj!MB)%GZpCfmϘw373w7!'D] xk(g{D+|61 @1\!orgR G%6%|gYLTdmaY .H (H}4Q,M9J +Q `D)$ Rk$ [tB$Q@lOQ0*}9C$9Ja+-f¯ 45L(, cl㌎s圤Xg8"(V"zAyQ"{YGezP9MdUG9Fcr b e_f5vr}Uwݿ⮚V˚.Tׅ^~˷szi_TW^7L$|b]}S9dT-jeG~<6㿚SKuD+ü~l﷍[Q^@ެaQnq)*+j5o>L22E5O)aQ}rJWm6uahݻ眉F̉b~lV]uC1/ꕳIG~d/G<Rwpo&Ⱥ|WʫJگBg_cFQQhkwXF'UpT^vskK:?Qxo)]]9(uFrp|O{q=`CsL+C+8vhdލB!(λң֍ӹa> stream xWnG}W#}n !EM֘\c6d޵| _sZg^`XrmOu9ubJ+S/MqDY$Rcѱ*^AEmD%d1i`;6֤c]Y&"kׄ1@&!b 6P" 8eV -) Qa5@6j4:j*LY bVVl@ f5qQWN'"Ezg *AP8+DrN/e x^rR,5rAQ#KYKCh7쮠uEterLj.<-V' D %t!s6 N33Di+XL&# endstream endobj 1811 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1240 /Filter /FlateDecode >> stream xZn7+xL.2!gH )hң/$'B˰d pPw- GC{:.9kqb$) Eὡ,jΫ&FVC Aֈg0I)\ +[jẳY- n@V .1d8DP KїmNt.yԙ D0Fc1>& gJN^H#2C)ʂ+fA, D/b]9!e 1C~ f䝸`i  ]Zd  X/F`9\9΅ҁJ&":)2 Զ>"; xD*GҼdH%CsӸ{_kboU{es*u=]_x7v /YLvmX;=+_KG#^Ve&nsݵpwWkrgJ$Hd+FqDծG/C=q,>}c׵ƣn;Dg2^ Ow <5O[S?^ݗLjýoeI6S8Y? endstream endobj 2012 0 obj << /Type /ObjStm /N 100 /First 987 /Length 1394 /Filter /FlateDecode >> stream xY]O[9}cmhBw/-Z in&E3ǞsؾsV29qL‡T1V=NELUM0V9W0:ҘJZAi)Ͱ2s!*)| :["auhF[pF G#Yp^@`a*Q8ȣIY3*4#Ȇ@ YXhMRrSMI9ܲbd7^ VB9+ R.WlYX$0XJ#m716LP#0YAyOiҐaiԎ-Ao>[M*07 !hHy0a%̓scT<πu<$h=b@rk4+(Vi=$1:4v1hHظ!_R12hM1<TҼ y<deH{J.>.yCY)pNy )"4O1>hg#l!FȕAlYX566 81U:zVãZPG7_:>^tiF{1v"~qUU#jԜPsM57k^XΩ5 q_L: u3?2/q݁)|gwi^yy[YJ:#ꓟ*^مoL7KvUv_?d[_ ˥p7/N^ 7Grwhޢ{D:>߁91v^꓆sT!3tfg'̓3l?^&]m۶7#j֩D5yݕm}+ էfN`y>n_؞0=/LKMт{Ke:|z7+ynM˪ z{5ymhVJ_6#:у[A?MM/D;딢\rt߉:k?rqU}aeRWj>s7K]- XSZ Up"bvYS/~9͂y[֚du,= +;^1*eE٧NפBO(y^N"Ědi]\ŷ} 3Y>ʔ=9/;z8h Ka/a7qwjbv-r6 X_)@͢xrki{)KANn/! E6نM'.:bll)6e t=sajpYo~5ާop ͏xRa$ endstream endobj 2213 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1303 /Filter /FlateDecode >> stream xYn7}W1yI@s)6)XR!mH}P謘ݤUӳ95Vie 2aVG6"U)ZUy7Iy* ?A*:nNA\J;2q3hǡʘ]RG!18'e]&W= ԓ''Z\|✋ W\̹4?i=Cg8uPL%T0u:źjf79CcHYT/[q9ia4ffūVlq lHFvROeݺ[XX^i^Y.D^{/,:knE6;z%ϴt}G2vGõ15a؝~57OLQw*.%֙Ŀ̀oΤ4v`];ONQnYVp[=^|z]73y VK<QEyCWZn}ѭ_kF\lӬ6@ogR_eHݞG"O\r?uS~gYYYK+ZAИ RB\hv{l~Slo~,n6q kCylF7E􌋷b=cyk޸|%M[qMqwC'o pԼM /؃t+a6-tw߻MDžB?,PlM; 1z0׀SNyP,sK}K׮he=mc|ֱ39[e;lɡ3MG؇u-a9,m?L/ sZOvnY[2[mO88 }38 endstream endobj 2414 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1455 /Filter /FlateDecode >> stream xZo7 _%) ( lHV Xb$Ğl?Rmx'9l@'HjqJ+MPQ0$XL)܅ʧBR N+l~vH*~ *BT)! dh*,O$,2<'Є1p$C Ӂux X˳"Vrc ^2 R:eS1+RIi1Lr1hHʬU"#4r!172ޤKyDrkiRƳ=r2Qȥ4/hC&*5(Y@|$[0c)!+ @d3R!)|ywp^ps͈973n96. Y{n%`]s3Q|aD7#+\qs}[\ OCH͢IYLfq*RvL=YNEXlY1=^3]l +0yb.feo*.$ e`SQ4-$>֥Y_-Cƒ#96%WbcyZ:s! .I,kh/~t6;0{Sy-IT}U(= }(|ek`Fyuv72Z.EnE^ 8h9~VgtnΤ1xڳ|:e욈¨9r/fNDuR ʥIX=`u_PD ^\`PJ+^sq׬q-L)Lu2qo~zӠgq~}\U\灦<.yRΜ꿒Sc0Zwt7_z. k]Us04/3e!,' }ֽi5` ,g姱/sqenozx- 78 mM2F^+A-O<ɛ2v[x]G@>-uK}r6HwY~{~Wn>HߑQւ>ux oJ}\'Zv i\O Jc& 4 endstream endobj 2615 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1466 /Filter /FlateDecode >> stream xZ]O[9}W} ߶TUj7lRT@w[IYD$ٖ3Ɖ BB8̜߱= WbpǔOϸ`BH$S!0IWXFȊ#H̺ (فG/Ǽ$`ʑ\LJ2.T qe2q]!7 8YКq-AȼrA_,Y,4rAY3f5gz}E1h"ecI܇RdR CR2%I^ϙ46LЃ σG&a3$%I BrLINOy !$)"@L3)l8ȂjXS-$P#`VK$ɂ 5PDd&"lsͬ((,87|FPs@E Fx$! I2C "#4#rd #^dCXpSπ$<qx=Z?p_z ])pn9IYS dN   |s9C}yHRWzvѐvً~|8pᦣ:%{z1į=jL̈́jQ3K{³!5ߨ9"JjqYw,7 {#\kpl K]4m]<=x'4bt|53եxhfbh-Idr*XGkB?z^&roW]KF7;Q~ʼnA8ڹMuqty[A/*4-hVeeo'r.sL4*R}~/w6s{ֳG͏th-7ycl4KVG#Nj etQ&M{!.G٤UM`Q)"6D4gmJtɊ5 P?_8/Ļy>MǥhfѮ>2ߨw73cr&9wvz81©jmɷg?G\9gzOY^}{݋RC1*|+Q_aRL-j}vqh^k/v4Zq8|m$/Pe[ "uh*T5uYؠ;;Nw/>hO?ҋ\vZ:nr=&ӕܳRO:<?4Jњǣ=M_7ϋ ˮ8hu`u y⦅.AZMܖͽĺq(ƎB߻f^:u98"_ս)vY¥οIۊ竃2t̴Qz9y_\|-(Y?WOrMB)XE狃-`^gҪ y+R쨹i㶴 w endstream endobj 2816 0 obj << /Type /ObjStm /N 100 /First 987 /Length 1351 /Filter /FlateDecode >> stream xYMS9W.FoUr)9rqlC5&}-j5#f 3fHZ#T +P0?R#,xag!-MȂxH[ 8ARɳʳqibpJ63Ӽ 'ߖ >EG,>Dcj+)90<ȦWB%BJqx'~ꋐ I7hHI9Cz BGR$HG4#E  PxRG% ,@Dx)aIk$'f}QXmX\[ iHGu\ & ­<jAB#|s'p<%#8wڱ7w+)¨5s5&Ss%dV#Re`{ܫ8*νa#8&"* Ag{ 8PW|Hgjǔ p$W]@ 7s,$砈s,FQl| M&<8  j#D'R+QǏ8;O77˻11ű3å%@p3枛7\z2wϹf͢=:Oشg77Yy~V[lnHQ O4fSXO6N{qѭ+wgyGq6E:ɋ7 WC*Dt>\׆C/a<뤟eEv6iYhg4,Q~ >^/17^x1n?u2t_^Sj-ʈ3;tμ.4?eqE6jqķZ`!(Vb& +:^uQSza@>^qXZ(vXOPM8}r3gf5GbsSOHG*-O۸g]_; D#lyͩSies 3A9{'|Z{o̓ڼLզ㮣 > stream xYMo7W\l 8-zhZ4*Ѓ/8Flɰd':.UJ9}h%9o \RKrB -$5+FQXc%-+QǏV#K;?w5F@ hbD lXA$٪ EAS~j5$;AJo Ǡs=CS!0$"y-SRJS 22 6,hI!O#1F\CɣAI& k^9~ Q6Ɔѓ4K5<ֲ㾄3D\$7Fݛh g60ARȑ!Dv8ڤ根pjO#RТa(['=kVXo. !6z*!EQP8mwq;9Qsu ВG1w1!枒]ܓcsC ǫb=BI=so-{E̽|!#gh`?騑<9k$B9bqh1NnyÚ!dS0"W8e>cbq6Y^g~)^>xqϟH)c_Y`,a|ntH붎YXY\mMI1-s1USH6H>fX9C'Jh:o:p'0aBj]JZῳ67v\x~WVqNEv9,՞3s/ʑomsr/ի3GyJ(^Q{ܩIi$zez*u[/3_O3IqóqSu>4)߈-mTn[ Q(~W# 1KJc! j ;I-3Dr0j0K~ySoeQioemo^vZ\Xծ8wzuW25y]F!6]'V}1NWN{]]LoOk3S5\$ͭ,O={? 3弜 &{_N:u^eo\rӔiVO͆WָWZ;^v}-{N˝&S3]M.4z;/17vuI iacH >k'#N?N\M7j߼!dۊyi>[\^#Sr7Zgq|8 endstream endobj 3218 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1366 /Filter /FlateDecode >> stream xZMS#7+t\IϪ=mJUR l~}E3{ةѶ~ZR )Hk%_-H+<'T"XZ &6b0mGsB'6JD hdԐP$'vPnP$٦f=8h$)`z 7X 6Z&e`sA&) l-6 3@ˆc)bbE̸i.;n> s=0N&̹S %sA/st@/s!`^8CmIgMĜ;9wF̹sbŜ1^:!^ɔߜ:Ş9Rl9x1?z' Sst"K3 ] !hhm0VVHl v-8zYBV"ņ9IfɳL<4Ż?h2>QD:Çws) g4S4hhr@ȣhhn ۣ҇2晏bcfgi5~. 8 4ʛPΎ; i9Q m?I%I U-݉EI"w +'y&:/mPlm&nGةre]vcQQ}xFъX֎];hJ}_}W^C[o$OH.Δd7}A]*vnVkGyWio}oz/~/= 6em誆Wn_+^U)]R2ۺ >*sxO3cuI׳޻-@yy' buUvlFt=/ HԹPW.^м[3bjo}p\Gj{ WGK UxwkE"TYhE)ד2]}5msZnN:Ϊa#TsWBZ;κ;^`MWe -&b l_󀛪JZ:sDuI=7NoU4ZzT{חN7d!A0vg%ܟh~wlKr4.^N;z]_/D_oxt#IzAI&kotD3{ endstream endobj 3419 0 obj << /Type /ObjStm /N 100 /First 988 /Length 1447 /Filter /FlateDecode >> stream xY[O;~W}T^tΑx !Јߟ%1a,8=}y*)ZXKF(pB+C&q%@)22@4ETe@-zV[2PV PNR/X,9 *@ hEӴiJZ{ywhy)4k^ "Vhod JS0JЩISZ/Y׵yxe!P2jnf;9kh315}y -2``o|y*~VH4VWM`ѕ-C+~@gm9LlY5uWK禒װ)~J4C;z3@N7Q5_Sz̷Gj1oͿ/M_I "M([?4ڳn]Ț].p8SK✢`'IC t_O֏+YG1lSNzfqwt' 0Zs]k~OY@ endstream endobj 3620 0 obj << /Type /ObjStm /N 100 /First 995 /Length 1548 /Filter /FlateDecode >> stream xY[O[9~W}E*]ZaKJDK!XΘf|sBMIRQ3o|EYgJŴߚIeQpLzgI`F8$sڣ`  lQVs&GZ15Fy@rh, &F2 äREM)pr&C=, A:d8 ) (&w`T(P?]0f yT {U!w6e0:.Aowj#IoSw}d= nyZvC] q8z[\ڙ>nW(`o;_,}OkFPxK H?'Gxn=Vݔ](95 ]sY<_.:ټN[$??LM{"G޲-(y`jﺵU~ٺ˧o_'u=4s M>Am}m/NݓwƟd[ek1u_):}Y=,Nh[٭GTs+hUF꯹~z#Y"M= _{ۭIzw@HS|˾[?ĻÅ4tg^GC9ZJ(-\0sf}u*Gm:)? endstream endobj 3821 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1410 /Filter /FlateDecode >> stream xYn7}W1~иmm EeLjcIgX쮵+,h%gΙrID-&j+O'ӤD"% AKa' h D+pkE 44YiȒMBi6>4#UY"HI>"@JG\#@" E?6DAI$I"hJXФ6DHsG'EXNJ#F(d"Ĭya*'1$IC+7f3ɄL; \;h,Bl ;&BP•D25GBʽ Yb:BCH& e5-{ ) 9<9*!ܖD#!PE$$9DE~s+'!Hd",)=,2%av`uYY4,MjlSgrf)W-z]ff:ǻixW+vO=vc7,5)EK9 UTjv5]c^O7e迖ͩ=Gu Vܳjs֨[je%jXgW)q\v?2ր`:78%e.q۱ЍALk[|nJ4qXY|et%k\1pi?]F4}?etla|{3_opB9hѕ>}DGb]I=~͇3y]'}lՇڰ :c˄/p PǻGTa ^9}Bj';Zo{'[7g_>lb˖~傻*o*\Ħ:zwŴ\4eN[nr]/q}<^:)AMWv偢1m0Cl K~>P1m׍,S׮ endstream endobj 4022 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1094 /Filter /FlateDecode >> stream xYMS#7WquK=m%l\5 ?6>E"Gjd{zN'Jk$.ޑjO@ u*Qb S)Ÿ*9%v"5hE TGͪ'bT4XM@Rj&NPd" q.#"G#+?]#`l)J@X6b PD ȁŒjY VcFRc3rd 9T8.%b%A\1%W.He$#䜡H>#%P!_02I aB|E $ƅK|!pA3 d0e(ܲ됌)luNuL0V4q@(Z2rrhyjX$+*84s-F.qG)]y ϣw9yTgU"QE@C([xSCϓk"xDm?x8 gԮ)PUC P0 yJb!N7DTg3e6%o3H()@(Rh sL@@`1r@yac / uMvuY-, }pS_:smmpnƆ{6y{LK6\U88 76ڰz<^?]iɣ `!)H>ʀo/U|b ?1 endstream endobj 4337 0 obj << /Length 220 /Filter /FlateDecode >> stream xڅϽN@ cnؾ߬PC\:&"@ߞ T1ٲe3V&;!ACQ b0R_wcwmR*dGԭ3 z`(-[p1 Ƞ 5\%U"meMGzoV6yLMw}PsfZC>R_[~Y endstream endobj 4344 0 obj << /Length 842 /Filter /FlateDecode >> stream xڝUKs6WT@ jvdJNq4 IHCuﻋ$;N '8Nū5JIސ2)A=DMyvzu!@A*jHU׬ >s[™lj%(%+ .xt͟@gQ(a3S̫!>\v;yj_v|迳z`,[ʢod!%m#o'=}7Et$ڨ\Mp%vE5e1a:=LBERHYQcCɼ쓱7 zH1{ne7.ҕoȋTo`<6JwhiJaWIX`,/-^Ǡ:`S#o]cϽ7fvZY+gl0OCǒyZB}wfxw~7}%C/s rϺbR^G*W8~JTlk=1:עx=w_z9$Ǘq qgN endstream endobj 4347 0 obj << /Length 236 /Filter /FlateDecode >> stream xڕPN1[Ez8_Jň"Jq9Q9)qw4TT3kj v!xY;!B靃&xd}2ԯ{6-=| 5:wXg x*[q $U\Ch4HgtqH]slŌ*SWUh˧U(F@e Sj̜t~\:7KMnSz+*~F}9Bҩ\k5Y endstream endobj 4380 0 obj << /Length 1113 /Filter /FlateDecode >> stream xZrF+XBU ^XĎ<"5#Hp@@H$U6^n8Vf9zavq9ڗ!E_,y'$K}\>Pv PmyѢ>!D{ky*){%mf8IW ;GmpуT.uwV:t,.|r*xP2ҫA@awptYDݵe7:8ƿVE @Zo-.=P;eQZ ș ³S2ȒAZ×4y2tԕalԼ*TzACem$GjұJ3j`)S|NLv$K˴*  5 13œ0ΌMr;P97QS`$?si>t+z;݃ˌq`I>OVUfC!iAFn#BHnд1"xtU}Y蕋jX۝>i y]GZJ_K[X 9QueCeD>*BWY[ FBaخ݃Άq f} foJyӗP-!KT~FOqXZ| WhQ&wT3hG)N& Qb-uVif}+gor:ܳޅqs($P '4իulcDȵv{> stream xKw8z!\'}ͤtc%Cj#!m14sl^ uml%w}J5p9K5[Xy"OͦluW)8w9"V| \s{˥E$T:ʫbsURjq~t0Sm渰:JFfmf"YGiRu>ؾ8.pr[:fZ8r ܳ=d\4E }_7k,Ī&tt>m+g_PR:HoB""$ql"fJ|@`.#(e&Sa2h!#E: (FzIut/#cl>ԝHv t$Кz]켃/ n&z8˪k7,i" it8O .}'ϤLqO--2-%[*ᛥYx>r?F^2XC PlfOC &Ls t泾HݪrR4ݬ -K z:N5qB傔rP45/mYË9[.pG=1~}7%aTtƓg&"oDzq Z"Yѐ2Q(;xv"ZGa)e&Lގ׌ٖ1n" c&wL:839kk[vUk;$ 9I1-jIh.&=dIʉN~H^x$5eze{c2 XRN5ϓ`kL1lj[m0bagiZR},/ (hJUh$r2@-G dy.,n1־Z,qS35zv#ҕ"5idzH؋te괣 h)2zW>(YM5vw/3>j'O餵yxa< OQ'W^"%2i:tKE+gsu L/8K޽fj̬ȡrMC> oc8cYq!pT7ŅBk8: '˼AIc~[|'NDIHcN.@kc޺!1c(ׂ2+g/U_>ལwqn,RZHjҜiUHzp*n*6zz> stream xZnG}Wc쪾/Je+@Q{nrDHܪ:]8fVF9栬QΊ@(S6^yDH'/BV!gUvlqt̸ !*2^RqN"9E֊9/z|T}VV!XE/HAOAX")f'xA]{~1+` ^bHCX~< 26Œ-,P\TƖťe1֌ Aa˯FV )ɯm I[x :TZ!2-rS(*c҉@H9&"aAXqq&VWijZ'1S8N'x<$RA\Up& ^"^B*C!XWAtK$#zC 6 OZt T \:%f*:L@~dB%KRc[ A":)K"Y2vDg˥CzΈ a)ٔʽrHD!{ IJ$Z]DG 5~rO7b>Ӕ5ԷߎyecYJs&B+inyC[y^iҼ+T i.[v.LfL=mPQbrIg^E3^#ӗv>JҪ|U',4Wuݍ22?H#a\y4ܧ+t2{fÚn\4.ٽg úݾl]' \+n;uU/E[Lڽ:Mˣ!]ǰ5 wѶlelכ15o!pbzrlU|M#n6,?O 6b F;x|wٚN8λ7ي'oߪ#AVoo]rGٯHw׹c^{XwwO9;w?wlnϳϫP/<զug./*w(xR-;p'-Hߺ][_:V;XC>~<x5UggLG'r:[^gf1^ND˽g?7|cPɑNX 'uSaf7okS0Q2S.grLB|bT1jracsn{lfl &fs^ rU`P}E9TPCE9TPCE9TXcE9VXcE+[/_,?]ޏEy;ak* NQu&MN]ǪB"9)->9hq'Ah'oxb tF@3rƦmecYP0щw kcp.B"䵭PD\d{ޒR ьy)j//GPPmEA a=Rgb=h1|tP a Ez,SoJYd1l B4 T Bt ?FF,J}OȣlǰqA&O$-k4^;ǰIJ ,H>Anȥ!\h͙M)!u0QWqZ>Ka&\:D%\"F>+28ֈP2W;d_p(}|¡`&l3Q44SsxUK`!j8a3DpJ`AXlǰ |%Z5\ʂ,%2@`qH#RXlctrwOdev1aM' jzF%u%z\qI%"犜+rȹ"犜?!cq^WVUW!T!V!U"SEL*2UdT"SE̦cc0q71`?Jwqdv kI?b֌`2A "c?X~n: endstream endobj 4467 0 obj << /Length 1556 /Filter /FlateDecode >> stream x[Kw6W$٥q9'tt,VZ .ȓNp&9͉`at{?kfld)zb)X\ Ժ/LNLg c%ėo~d1`zw}h>|}˹~*=O>3~ 29=J K!c>h<1߾t0܁3IxG'Dr(j|u} l{bk@l !sGkС3 "PYڀ1]#S? h4+;2;硑Oam|\4).Xͅ*tf4OEHp$%<׃G$`܋S5%#(y9җ/ܑ^Gw|Lo%D u$A.UE:<~1oaJ }BVB-NK@`1,Ԙ4~Z]MF~Q|P3`Pa>B4Vnױ n (8qwW(аgpP2}\9EV/_p,#:$IF69"WƗ;__,DW#=(3.3 -Yڙ.+Wp$ɐ hgbQ N[a"~keԑ !4@g@ǶuΗonQRCJM.ԁιT&fcI|S2v fS40R/%ߋZAٺZ2aHqO0P{W2M54/ӟfbLW|L> >m  { S 'PPS^w6Ly2T}%吠|c,)xcI78K䭍Eʵ2EѰP0%,FG?=o}53qf-Z TTxnjrvz*AE[CTCYC\ZSiK XQ6n<`=*ѕ*K;E!Ca;?/?[n~Jv|(ĝeyi5:3ti+Žg{#Iy}1ԟy ti%ng)ӛd-68s sc#ߥ(hvD8\3n -%YgF붶t(7@qէU!#H@z7Pi;KJ}NVZ%osRxU_)u/ 2R@^UPj]u~Nö_)|eLѦ(h endstream endobj 4507 0 obj << /Length 1614 /Filter /FlateDecode >> stream x[rH}WU+2斗l$W*FȦ"VBf!l'`@c|8pN{޳ J38 R S':^;|]1z8x7:~7{Q)89 h8cy|,xr$| {y-=L((grzFRC{4I/>b}ynxBwt#Y&P}AS>!DW?SCiEpQ>dk4AWωB.a`H>!.CDPqo3OUQ [EuAo $3Cd(0gO b:,)hݶ+P?[״(̍d$@H0 U |Ȭ!*bBI-sSb`\fDв271.Ui >aخM0=kq0z+jEU/tKl$ɓp*|V*0-M.tfş>##?uF%1JjVT ps4%BթvKq*݂yvʶJ֍&t\V6s)Neݑc+`enk7B} Plv#afWi϶F)_NP1&rZI_?B-ӧQ>yIHަ"KDV 1uAܸzd|t|^H#ȏ!kr^a2Oc[1ECbN[h$vdKUtDz$ͷ='fUD:\1;C-8/5Mte9/QƦݲ.R\kknH#lRHKB3h*n5̒:6$l&uE4V˅*;F݊ -M\D3C G&^''JiWVU{2}p^5zC[qlFh=#TҁI*kVMHKNA>e?F&$U{*vSmRo=m%X!L.{`5hN<$mAEw99@l:=[5\| >3-[s>GKdC"6[Qپ&WеdՖK]Yfft"V2a9 endstream endobj 4425 0 obj << /Type /ObjStm /N 100 /First 1019 /Length 2731 /Filter /FlateDecode >> stream xڽ[]}_EWU,N ]?xCbhƣiXiTuH]i*JDbޢ?<~I%yhPjFSoqWDMnD`\YZמ~$Ѣ\%ZXZ$Vfv- ePxu R㡌ЬcDTl f0Zhiq=<aOdv]{c]}Q] 8p XƵ .m= 8SϘ#䂞;4KVNV:xQ;f3sAgm9RZV"lp^8/R#Qu90(#(`h Qe4|B&@J t1E42"Fk`>{# -1|G\!YjUy(K v-NC!hGK_Jy0!=(ie-2ɎK"cNccM9?QCXCD+aXe a6(,| < HA!0; hSRU?W qKGg'Qe|¥pw/ś\C?ǫ9O|sK !Rś0zHk( 6!e6]³!QgCgcZiYe\:-iNuZr\euZiYeuZiYeuZi٦ejnGFZQ&Gcʇ|∴#U*󙴃!Y(\%q~ ќbia]8iVY1i:Jh[A!):ʜr>(8=*K9UC*ن S*.|6m_ 5#V3}|: 9,聃2+# slf_bgkI(=wۡ=I6m Jx]1ݠK4 Op'Gh.ꈦG-*C6{&!+c^er#4ܰXtᬾa[4ؒ \7Щ#/q~CNiF?_|Խ#[Ӻ(Vr"]eƀ<)zA#01`kV@Rc&#.ITPpPC8i# f$1g[粊 i(_qZ.72Alz5䂘u@_٠Rro{~sdc8 6Dk*UQϨ!84<.H*c%Q|u8ȁ"R9?NqZ]fS2őijLV5 Tzq[j=')2P2tp˽cUzqsm(ړ# )Z~xqF~x{m*6]OEקS+yOاVS+i٧6-iMmZnr۴ܦ6-iO}Zrܧ>-iO24<mD8Ł۶×7J$u} ~xQi#h6Z/]pc8OChvc<&clb[|}̆3qJsEqѓ-c[do7mY6^d5Geˁ[ o@A3 +[]P@Bdtt/`D(|9C+.3GJ}Aـ8eT 86YC%ؑ(-pMUph~c@Ghc)b] S HCyƢoJoRc'ρ endstream endobj 4546 0 obj << /Length 1323 /Filter /FlateDecode >> stream x]{6)\Dgmm/^``I?q홹-?Fh_096 l8!ہ40ч:}gmbݷ(*>"l1 @{g{^}ra*z#eo11j^,T^­2j31mg M)"2/xGi4 ‚hz|zH0mkHs@LZLE|1Hp}N. }䉾߂5` Atf s 4)y_<1(nv7$bhy6s]=J{c9qn^kKzm#m%u0H9ϸ_l<0QG乤4> ۇpGg)lCfZPP~~o?5X"|b 8:_P ] F{x)p$bYKў!AqU߬ښ&s?]RsK>-yg}g !p{hZN\6% \ګݣt9ֺWuL`9YӭqLXIQ-Rh 1:T, OͲ4 ^sUoJ~lJKYVnk`}}BI+G?lRNÈ7dX;u$Pjܗ^a^_T/iu]qBH} ۥ# 1x\J:P< v?N#MqZُKOUZj Wiγ`U8Wu"d%B>[,oʞ# X,˴cDKdښ 7'XK5uZMf"]o%:$>$shXBOh :;%NGDZt2$7ܧVasrzw'2g Qa{Lŋn2v [̦^ -A7ZbhN@f*I<+O9-'}J0j߄S=о  ; ΂oxНB=}11̑ݾOUT8 5G.G.9tͥ|>i.lUPov秲sFs1EgUtj{l*Ċٔ!GE5A`:"g,( 2)|, @@N>{[>YN^Ssc#![ qU[B.-5u/ RPfIo y| NX~ܤ| zN}<չWo / endstream endobj 4589 0 obj << /Length 1275 /Filter /FlateDecode >> stream xKw6,aa]x8i촋tGL__a { MωmV\-ãOwTڧOиiSDcjF&ӞoA_Ɵ5-:y7Q~7Ay hM{O_k5`bkWw5ba"XϴQ(h' >T 7n2<BfB}ƨ~+82qi~ yʀzz'ـF߲hM{]ӜpB|]&PKfPMhmѹ|6x]K~w]}mӜC@ɇoA|0O϶->h I<Jczzh{.Tc2h;ѯ+JR} ELf K0X-b2RU*@+vD@rG>c<kF46Aat_/ dڐtW~*UNJ҃Eo8en!BULy%RQpMRki?g{cd )WZv٪m#rzp4 _Dz )Y#njЎ(nfR7b'S?p}%UBnw ECmp.XY4uiDW[AP}@X N-L} mWjo.)prUx8YE`hwD%*х&ݘo4-i'c2%CJT$Ga%Etҥx6"nl a dp!"UXiӈ~HuVA"EӥC9YjϾ1. ģT? M*ՅE mkݲ\rh%|v$:%yɽfx~)Rl{)Ya{N0qQRֶ߳=X&R[uocZÝU77w}&c8\) ;rgvH˻X%ɲ暾9@k멹K-iLƵeӒby'fT1UPHZS LOCZS%ľQ͒4»-V=}٪}nZS*KyFøƘˢjXq8eNboY۟sľ}2wΩ&bAXiR7>/V_;h{~$",EG^\VY>ArjH.aA endstream endobj 4632 0 obj << /Length 1175 /Filter /FlateDecode >> stream x[s8zno8 KNq2 KH|6иte2[4:?s|_@p 4aX~&4GZk@r7eo 4=!!0I #{ b ={PF FAC3] E/&(48dHNh5UdD!7";?Ɠt2Ow1-/DPcґ6KnwifT1pkdŅ*F+c֑&i1ДԸe>z#:,f.Xgb [9V cBtX24ME2KGzBۥt}ع&P {p>+@ !3yl8IDvɤ7M(yd.]ؒ?·uv<+D.{t?Q a+݊U#ƏagQHG:L ŕEd{vWZp3gwG>9 $(WŒJAw*) [o4A;`=ez`mcw]Qr&!á؏dQKUZTb0Aߋa5c)7 u~b:ǯJ[N iV.%u>ˠ~E}xэL_ pI\u.eIF@hʬ)E=epHК9 v}#+twб uY++ Y^F%ՖZ^QAȱXB L~.tTGP{wΕeGrA-I%߹J.]I( ) r=g& )B L|Ce/י-J,(t>-e'sCu'LǃnvgNl~r"Ppd_:WJf D:* D@pZo%EG$(d"w|f9_N(3dh;4'bgUW:aZ ^]RZ!w䭯o - /f6;oeDvLV栖N)  endstream endobj 4509 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2841 /Filter /FlateDecode >> stream xڽ[]7}_ݗRT% .I8nX~ѝr$nV`-.՗jT{O9J5 FNAIZՐt~Uu@S/Fw,-OE`! ރpіs*&ۼ't.eJnLെRaui !4>W _r.IU k&!Y$'ު*Ԑc^0cb|SЪHn|7?OauN,A&I:f 8[l` UjfR) DUSa` ,Ad ܰsa70jo=|oׯn._ü{so3 D~qϿ-m׭sy6)6Sކx]-FzN[w@y`llXܦd0D[own~X66X'WGF…q}˺Cǁš'! *z>V6XT6^w`0IA5|v> tIp-ӌq Q`5H 粃϶{6z΢yީ+4')l=cf>tc ?YyR%0(R=V=PWn~{0ηPJxNB=/^?̇d]U ^߽/Lon~H//}{so_?aj=!k;^~vsoF1[xBmSQo0L@kAۇ[ ,8,!YBd %$KH,!kH!kH!5$kH֫RBe#wXIkG:= A1tDnF: ii >+yU;k" nW`g@#jfYKr~ìQKTu!A Iِ9?l&R~@lr~My2Y@@F\u9=̄*} Nn3j+8Xه^v {G8g׾9Ho LkxMKx^`4hE#},&{^JՌ쭛Bb k%Kf[egR+9+8 6WH3 F>˰A}ٜM7$8j2V+.!h-1-MaYc@ Z,J|r7׼.z[{9D_a>,K?̤ݳ_6_r[YG<Џ1 {•`G <>\wO0?.¾_0wCg"p/SOt mE@ endstream endobj 4676 0 obj << /Length 1070 /Filter /FlateDecode >> stream x[sF+ m|ȝl)RWvu3 DQm!qH"sb܎] 3{ p>ɹ!oܚ_OGB 0V38\o!} [ Rzs ʕA`L{WvšA;'B!3G=E0BVHnN}}3v>أpn.9Oή4n(X}㯻iI0?;KH|K=me`0[M*t"Lx 7;U}{VGQ,j:*uy8k%N1uyd y GHalzY~ŏ/&ˬxIdi`x>BHa qm'%qd$mdX \দ<`^<N ƃ#;_ISEP:c}Bp6:XHs ݡOB6-<EW&v#m4h>n(pinFZ~lr5e΢F?"ϓL/jq͗2΍oBh5=?'s -U7jl r^:B&Q_ sK&j;ɮ䣬AaYn3U6,G8XóKKt|wEFA|9!lI%O#'<9IIWeRIno'˽+vŎACX94/Yއ~WBҮo 6E>FPH:j5Q.Znr~CՄ,]|B$;v]\~)@AR0fud l  ?˥±Rkcçb;6.e{ye+蔉JIſ BP5^MwL|՝~c&nݧD_ nq "7%"LN>dݑl!wI\&7A|yC bi " endstream endobj 4719 0 obj << /Length 1258 /Filter /FlateDecode >> stream x]oH+[0;3.MvJƎRZ! NJ ^؁qjڦ!W| {33kbx,zak|mq ,!AkYWx|a.P'}nZ ,p !\Wc-bOX_Wg-BK V3k48m뤓Ս P3nU]bQgY[\ZA )_X:CΙ}$`:~#G2 .i7LP߹kpp <МG e*KIXyI 抡+4-)]fkWa2Є[^MqGnFF~\ٶ gK}jnhk۪>C$ӤOxfdZqlF6ҨuH*G @{t[|D8.QI l~!:T*4Z7=s$4pƤߐiCֹeє4)TYhFW}ͽ$Ed9xboLr36784b:WSU9*@q n7ntWD)vC#^X=fx)Z27KWȈ2 6rc}AFȒ4)-IlfhzMhu#-ifOeBA_Vܞ` H;d՞!h !8d.iK"IHւB8Dw*60uXo kU>-阪unJΟzĺi|DUƷ,F&H eďU« vU$}몲Z(QvUNjΏ S>|koYNz]H^-vK)bS Rο PL, slg2ˊ0 7[5ʢ5͊Yy/ÜVcKcuqz8 %fnUg`˸qd<;-6|(wjOsgd#B]wV2 껽JOvs$z ^$[EAzvq%InnTiOɸN[ endstream endobj 4633 0 obj << /Type /ObjStm /N 100 /First 1024 /Length 2653 /Filter /FlateDecode >> stream xڵ[[\~_EI%0 {I ;,fa&̌az4kiq{t|Tۧ%5Xb|ߔcВ1S1'w̩$*1Dz8pH Y%FqEMԹĨ%.u\뉙jzbq*ZĵƵĉאBJH!K6$o-Jԓ8F!z{pblc2?PT)c'ãc$%g"Dܓ7@Қ# bV39 3# x6o lD9Rqɾ`M#`e$PdFd0+ ^iCvd#wrXhWsȍȂ#kBܸbT¢, !x?)POHTJ#CքJH ,[ ";*AJWʊ;ʥ (! ӊImbb]<>]H478,0r2-uZ0|Io^GV,#ܡE~W0i #u+c:EkvGFgQ!aH/0?⿃/2 9BIȃ, Ñá&f8B͆+lH[98H9DlOTP06cKǴAMHr5U8 [qL$9T_kW6dIgI{Вi1mȏ*}בH*IjmgEva\2ڹᛖ SOn?tztzsCz僽z{Hy݇sKx?4:a+kW $*?ZG?`~AyS@`J)YduJ)٦dmJ)٦dmJ)٦d\:%)NuJSr\6%)%6=6r/̸sc8?1c4lԆ0'(ɐ'B(=Vv@PS{ok,B9s$bY=.q$2IH, Gƒئ~M"aXu&MɓW–ybJ%Sb!OT |YJJY2@FD`Skl%0t5d}|I# |m]%))gtIaɎN dR(>iM68erۻǴc[SBǴOBB((lKRI4nᐰrz˂5$ $I)$#m(^?iF˔s.<:JB҂t+2eA84|l\xjGJT`"J+LGewYp; aFACR9kL?i~b; Ŗ3Cs(WrMoطэ\˙C!Y/;J Q7PTˎJPhq|4Y1F,<" %)O}JSr%R@@A)diJ)d]D Y RTKIٴ8>XϞo4>MP'Ŏ;Nr,~4͎%caRr8uK%q18n#ܱp8&]٨m|;jW5^7UD5k4qܾihGu7L ѣî fDj:mr&")l#qLryC2ELNgeGiEJOBl"m1plA))qA-1hIDD<+-ԈNSoDP#IP#u!I} L1Z#5n$0=H9.2ZFSS߲ endstream endobj 4763 0 obj << /Length 1237 /Filter /FlateDecode >> stream xrHz h!dDqʷH&5Qۦ, (~jY,RcЬE4-`8|t#`f %3, wf\Oa8~1 B`q\q.!%10fXƯ΅A((jnL@\e;]~RI! Z~V-nQG6Afp\y3?U!44^DFsыȴ#JY{@˦&ļzMNj;R׀E5Q՗X5hsÙerw)NAQ /[+ʼ>44Me %X2Cu[{q~ֈYUT ԠJaZjbD|)4<,M 5WR@k*m}h05!~ihzb5N +j8Ucf"g Bo!xXN>*,4"γ7 n6QR0ar.?=P:#J,nMA`<5jraFV/[? O9wѴ b/eCasfes9+L%yUm) :8A[P% YIY +5`Q^mM9CK n.rjI++e30X/sZϺ<wiޏW91X5]k(,N pө~~uC }G87Bx!v2{B 7"ڢuQ[b?o/q==9nӞNt3.ks?HE4)Yp5h]&G޷3'zWPm[@qΜNp!+0vy.g Hnwq9=N^N5$i#3v]h@b׻7Ru{kd`WB{ ]va!C!vlWک ;9B!``ulƊ65Gȩ}rz,qx4Ti٧mB,l,ɗXi1bADF2mj]>5TL}r*6 _ AGcH|_'W_~4򨘫||nΔ&) endstream endobj 4807 0 obj << /Length 918 /Filter /FlateDecode >> stream x[o0~L|7 UAj+lo?@U*ZiI';s|cGè!9-Бb#M оNȁ_/=k^T]OC^"#1jWLԵJgy8 ڷ\ ,ynzP ,t]'[a^#tG^4/]K",Ǯ3ƒ%J64M:,NFVkKx Oz31qh+ba7h~]+!RqouOrx>PЋ B|6a_Q9Oqh;LȀ?5&l4Dב6C&IMʜU#j2$+h,!C2:f| IGzEd06b,4+Fь[1p68vVZ#%)0?O'ʩu3){(cX@qx-m?l晆A%O$C^FL(,G(1pT-at !5. Xgf4C .)!PUC*"3c>O&gkeƩV>JD,M3 RIB{z]8m\g+ W5 iP q TB+0)ôG޾܃)opZءZ3`Ќh82VfJ˼K?=2Evjp~"9mA]TTPە)D8^[`ͷ9\5KGtq8u,5%M>N%j`3!tA1">1Տa?MnM|som;5mS Ө> endstream endobj 4720 0 obj << /Type /ObjStm /N 100 /First 1026 /Length 2611 /Filter /FlateDecode >> stream xڽ[]]}B틎S#0|ЂI8b v ]k% n`:{/=͇>K+RAQThoPr%b@ 59B5GVHay1"GPZ&QaIa;-윔 w:##rD^D=3 tK:f-1L~us$ OtN .Y.t>HQs%L}>a' $XgaMbI)I>&#tFxb61q1fgb ${mi`6NqLEFI^mI'0tZ0%~{;?>yxD_n~MoW=]ie Π@Z W}\=+/O_=go~.*j|=# ͣWc K\4p88Qm؉RFX2rT):@J ' R;mpȪ÷F/쵑l'0ZTD NtVy: Q*fF*NP?Oh8dnT 5!3Ձ ]J訃cc!c.9Q[zsEo#j*nÆ t`kѠs7ԯZHXHzA:NGmzBvBpz]gXE/2r+j'ôdHR]:(Z;@qсFz@OEuFl?z;oQ m+_'~OË/Aܞy}u/} Wod[$yo'?"nho0죓l x d t l ~Ax7 Y,dYȲe!B, Y.d]Ⱥu!Bօ Y.d[ȶm!Bl -d[:-gJ3_R[[m?fӞw~S`'AluNZhT1Y^ۆ;]'hGGp3r@A@wA<|*OzRҼZΑ>2G7H6E|BB;TihyP ;ePn.c-X= {ǥrS>WБ^@,7 VDb#P<WB<54&3xL/Og2zĕ&?N(~kyT$)ajHR)Y/*{#CMa )0S::np&9#)diPД@zbhS-r?Z@:'?#`<+ ӆ3 `k6:8d}4Saqxm:TOMݥ~BAF34*i`j"9[̒G-1 NRC!-=JrNhOIJ7:=AYA==F'Qy7)uNw"#<1SE\:~BI`PN@ο23 ;Ո<2>b:6e;!(Z0&[{IaA@Y S;TOdt8'j#f%${"I4E_#_G}/1/1/1/1/侐B /Xȱc!B 9r,XȱB y,䱐B y,䱐B555S"Ɉ}kw *+) )Oh7*t3BI>[|3Hb'<{4 rI$#n:3O;j#SJ&ꍡ-m?ZmfS)Q(|#) ϤTk#o=j)t&PNdS'x)@Joԏ|BqB1GJFld>ˇL U*%;.gIgJ 9n5˥ߒJ+\Rqx{[ZF:ε#qM͟|@:y PR5 {/' %젚=)#Gh2S{JBAAV)v{ HP:p1NG4x)9i( uHD _n" HQQ4 \+wT:"82f)8Ca2Lw;dߡI9Ee7+I=l)zPPA;JWNT̰MEO*y΂}[Tу|q[Uѓ f#ڗUho: endstream endobj 4851 0 obj << /Length 1113 /Filter /FlateDecode >> stream x]o6+x)]X7u蒮VZ`Aa%OQ8~)϶D9:H#?z_`  ~z!A9-0#%{?Eo48T7nFXNAC@b 'u  %gsPFF_S̪ o=)0QϊD ]?${wדWWWQ4Gy7CCƘ|cRCTJm !f2z~NRyBTRc"FwL yC,CoJM|.ʸTE5l [`EGC2.$qOY*zŭt2O{n 4 2#tǝm#䙪t&Я>f^>ORJTB 5cQX["b {k ̜K\Q ;ެKlówq\KEGkw,n_l|질\³swY7ڴ欋s/f%XyԅU'l.hE":ѓeqGE^K a'L;hI$dz:wi‹'at5 ^,kqݑNkM׆ZR,<1z}0 Y]USlueUqfiib@oBJVj- D_.Mž6Y9Ͽ5s'Luhfu u endstream endobj 4894 0 obj << /Length 1168 /Filter /FlateDecode >> stream xrFz eg&5$V* gBжA~9d[4`T«AjNȹrqbk!t$Y΅o?/νOc·co꽳?3 ;PW9jv91 j6\9`,ugqN?9Q̐/w>ڝ*O7Je&XFe\*2i~Ϲc{sE^t1 vԄfm#gx>E5BoHQVdU{i9mi@/ p7L1!i]\ NK B\5DiuEF|4}1H5Fr$!iRA*:5R<1v mvNޞ"؛,î7:n0­Qx(cX L 􆍲/LSwln9Mfl3S9x`k\ ]Vb:Va j ,@knlAZz˜\gӘ7GmOyd).=脑 8>c"4ʎ{밼"$ )֔贱gY qp;dWVDx*l^M!5%{߫ D9gܒ# xs"cAS%UgvE_^ЊDžG>n 5Ǚ$5q{Lmw0bd;O"j)ojS-<ڬL=|O=W}pI-e ,D&sulKjt`|(maE_{zyקɀ>#M_̑Վ*9 MP5tjA0M $ c;'j?b8`@,7˦oN¦ L y*09lk3~~SCz{tmpdUyXo@.=4J4FAy& N&eeѧiU9b$ , ū^L++\)ؓg4 h2SnqGvYd -aжwYgحŗ?_,^䍻zF<wt;5Pl1 endstream endobj 4937 0 obj << /Length 1245 /Filter /FlateDecode >> stream x[s8)xkuC}s'u7MvIꉃ6no_qKmejy,󵋨*Qd)+#IGlwrjMip֎Z<{v{#E9`kLbm\]6H;".w[_?(#4+nv:ݑ:wׅQbSg&WH"h> D^ 1~ ZR bSNFG=> !z3*:^߉qĝK`|9$G>~Tu-s-*Up4 endstream endobj 4808 0 obj << /Type /ObjStm /N 100 /First 1027 /Length 2631 /Filter /FlateDecode >> stream xڽ[[}?B틶47ir!mc-I%|@Fl5G\42[+lthP!"ТNhh+fhRzN3 <(~>(0:>m='Zhin-+=($YBCdhMb 9,LRX<18pXAB@c4ВgxD1d9`O׊ ޜgQ! &LsİF ck qYug13dϵLS%dXtѐ|b4(ѰF#!F禫FcZ 2@ΊM(Asg1t^bewCȈ-FdžJ;6wWZݕ'={vw?/O߼yxwy7_w~w0寗]>/w߾/_Tk3<:b¸Wsge᫇rQgOB5sm߹bKl՟^i5M VʆH"٬&3E c|x~260C9[y`XG/>|R/,|_^Şs ޿y.,Qowq?{WVfȀmZϯY{S O6zFeDDDDDDDDDDDDDDDDDDDDDDDDDDDD+ڡz.QضvBU-\+:` JԇJy̔Ɗl8:`ˉ8 O|gbH5'+Wa:\1mtw$,CmHuI)"O CyG±Lt:xC/L>Lb1HYc ކHt=J$\MvVrd+:hY'm0m>`Ƒ4阰N\~I8nD,d4MF@d4=KkDDDDDDDD<y$H#G"D<y&L3g"D<y&Ldo8/1Dkll'V9v`Nl\OuQ';k PKG$V#ºo"T`1QЬKnC& ;A^)wCt G G!:Eb;S2xLq; |JˀT>\7S~ƟBSp(IHCH׫"sxj{BoG.Wm8`iM M>cbzu #Ř@7Ђ0 ]d`a2A$P$dt %!dK&^i. [qw%!aK|9U|eCd%( n=, N0]k-l֌f$d3t tG@XMlGvث5Y#}dDaz&~]'Ex<'< gCٰlll$rVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVxVc¤G\cl{&Ko c: N\Q*5Y2$JMm&K(=Wq ˿Up$3l f[7-B3lE~0(<Ö˪s%bsC&?CGZ5S%clG'(YX\rHB3dIx8 Kxll.)$ endstream endobj 4981 0 obj << /Length 1204 /Filter /FlateDecode >> stream x]w8/˒;hi"SY0w&MmEb[fidd8:"Ȑ95!-97Kl ob\'.7>{ FH N_w6K;OC32N%axѹ @6u5}`F|n:wP>me1T|o!#ۨ,661@]:Ep6㺋bmu쬢k+o ] ]Q5*hTOuFؐlNC@[@e8B=! 1!]z89zs/`󖞏Vb[J\QLT5!~4,T, (x۵dr'ե8X2 M82c&$7De1:h<Yqu21dbc&~Sֲ eHzh**M4l{+2_|h7qwسy |w)Xs%.ߟ3-2ѝ,V6^U ]<~UT+}(RSd5'>jm1NMU#NEKλyau,hj> stream xwX+x{5&MMJN'áx(Z6;$AЕv/J;3ߙ6֐vz~;%HmYTsF@,MĴ [{g3 եӻtɱVi}ka84p)MIO[6c5dR[j?oN5ƩDhekO3dZk&ʯ hSiӿq?K/7?mX76V>dB>ŲE/0_ϝ?7_~/NYv'Ij5 Ԇާ^WGW&2KC! N)18>zPraqN z'nTD̛M)%F6!H?]~BR?˩ c/U .;8sEE0B|BCzƠn2dG?$el&*v lwnB6/J &i-C6|b[EϦiXW .~I(-p+&8VLa q䨹 *UvX)AL.eʔh`B,|0sHycHgi0jV10]PH(G{\*犽1ZM% Mk X3[[mq ?"9 H"#3;R#R pR)="7FF¶۾8FŪy0 O򂒮HJHnnjOCjBg`O 2m7 ڲ9jZ؆t:KAG%e8Eͫ,-HΧY*%H5Fر5򼢧Nt`ykXO퇰~PqVK[Nbm op,b+/7._(gOUUa:3+{׷1"VL*tyg2*)'wJkJHc{uUR~T{F$๒>f8üe Z\M/˟ @450> stream x[]\}_ERUI`'7w&0cRiA 6S}R>ttk/5T{D`{ S %m㞞ԜCD)$ND!I"!TIv+,k'Ox%.:뉩ŷ\Psb$v_@$})'O$J{WJF1P/7*%3%IOZzH$qRR9^ZC__0o5io cTKFq͓qdq Soa&sߦYhQN^h|+i@kr6PM^b 6l܇ 0އ [Ђ)k\B niCxMR3 0l#!ij} C]UQE06]B¡KX|cpSp053! `na I\u܋X{@cMpk11 } :Fj&Fu&>+JNTc(lz8*5~1<*1D~X3IZz?Nonn>z?>Ϳ?v} Hv W6behB=7A;e~LϞëtt%_p{sϒY~ .$+"͐d8z9P憘s"&αT-ÿ3*4O,-B73*-#$O|&<0 E0΂\K{Evd' 8Z$S?{Em4AȹT4c/O\P뙰Ϊzo܆u|+ҩh#E)lɖyc8£if*kL;a07`Cv s'ͱPqs)}TXC~^<l jUW!R=F~k"Qu$gA ɼ!?C^\HΙ.ڑ׸(g^Ҳ2gúê{3䵰aԑmsFjj*9Z'4. ބ-lYp] #ycH&I;H[-4GXzmw";yUG#TZP-nf :!(Z0moWѡKòfaRIk& E@&PTA.݆ 76HHrS^ - ҝG-xT<$Üu)h [%7\PKǐ/S-n=}(/?Ż^_~?exָ>4~%,J6Ż;(AhxG?v,ذ< 'c$d )TS'ShSuj֩Yfuj֩Yfuj֩٦fmj٦fmj٦f}j٧f}j٧f?j~{Yu(Nt-nMT7}ӸjCwFԏ%0]x(2/qڐ-vvMSDeihK`7L:l"i6L+j7T І(rYc\(jM*О ndXwia jCDOb Z%?ϙ6TaCmp#_qÙ&7dP#i>7rg nx;o6TFO#mؿlu_$dF` -}TIۃWnp@mH,h;q+zTv^!@6}n]d;d`cZB}`LCnIS T.@j;;xv,8T @$HYem9 ҍDD TQ5)̾ϛ|Ԇ>)AFfA0 +Տ0 RV }t\Sbwlʋ|O*HD/*@!3ZzQ Ѵht 3'xi  JbBnaV#7FYY!xCc̊ӄF?W)V>,L`')&+5O}jSsQ8!|h <BNShSijfijfijN1%/1(upE%@>ke;铞%$06]dOv;'F1ScH}m"}2r&܉G0D-ûnvrrj*h1!=<{ȓXhZh<=>'ȞeOM=XXIh<s'_Jd{%'-ZJ,6m)!>S"G&CFȦ78Pbp\(ZĒȦW8P"DZ5DD`I()"RȞ`P)7Xs4X+vP> stream xMs8$$!zk7N7!0  ^W Lܙlȉ/#X8}8A`Km,FȢИƕl:1l` -ť^F< 0cC𗣫lw/&E-#c:g*I/D!pP5UXXQ3y*Z{+ΗI "o M7f%Wj\MxB-7^zh2wh v")QyJ ukr~>xZ-BVGyZvu\*5vw X;(+h.PB )/5/:hn 5JDIBSAk 0Qrlw1u;WXzF (7j+Ś(/c(3zZP _~\ޓq*y`[EB2 |I`yKӼļ+j4V !">HȚ쒗 º'7h5PBySهӫr6bz~&UqiRm~ޔ8u}6]L4a:xyͻzrT/ZϮj B@3Ԏ0}a˪d‚gU'}C&Ҹ{Vͫ-A2jOuqQBZ(ݫiz-#>#ُ1^~kRf kATeNm9Ze$#En8Mw?,wn7s 5NJᲨKVqU6Z[lb*{X 5Iq CqL,*7SUʯKɩX;h{~ˣw,^|+qp$Q*Wo~ ] ?% endstream endobj 5112 0 obj << /Length 1334 /Filter /FlateDecode >> stream x]s8+a%$;'vtkd; 5ajG1‰fw3 s^`8`'gbPn[nh\wwO{l6U';Sz#OCC0f1w <V0,#ٞ=zf9ഹQF!A @sZX؂vR`慟0+EߨC3OEW7l\A`S97΋`C3LMiH!8!S%` 2n%11OEQH6H;*]yه l] :q.E^Qv;\)BءnlLXS7]A4tGeFuZb߫;N.ȫbL^ceOl8ceD-B+o:79w2 p `VP$.W5 |mF|%*.+(C߻'mˋL -놯72ѭuiZ1B-|VR #%ڨvZ)i,Y&8netuU I=?ekj +:kHCڸ>A:;n t~U0s/őcKęߖEX/>w $q*D*A\S:s8"tF_52(L;w(` v]?P>J'F<(Sbw/̷.ySoJ)?`CAOF[;!l"֜JԥS]4-ZUKk.p$ᙦr Ds6d&烿Tr t4DdNـ}]N;3}pmh^"!M VfU$ϴt*bE73>r̦s&Һa/7:u 7QYI֤~68N/^U7jodL1 || endstream endobj 5155 0 obj << /Length 1235 /Filter /FlateDecode >> stream xKoHq6YxZ4c[6`U"-8h~WUWO7Y gf" ??BWfWd-`쓅\G͵8u9pX?fLK?'_(ޙ(FN.\\*˕JL˨UOz߬+A:Ws}L!␸E+{|]\QEp U&8 t*-#u C 5Oh}_;6}vGOVɪ N:j砊hN%i`6az Σ[ n2 |YLq9YEmQ!W B$i˽F BS-Ul9]}^"U( -̍`vi #cO-GYT)FŃjypAF0` zmW{Q#)BA|NrZR:CDF ztx4yڔ$2n*-^y.L5#).*-VEDNMWc>(];>5f;Iz0\g]gݜQg1خI 2m-K|¸?. ȦL;WsVf\aw꫇zq6]D(]+=mfi "|¿U endstream endobj 5026 0 obj << /Type /ObjStm /N 100 /First 1026 /Length 2721 /Filter /FlateDecode >> stream xڽ[[o }cI` m6y E`{IGA̱'QZJK%i)=Q.ĽC4(iW85$F.D4|IiWtHh9qzb Sb8%nwZx$CJjW$>p{@+>$9x$CBT|̎E:چK#U1*f̱dcTNuؔ@|V|T*@ژ.SJK2V)ϷcVٱ$O`ꬱj*`O,MXqiJj6W(fŰaQj\\iꢮZJ|pZZIK4D}&s}1U >,22 H׍%,/X`.6(>P'}ug\mq5:lX]Cw1`n؀FԧuFc?DLR1hsF:``4aaۄ>0 }̽0 GMdBM@4Dl) cLBh]h@gn;4wvs-Mu?+p~Noonn/?t??/Wn?|u(o?k?^O1Xn7Gn̔^IJB}=KWCǟۛL-S7WwA<LGF<<|A<2a8kuaey颓jIevg\eӎb_]`)+r:QiN:Ē?34zyAE6>Ǭu6C8pnpjyp6έe,Zϴݳ³aD=\Ց3򈌨e$ d"Zp]yT<I D\@ Xˣ{1,]j=X7>TB+OŇw/1~:y:>^{hpjsw?;wnKezks|x2pX08 =q_'8 B ACBf 54\Cs 54\Cs 54ЬYCf 54khЬYCf -4[h7AM{aʭuVkM .`oldV$>Hb\_+5dC.VX7YPJ, ,Me `ydjC45v5 Wԯh}BXG4jLi@Pq.!MAr.JQQȭ{V6( ꏁT¥[ P&YjGPcʈ2Be}ŤlňB%~$@#}ePL*OP^ ΃LcŦhKn|*-#U'uӫ"$ l@Czl3Ce +IEwQ,(AD.A]>լHR$!zNi;Mt$HJٰ1Mid'!ҹc{Αܤ:ՙ#R]cPks"R[% wH U03ivr'H5z2=I[ `F*G'4dH: 0J!_̍`:o>*s!=p0$`Eb{*` 2rλ=Ƒ|ԎdT'ͭɭdKD &EGt<L= l vqb{* N>MJ椼P%&~S  X.`[hm|Ą+;oG7x8 $> > Z-X@ V+ЂohЂo衹{h{hGhyGhyI߾9  !4 w'œFHu%8qD`3d$d?M#9p?I 8VPmQ4;u(+q#CBF4wZ:DQzVvF"|[D P& 7橵8>$z6F8ep~IBݭ-⍔Ik:eB+d#cҐQT$1줿3&ndLɯr#F~6&{&]u+94U#|g`CI9gK}c~ ;GD/sKH㹫_|#Gf{vEwW16f=RP{6.Q"cOle*^'y/ɼh)Si$cOpCvhZ:Zl%{b[?]3gcdl #( vպHQ")coD @qOqOqOqOqO=xCr}B3fN,sq [ endstream endobj 5199 0 obj << /Length 1166 /Filter /FlateDecode >> stream x]s8+ ]qۙ&iMfw&aȉ6b$W4M;6,sAw8N8q8cϠ΍8z_G(P,GXN>w"/q pRu|!`?sƃOXO~s=TP!>Ws}Pr5DzC{.x:jqZ$e1]d?tnސRZmG[.tfPf6`[gIHsGC_+^rƂ"V]'"dz"12xp~kAx{jZxNr)ib^x-[leYN<LMϋp^gGʰj j%Z-t8Kg;@ _@r+HG!uaaF*5jiEX%3w4O{96lLZO:+):]CJ|PӸU9^/N~v*Mnvxܗ_~F[\_>Ɖr&܌ɞ@.2>_]GQ8I]KA џ(..G&#"ZBMP,2l65׏we WJzR?i4U!.;[lgRE~:g:`dAH3R{U"_,F4'ߴԉKfu.<5~0\'W Aj',(+:+VQ.MRJi SDDLEr;\&ߌD~R4 0E] Ƞ%ȠMto^s"(mܛ3L*B;1@EL?PcXtjИVl%ϱ3JzOĊ+g3Njy盜DgĹa꿺TEܖHa!:Zgz%ר "t< ?,!'"C ts"+By DCPki!?:AY}W"N#o5Ϥ2BXg+;Pd.9T]E}ڼ&S|/3cy?LqQ/arYFH75Km;{u]gbje;5K̶1 X endstream endobj 5242 0 obj << /Length 1208 /Filter /FlateDecode >> stream x]6+ S}K2$L'IbaXL1 '4_aWgbkagt8cϠH-]߻OܘZA}8!|g7{o@8\;b3z zִSv 3@ΠB#c!rV**9f7iG o7:7s{sJwvpӷnZ"v?T x~]A7ʲ0TH!$ K GJ2 HgU=he) Qwx,7{V]`\ר, Fދ-+/*N, Gi'z H+0/iMRp.0Lmn?s R(eo9* FghSaˮ#e 1PF+U*Rw,'b\`1[ ƒHL7G\/yɪ (!Z[HG{tH'>ԃGJ6ʹl!Ut"g ξ>?M@xZõj\Ha}Nă;=~uV+񀵿!"Xu'Qfd#EmVT4)ÎNzFJ&a&H(cÆAٔu12F1ՕkWKsKJv?i6KM+e%ق #guIlMXmS++\V mx zz4Indu."xO>m%th*:AKNa[2E.Cz'W@Nakq<G',֮QG2$R ϻӖ_pc/~b#V{SV/A`7UJetwz7jY&&O~ZO.Х%Nz@}]Ӿ|{߇PC=od.HҶ"򧇩^@w>$/n>-e[ 4Dyr[y}V^|Xysw) 5 endstream endobj 5156 0 obj << /Type /ObjStm /N 100 /First 1024 /Length 2565 /Filter /FlateDecode >> stream xڵ[]\}_ERT`'o^L`&xlwb[`<ۥsR}HJSIJ$j &v ASBK%z5O}jSsܧf}j٧f沞؆'~>S¼#[ZsS!I .3怳) ~/@Q3,`=Ȟ#M@~aa=BKYU#u?R[_ƈ/#TÏq?2@>~{lzDle=H0bi |=†ʯ#,O˂=W|| O"G#*aɇgSPy|c{A(UFs7ҎHz.1RŹ2b`@ ]Q+H}l>j}-tO}cV72H0kp+%eFCJdK!* )R{O _ڐ1RR-'Y/A}THQ/Q!Q!Ad%*d $Cy/ 2MbD-{FO#_A_Cu֌1#bT$pSd%8w *q\5C@ DAt\i+ͅD,-AGD ]"u%8vsϗ4|IKV[q/u%8usϘ{:Jyv$O :ytAӸh <BN6>{!d S3M45LS3M45LS3O<5S3O<5S3O<5,SL25,SL25K(y2'ybQ OIJDzI`P\Kw$v* pɁmw(.tmF"MTm#b(b?~Ɂv7immɁ!T}*ږodTeGhqĵdRv^9)Q,]99@Ѿ;'qd2.,\99@] fA($Ů>_ |<(S-ŤSDp{)<8b gSξYvQuSK!zx& endstream endobj 5286 0 obj << /Length 1244 /Filter /FlateDecode >> stream x]sF+ e'mf:p2 k@_߳eXFF;ư֫@AϳOor/Ð:+#_%C½MzgOOV\&_&N!D_WI;T 禺r尀t'Mnafb7zxo <>OB{SBZqT Q1xSLZw)F7 lB(<|ɱg0`%8ءiNp(>lb`f Ϸ+tD@K/js"t2]oyL3D7Fn횹_L]5s.O`%j[MjuT {G۬lb!i;OS cǙRU\";ԧLvnQ 8qD֔+$?!_[< 7I[K$&/!@{n/t\!A+۱BkG<]ټ^ 9&Dyڔe=>8H6闭*ʨ4^5=3թsEsnךC{|2$铫](F]1v6{Ħetw\oakh[  .hכ|lTQqFkrlL>P OVtap|mBo-%cf?E.}G26Ky;/Pezɞ#vu׿Q5Hb1p|%4ȲaW=m>Y?YbXNR gF.nK| ֪u"MQ6(nVo6aـqeLjQ;H?T6z7lƆ#YWxDgp<_%:xv8 =_aP3ҭo7- 3Y{mFUAPJ"WeM > endstream endobj 5330 0 obj << /Length 1304 /Filter /FlateDecode >> stream xMs8$$sc&SIle( 83\)og)\ CWD7 Ŵf`;>g\cïw//=)7887}G>+H-(sPkp)ZN,?xS)H3SLk+65biT3j)!upd"|U:sxD0E b0U/ 'nm-?ͩBXܖec1 |:')7!iDh؃XOD˙8X9-#J$NMaY/AOzo1mMć VMDb~Q-v5g.qxM:scO8^Gf͘c^Ҥ2l& $RWVH 4fZ,3KfkFW2G7׷sls?ˣfjGɛß7v~!oҹ9j.pko[p 䲵vL~șжԌuj`XC[A3נ~[:5"CFu}9>TPyb/?Dc ǃ6`Z>o`s8 }Qln<Q'*bU%` 3y&EI)Em2B FM$ $L;$rco k[f[@3)- I@AFCbV3:/!EŇBJ– yQ,w@$mf9|0xZj羑6Ც*wB–Wfh7[¬PC;`[٣, K[nk>-p"YWwL?$T5R#@ h\٣~!iuk4J> stream xڽ[]\}_ZR$0 @f7wXL`&ǰ9G=ivRN_b!RNCB 8|+ L!IE(iq*%|ɠoB{J<۸+r2^)`^ZCeUCuܒ` 55ށ֠Sz\Y[PWRPS"m&JCIJ 7BсPL k "d\J-\\l%, _qof CUaBÒPUKB5f`j9'Z,xx) kT0҂{BKul8osh5RKhu76 5ao8-l5 k9tJvQx-\cRU2x'I]*]SObOR; uDzj89V%/pJa/"V)E;qX b52<}(jZZWR a+X$zR0?@;BP/Ӓ\s5l5SO>5SOmjnSs;j~w̭EN fIa+( wEĜz Ug9} т$;\'(`4LUcYPٓΪ(+@ՎW 6PCs/E~[_\`ƺw t$H 6UQ.P?6:jCXFe6j@m( ]vDjXlZYZ4΋:~C[gPUUt;jQ4xuu_>X1@zq.$Y9w8˜c3jlO.bu֘[\=9t^AahLjr#ɟ-r#'=r#Bѻƍ$7(l׸l{HbO''hC A?"Old7).AFDҹH(iAKQXX|^/B7Ÿ$HG6i4}0  Dʅ<FBZ\WE.9g\{5r!9PyM2+ړ\3@[i./8R?F[HGőJ_A49* /b=x>S43DeJtR矸śЄJmHTC( _ [ t bܼm!#.2ivJM$q! .̅9osd~>9>'g'g'g'gЧ?i|d y :2BOMajYfejYfejY<59OyjSss(20">O1!_z GN!_=7,vb!1t9"%BL}%,v.R"#'2PRdbH$EJ]qt{X^4DHj-"EJ; $5Vd*{hQZdHL*|W?9дa_5Z}U6q4m :XQ9yxvpl G}yFD?HN!SsC)~v ;|(A?!mipǢd!P)@i`+CDžjj+jW?>ZN `iXɕkZAOB$]d;A%W8y jS] r(J4{r)PhmK PCh Z56`b^G z8`p $J=;,۬=;2@mprlp|ԣ#_b \G Pug e3|$lt$TÜlGqP_1ڦ endstream endobj 5374 0 obj << /Length 1306 /Filter /FlateDecode >> stream xr8~ 0m==mO"E*D0\[Ivpz&` */׋> `qק[ŀ)\ ul]}"?o~y׋P.GĊn߁s,b[w͕7Skkk)]_ *$.,d..q!w vY렌DD}Pʁvp Wg'YvúX2ٮ>]*6g=NNNgsğrBIzND8S9#B T%;ct `"4Qdя/|G,R54A4 Ď|bXԲE'A}4˜B0ME&K} 4#yO( i$]ps;ۤ̊@cIY9_Fb4r$Dqy&.*49y^9YzegD4[g85IxMs\{UoNTa})DuQD%#::Ы\GU]~7BjGtN`Fᐔ3VcjqJV\۬f(|}0C*C-1cEˑc|z1}F.A9fQX|ɽFaxGka2`Pt:1 ;չL˧1 R2MȌO jF;9JLY̗X/;ydqsӳ}ب{ c&1=Yaym^f,@xqx5Pvw궢R h#ĆN٭*Q6cg1G3f`}heYNdeۣ OK4L\D!r[] Bg,k"U[y\ ,cSB3 eD⧒0ੋǬ%7D188ó 0:N7yoB -ʤQmN*$Œ+h= Ƙ*k8{`)nݸ3Hd^WҔba99Z格 Q6Y.|%4RpC귙\ԕhz ]\b[aw.í0Jכ%gתN  > stream x[s8)xDII'0sO'bN;k}- { -ĊsP3Tt*XRϜckߝ X7^{zzCyw:(ځW03Ds(cqtl1q;X7o؝=Y|u8ʟzVNEԄ:ȟR#i]zXR@Q8ZbqDMT0WZu LoZ׌0aYPg *]AҴ:Ժ}~:#']Ó~ 2d26-Tf8l磁Ȇal&6v3l܋ѧ.1FdՐfP@0}9U9E6ZYEHeLЎ5aٟJCh%rT.rzŅIe;U5BGӾ뜻(zh- ]w:,&tp˚ۖ1 -1m T^hT-"ZEdoBh.p.߽0Pg\!L qgگgrXX2\d$X0H< 4TΈ kOъW}Ucx&- Ժ'. P`(,n1B{8 ;\p,.3ckyAƢUx&`ȸc7o[15.xfm9ǃD8Et=!BwN2]]c#%LljRELtSfz\r^r[.7b6xCJ7uYR[ 4LY"x"Zb:(>VD?%Z]2ʖ&$AT[&iMҲA@~iÇ4Ric7=_^z9>KiDukcOk¥jA"[Tp5Y< Nq%T#U0! vM |ϡ3{yyPR T֏)` T_$/TS5W H~`/;t8&/֐nq.77J[vi5{)x/g!__W)YWfD4^6zƑ7ℿZH+ )펻֣tM } l[qKV!ߠ:CM0uDMMqX uN .4,gv0KOPvB/ |;ӫk9|%S^4Ƿ<,鳐""{2 endstream endobj 5459 0 obj << /Length 1112 /Filter /FlateDecode >> stream x]6+t V-4m6YwzxXm^ & 070@,Ky,'g^`A%YsExՑ;{vvUM>M9ڍRPGBs @z |μS55~`b@H!j%;J8y0_97I6}KyF?UsiBRSy]+&vNmAvjT+ǎ*q0rh~lj4k% xxK]̃$YR Lwx;"iI-S'˃AbgTIZ+TPtVXcZ}\?M+@S鵟:4MLII_tD8&Jƒz`J&WZr~C] 1 WI ap7.w_uEY_}/8F ay+[Yw7exeb~8)w}f=C2a _ye> ȼu#g1ϑ-Jօd9$ ê}t'²# &8}2}A竱heKC:'zm獼=U*b^V󪘀D V>H9 5k묬763RmrYmi ¼na g{{mdϺ7IwW݊o}rQHܖ_;! endstream endobj 5331 0 obj << /Type /ObjStm /N 100 /First 1026 /Length 2736 /Filter /FlateDecode >> stream xڵ[[\~_ZuQI0k?xC0`aNLS}RݾSUhpIT@I8qERMMPSKT\h(& Zk‰$.jEӘRM,5Kǵ)c^×55N$I=iͥ7$K2oC[R"q'ecFR-~GwUFؓJ1\sM܃ <|+ugnT,~솕dE k%';v$ٱV%a-ҧS;v7؎h%<fRks+RsZK{x0zIL? \K4o&lFit1kBEQWRQiR`"~A0Szxummí}k`ĥM1]Aj[M"V^U&ŏ\j ,H]jxl08%X ["e?JfNgXB9yq.bc"^:釛ۻ/xӏ~Kw~-W_?ܥooPTL+.qŋtzN}sN?|?YJLWwAT zapqk6TUg^lTlrP܀3kH(ů dw>O. kpB~p5+@f8K=n%ܚzFP/ !ڃWO>~x} zOx}s#>~z^?Ӽ犭e 7p7DmL̂΂!,_Y8L~BhЬYCf 54\Cs 54\Cs 54\Cf -4[hlBf fjSϪb)4w+Djm턏 <♥H.Kg7V4vUT3lwՆb${3V vŬxC7_֎jyԱiCG;~HЁ3JT>*óɑ2km7}#<70x-2l7D:z(:יV.zۀtU ,~^MQx1vOώB3{Qy PJ :vmݫX}({Ef [μ4=*g[>&߮L5>diFó!h8gS'ܟ{i&UԴHvERIo%db8_-!I }`SRmc*gxsF[ 6<9鈺@˪fd ^!AA3sf/ڐf%/ڐ GE u</!䮜 ɉHi_XH@mMy\QlLeSjCj6*K+&*P!9xfF{8̺jCgn*R{<]۪ >QT+s`2Wl}K9NX:"dufHgVTVB͎~3+j^ "2A} 4'a^Kfw0+ f%Jձjl$VJ\cVfyLNH[` '|MyqGQj_(^&YsЂhAZ-C z={hGhyGhyGhgY8 AC!X-BhLB3Ey6۽{OuQLw0(yKlS(>׽{ ʮᕤP ]cPAvq8l1 :!р;yM `ZuHC_1@/#9!njǛRQtzq'Nؐ{k+"RL; '[qvp`wo2g(>o{ܽ卂{t^AE;x6ߖUцܱz'ogN=/opIO=f/p0([HtTç | i;B- o›A 4k ~;b#k$ThCPA)H ›AM=L+sK;8sWL}KAOj@N@R+NaGSqG [KfU/ JEmLF[?#OE;O(x2[)G-k_kC)Ip4hq&E{8,aED4|h*ޮCǼ6"{:>&XH w|ﳞhGd(9CK(;@FHK(uVx̟g> stream xMs8:Z}Kqkko!;"@*6x1qH'Uf@퇮Vw ٯ/ FBPA%E .׿\?/>FD>|{s}v1we$JAEHֳA)p0N!gTji't|TyTzz)0DLJ pN duTңmRs̃|Seqx9F0sΛo0b* \ҜhUac E$%zlX LQ-7Yu.lo2x-Sv꛲*+ BLBvȭ:r{Țp'*Aa\=0.f\xqGu"{W!FA\ mFԻQQMnt!Ίb0ZqGEqN{4}Cwm(/ߖU5'nYDSy_G y:잽TDNq(At7Щ5z=39 }j 軡lcBz12U荿gAW®H5ZvhRs۸z8֜aWvM˧ [/:f}Wuғ gI+Kk{Ar.m}/:)E@Ҋq#EȼK]bLvkS@*xH|Ԕ*P>,>ڙ> stream xY[S8}ϯ[huKmnv:<;;~䐋ɒ,9.#.AAGJq48G`Ê{ǃ~u aQ;tP#- (~%h> ydM= ɱ#!~W.5׊bFsL.c$U!^L.A6",N+tSOyn0m VU#*Pj9,L.CN8=+hr~h8F\Kzng\yB[~ zV?[!_yVW~Rf^Dz+[o&e,svp~V/q"pL^r b&_RuU5Uk,v3L$MZOp̼Nc:74SV:ʇ >l7`-#U|A09:: 'q$f5.Gxȟb:K+un@k^w$AZz}Job>scx`~o,ոGb%H3j)rOqpGrd⊘s'{8JE]vhͷE- 3H=I'ݍXȖ#7̀ `FU̴)xV=Ny4G8Sl ˱S 349 $O?"| ^mKr\Ɏs}?KcS6·ߊiFم4_Ej! endstream endobj 5460 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 2608 /Filter /FlateDecode >> stream x[Q ~_E+EF$-`~HkZq>Gnƞ1 g C}m%*Dbhb`ʓ8"%D$'b &i6KK>i" Uz"W%by\QKb#JVQ%qo|Ĩ%)1$XO":YV=OcV1J1NhMRp/a53TVpS]*)b]s(N'IżjIǷ4hǷHIMǷzw+Z%[lakxEOiXx}`#,[I-7q$:_v|xf`| x|9n:By:'W \`X<1Th<HG*2F"*A+8,Xa)\b k08jDXDZ,b u)pb .0Sr.Ba7b6j O`_#2&. I-B٤ո7`J2k] xDP6TGDsN#rAn*]dj60w 5Υ߆fbpԖ=X jne4hxXGčۗsA瑞e.̔},lφ3tEO-\`E~i`9N^KkE5l" pmR 8\d.\rH4HK]KGT\l*u*b-)gU)l&v~TD? KEu,m,dOcna8H6s.-H,S?.nɐTG.@ /;@|3Xp=YXl, j|J!uqcv Q}Ov  ##վI!(<,/xG@HB(B .5O}/,Jx.+.t|!MEf%( Cڞ C+.LqkT C .?"dd +HRmOq3.`E|| ޼}ygꗻӻy~ϫxu}!*eQj~Nxñ*7w}6]-<b(qpk[<2u<\ܧ>-iO}ZrlӲM6-۴lӲM6-۴lӲM>-ӲO>-ӲO>-8{GAAjݳ6 EkkPwH,J?W8qe$ okPr-mǥ)Vgό혥mj"Z Ԑ)Ā]B頷Gث!@){}DFumYH(\ t7-PFQno>+z4jn Gi @H~hf"OR(E]ctӻ6M M`]{.vlc%ݺ%U]_w bg6A>6e{?999iZieiZieYJ"J- Hv$(wM*uM}Ó;Ծ)QZL?6ۨCm"֖0 %hwu\ѓh뉊;} %La6vދ2Q}Pn?Zlw29(mQ{$p@TBщs9^(Ļ`WWaK~w'-v/39w =[}d.gv<ఠ,1}CLtPۊdW66p=ҷ;R 90nc,Ʈn^bI-GlXóh-nW ™%7/+Ta|:r t\_~Q_5B-yJl(rjy^=]7AZ endstream endobj 5531 0 obj << /Length 251 /Filter /FlateDecode >> stream xڕPR0 FRu(p1됒4\',LLz= ³;BpV?BY yA*58߀A#x6 [߱gLUpN:2zf=Bw@ _ &23:w((ɟ[Ӄ F˺i4QxhS}:Ӱl>Rj̜tꎂn> stream xڝrܸ[UnKs;*S˕ 6F[6eWr" vOhw&0p7eUyQX./0/i[p{V$e"$a v, ߹qgAjgn¶|,\Vq < Yt0(|Ej/Ļ2< hfLA* }XY-61Aěg5Q TyOY ,G+dGޭakmO@|pӁٵu{* Qը?*a-`8#gkj $ gyWwu? `3,6o>k8 !͋2b~j[)Lւ:Of,ߌ;4#,ʂ#AGyTMt1iz ~HOEq3oN'CaFPtB쎋ERB_gjz|h#Y?X3{Z$9-Zl(lߣ( #vpcHa/l#ij) b79R1At8f Er ʈ$^ zrv5ա,謗l~Xkg՝0  Rnb5!WyRҝ'+T_EʯxSӡ JVtQ^ɑ3 Y`ES /OARV}N!4^`9 q{m mQxSy M掏tkEM@&ۡhl5e#bTXS_Qj_˒4rq#^sͪVVhu!=Nn ^J aZi ~#cPelZOnw~!O{$%I ctvI2YÅЬs獵FgC1%sRNIx`9=W4m#IEg=C D=Mm&96羀>$iP5 49&mk0]W!A#S${(tYfs2 "KX U4'k3阇Ò[ "II9t3~$&;UY'W57so%pM)*8s ߻QS@Sy!_@XUփ(.Qt DNy IV$Q&ýN4bi3)EG(xi V/bWrUyyYL]UNy}>r\rKrм~G'_j 65 իU_5JpP\]NXn{=2XtR|TxaʽxA"<{<X'P ́?}wV?߿/h64 endstream endobj 5554 0 obj << /Length 3288 /Filter /FlateDecode >> stream xڕɖ6_=ncx?{&7$ZH;ק6v BvDKˢMpOze ,f_0KEzIakHc_("btRbsm. t9vL ˾s׎E \ naɵ"ʨ ;9R.ҁ /`Hb?O!ގu;KkCyuyOȪqgYmHFU3eC+$Ctl_L͈ZBsgV-k"a$e`w'Y>,ٌN$z)̑X4c|{⃓0~MϓU=lsh/".JdН#8aFls/ 5G&6"tn挊'h$3qTMm dPv{toQLiOhqޒ!]%z ע0l`bEIl< (y\$%k:/pmζWw\)"/,^!fT& 9f_(la0.8:%5$"Q[AbJi㠜ztW@ 7_䛟߾!_`|x#^eb*V1Ƴ"a؅=7.Tr_4VHbr4nonx5Yݬ\l)Z84.Z]T PJa3ʁ 91X [Ŗ ]WE7a[uqtWyU|!yGt 9mg+mt7mucǺ[sW>l:Zu_֒>|sĘKȓl 1C H̞ @tp1[-o%'T:=~@a,{o?Qs 11b|3+Tgj%<D,g2[3R˔{ƗRupLPr(@[d0ٛ~>zRJB.(Qc xAp%c N:ϻ8)I2A%Lr' s †@ >lZppOt uUߖCE52)ϗc΅Qտz#/Lnde?I?VcS\*+^WO;x) C>8,\ PWOUxӃev4YW 9ŽN43/jb3I#`W?3ByẠ 6P߆з-pA{r9$yێ#Hu{-Y endstream endobj 5582 0 obj << /Length 1349 /Filter /FlateDecode >> stream xڵXKs8 WhOgjEQ-M&@Kʼn,z䱿~AM$F棃Sx̯QQ`_BxBy^FzLq s;{>PT6owA%L GGp@f%4 7d]twU)b"3¿u=&{ߏU4.z>ewRnYI(B9 SQɅttZnj%TiUUTJ/MHj&nxci-g[k/7$jm"&nBЌ1\M]3iT뮵\Dߚqxve-i!XO/C&5q᳀P4#Xcp#Lc HǼ5ZQA/MPmXY,dfj&M^ͳO}:7ރ#3G(7bєmuxpPweV-tI#UJ[94yz/ໃUT(BY~vB8lU@ ZgV&cB֩ɻ4鿳UcfPXQ=O]u.Ҡ9aT%?l. dԫ[Ltw+V6&}'G19*`G  'QBPŏ;4vI(Rd~y3ie۳JsQ=+ӢVm{kL ¤Q^5zwe2XP*K1NZ05F9ߖM+)k TYiѨԪ?Ȯ2[e*-Cc֮zgq Fg^Kߜ4fPɠAvg?wkWO"BMnk~f6/S,TfC$yQ= o]ܻFS|h߽8XoeOꗟ?xhYKsu&:ޅ40oO[souCn ?`3Z|_?E'}ݦFbL%sp1Ii.M#݂)`3epzA\"^VajgbPciv^˪p-v>2ur㝃u]{Vmpȟ^\bSc615EDg_&18~ y\A@Ni8fãGqc*ikZo L6Eh}tVx*88U1g>4S؊{JNC7{>sb։1xXD(Q: endstream endobj 5610 0 obj << /Length 255 /Filter /FlateDecode >> stream xڕP=O0+h5ϟq:" CZUUC8q҉=; r[xijrg-V@aM-TK(* ˧kD׮;Ʀא|$9ݙ7>-*|3hѽ; w^y"Yqi,s*\8pLЄg3Y8B Ɣr>2#0 1z.UC9xku1e"SH.6HCt U /b endstream endobj 5614 0 obj << /Length 139 /Filter /FlateDecode >> stream xm1 0=dydT0ġ -.ե8L@*YiվݱJ$A> stream x3PHW0Pp2Ac( endstream endobj 5632 0 obj << /Length 1739 /Filter /FlateDecode >> stream xڭWK6 С3gbDsv۝$Ze5t\ (yn6^$ `^]I]ݬ /YRxY4<`iƽU}ڊa<կgC8gQs<$I7mt5 ם6mF peIsΊ0L4bqP2 Ap?Ǿ(a̯qM:N_xHIh$bvꛭp7\De_& ")VE/` &&1=hо[:,v4tF83GY9]E $=^ypjU+ڇ-qEmH g6ȹz8cճ.XiGu#˗3S^Ɗ,G$,-2R24(f8R M0wmi]m!wP{tRV/R{`Rm,CT%<Xf>$6zI\6cp6"ޑX#0طPahr -ۑhHGWEk'E1߽u*QFV;GQF Fj[=%HTMd]5jh.I#"A{M$Ag+RВd2 nme5r]3wB2WQr”VQhve,ѲR}F7 vr 8q{hUI6W4]/r8N P),bex2/S(pUdAsh(N41ءqvk3nݾAjk`q>k!P4& 48۲2S҇\!U{ Vє`T·2K6)s20wF̶=)'/|daYAbI6rG@f1[}1NWNiBdKAIni2W;,MG, 4"MY:䵱#n=">]yИڛAEr[mTۦlyuC0s*#Uٖq834~L# 897ͳ"(wAğ,J{'^1! (0 (OrA)2>5Eq(Hs&I 7Z6Z94X =JYbH^3scQ]G`>c Kd:{Y6T #*tɹQP$ɿ]^ct'9p[j$w5_9|Pk#n4fPŞ[k3(JJVJj Ѳ8Gu76sG._=+$cC[7 SNy-{Nxg<(H,^n>޺$^[IACxikIZЋpnł>*'HY|dbM7ִO*X0ű"P/C~NA!`ܐHfnQT,D:jJ{)}[3u'zȧprTzCM!> stream xڝYY6~_ʃ\5IݚlU&Ǥ9Ai[ղR_ uNO^Lww7oe,Oл{)gYxiDxw;w_wya3#XgzUj_4;"nu= |#n{b'XD^y`;0ϼG3Eq(>rg #X $CINQ Zq‚,tSm*-˲[N{•`d3J\6jK s s=s7V+3na$fi>këK 7- j~ǀ6R}3c5=k+}_ۢJt,#[O W$~I:wܡxɿ~j D # 08C79ڭtFO!kh&|čdG (RF](C3HF`Dd-`Z-3YkS,Gȇ`0;3 &n얰+eQ]mwϟCcU2wȥb ? N1 {!T&,I"tLE 6\D VDoХ!L][VA a\P@+e_. A endstream endobj 5533 0 obj << /Type /ObjStm /N 100 /First 960 /Length 2603 /Filter /FlateDecode >> stream xZkSί͇hnwo&*T*eb<{Z0!6ޤj#dM>Jxoʣa>$aT][4G "*=A?YZ.-ZX<8L\c-Y ~ ?gʒd#${ 5/' Z36O JNSc1GX:$c&Zn%2 FXX.&.U<s+CH8-Q@$<)\~p Gp)c!ҊLbDrc}v }xקgE`/a`YR1"D!&̅)MhPRF`?d˅U0HD0 ``m*j£sX+"OXIHb"KÂbTǣrWxˆC")`GIQW5kJ)(ͿBz6vJ1OR*GMXnmoo(Vɬqno˶7ò<ܹu9O >䥁 EeL _=x+"$ h`dx $b{[Y6,cr&]Q3qqjl|jɤaevp];{5jUgWVnFeŋeX AjIN5Zzx`j0l'o_>>ڪXk႑|ppH=oz3-'&UCG#a6 ^'NF<<puJx!FmE>?LgiWW6Gus: W٠{`~jyJԑ$Z#-2#/-%x zgtG/q~|VU<KOdʃT8K Xl :^,'idjA.)m2;c1-Qɯ";T:w7+GGm`T4H#I/}D0 B$A pq9H A8\ua9Ps?YvoŃ7>D§+;T]t 5::_F7uLd$S':IN2u)}n%M0҂kbB!e@7W bg{;P g~Kl6GQ4 P)yBVȣ؛|ߊ{t8e Ɛqq~Taz0ȜH[I9po'4Ól󳲙-cϋx '=ZWGؒ78 5|Ox!~2z9ig1GK>2r O)QΉ U6haD6E))S'.Rh`\t Z˥ '?YnE2eDCԏݲ6'x A5maM5ԿOz>(oZ^P^ϧӺ U>i _Ћbw`s(TI#Y"Ajw<b5#1Es~@{0ѷJ@tueu1xqy v9Oxp A뎠,Q?x]ckgpΚ N=,p!(IoV% Ψ6p0+G)\{^~ζ֣Oȩ`~TF{fsΨ(vzU E[l,EMEZ9 H~c)L`dR;` nIƃٕn'JA߾[kA|-nJ]{&pk5_bb ԳtZ}qyZ{z(!U jخẆWE`cC+Ղ@^΁"J(H*]8??5cY7E[α|\V0\D-r!m,{Gt}2v UK8a`$EHmyZ0/>#8n6O>_>Js-4˕8(Bz83+?r!˧9YpYLΪjC%Ro_9Wm~48t]Zw}VWmٞķr k|M|cܦ==)ZEZOl°a3ѳ\]S-S"LF endstream endobj 5658 0 obj << /Length 2677 /Filter /FlateDecode >> stream xڝYYo8~h` E6簓I2 ف݂u뷊qMJu|na/NެO.Ib]6 }DtNX8 B떷mV;KjVrUʗ]Cyb5Jz~} Fh8O{³_6qp 8b../nOub+Cl<2+RohO=2 1eCB c0l)&(^x12 z5r]RϪj-8d9pYyoދTn4ԋ%p8::^rT[IlKF MHD[S2(. G/Ȋ@e [OGFƽן~v@@73oJe{YY3P8k1}j]+B0dl(bK"sPm]s&xP\mb6b; !SR+:d+^Nm ϺU":?MÉ8UJAQȔb>Ń/ oI§! YX\tf@9ʳO!(Uͅ8݊πIA].LGT)w_P-7?ie~ZLQ1‚d7mr8J2ZJB)_2Q![?ҫ=tnrz m'.Q}>csiAୗngxd7*}1C'ڂ|aJɋʘ*Pb]qv ̦pH! =N߫96\*OU)^M4:Cc5l.ĸc`bRM+%R'},|%lUjJrWYJ1EA '(e'`wƀX貈87: Ah_<8M |1l0c/V-@/nmSjA{|/#+ڪ0ʴO u$Qo">^:0Hi:Hvּ>ۋh;p}D)[ĝ6cFX7 Q'cWUĉEVaL+S;q#m+y-Zc&̔kI0MLTBcshPllb;Lr^^U1Qf&SuafrSX!lqs)v֛Kzh m0 4c;*zxMCq_:9ԏM=9ѠjPC6U US=uj endstream endobj 5667 0 obj << /Length 1687 /Filter /FlateDecode >> stream xڭXKs8 WЃ43Lmcvnlm'H͉,z- Hvvf/1 ~x0[x{9y>&"M#o~eie`ikq>C}>V",˶˦1f}y &/擿'!^;'Y.bZM>}^ 7gQ{FrIĒ8u&N Ӑqgǥj$RDe1ؗAoGVC!=(FUetK[Uݰ^NMj=fGUdFUV0; R[I+DZ*zwLk\$~I.Hڊ^9.0قa@* ϊɨįeUY$*/9rNV]y76Ht#E٭u[cڬ/!{$7h3+^l 9˒"E܂-"Xb9_`V|n-IM,mQȲL@%R(0@z &/@$FG&O-[2$ {PMCrM ذ'ֆcND 3b|U=CSkrԘ xzmkOn~`!SRN-@ԪioNso?c?[푵d;vWU\hq b'TλݦVT m7v+K-oU+;i)GKV%pD}S}[ ]= X=2mRvLts,3 ƴ+"M8c˓`BsP}@$tj j?Nգ7Ƕ:DckkK&>yzʝ:x<@P^@C!P ^s8M+^~S)66T-;3F%VeTU}^$2CgDUP %71; :uc~.y. hET[z̐}m.j;xuNG0L\LX ]w|. rUnwro DDf bTdS3-کGuDFhͬkFGdZ7lp3!+aH XF'kvSyn19ùO_X P4PY0wa!is󏒚as~װ~҃'gvFʲ<}mXĬvWOb!Ł{?pdgIT1 -jAE} W_fstiS)-Qu'ӴZj 4qSolFPkFe}iIXtAA wSe0a$~4FGZ)(IND8JݍMmuSH+IxaS)Lv(ʅQzI~֍@D ؤ0a  I1(Bޯ0uPWƣ ޢo<>A\ O= ^߿v0H (qR7 [lߓA.[ טZE_U1V+{Z?]WڔzEZ endstream endobj 5676 0 obj << /Length 1470 /Filter /FlateDecode >> stream xWKs6W9SRvZf<IUL. CNN;Ӌ,}|""j6(bjk[D'Qk>پ8/7J}6ܡt)`˜j}2%f(E++f>kk,da}; +AYr4 hJB x~,"19h* aR>-Ƅ;/hY3w\JRT^9Qh7in RpFs~P+^|mXxQ #< n&jlFJ ER(5֣k.*9/Q 74RۻSՆ ퟌrcmRGj ];\q ;&T::xt_wu.T| xQ<7!UzDE͋4縌7Ƙv|2A}ԏP*xPMׇVti,Fei8{V\u$h^p.ŁR%aT=yUy )Ձyp@/4U#hS`t`S PE14o4>4f<7Rha%F]knVk /MoxˍIB/_LAĄA{ ]U? `=!+~$~ rd@^BT kZa=A(߫Z#;S0ӼPf  0R舕\VxB:Ԇ`´tuMc_,lepUg q/&Sۛ;+zf{rzJ{cei<W m"`C!OseoDو6JW DŽƽ&HЫB)ѩLDYJ6ʕμn/g'uyp2̍j^!pMI h*}b::`}12)\ZfOb ~ssR"46>r.94*J^Gy]nޤCDÐJ)XM(+j%b k )оyr&Fx:9xv~u^|z7oi`o۴u/1.'^gprvB.ֽQ|xF&1'?\*?/ ŗ䍹B.y| qD N|_wVw/z0WFWYSW"\K(  endstream endobj 5664 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./tasks_size_overhead.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 5685 0 R /BBox [0 0 360 216] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 5686 0 R >>/Font << /R8 5687 0 R>> >> /Length 5916 /Filter /FlateDecode >> stream x]K,qϯ6@`@.EEr-& #?$]}9$[4_uaWUM??۟o%s?o+|Jaυ?}Ǹ-} _rK澶iQ@%TeI<&?q 8stOm}s?t R565xш2ȈXhhhDdDrFj` 4B4^4Lj쌈[+PChH\%[E$It^$ޒ( %R%i 7QQ`,n*W-eH!/cwodCխ}賝~6,[O5,oxuAH?=V;i[vpfPY#W,|ȊMAc55?D46Wht`'ޞ'Ღ7~^bF=YDzfR3rp鬱~J?Q)\1E>B{ֳg}W5Mo7֣FO5%3>V z<斛w -u"i_EkM.)8{bx 7£;K--"5gHvb9&ĖQD˧♫}&,grkOA 8c+u'.'R.P|Eۿie+PY;,dRf̡ڔK{ k=foˆϒ΃&9ȏ^.)wgv> =LQ߁85Y6#570cTE$dy &f;9a`aar[ɪglh#QODV[u4I` ~Jȋm~|F%֨ň-t5b+[Bu.[![Owcj!؆ ؒxPJ!ZD\L,XC񠇠.8 Tm{_蜡MCT=1]rо^WxƉd=Xl;4B 9x&g)u{:9l O:&3ڡi jb'س{ >㪁嚤O5EI.WL,K*d܃E%kq.Z(Z+]Zu{}oFk[_!; 2zys"O{}=qxuDLTȗ(bʈX eȆ"+&*a<B>.T)ij=EڏLQ@axCV@ vDMO-8IJ1j^2p=UO:60=2 JWL(?$IW {8=!yȵcLωiå+#6ґEi݊)I[]%s*׍y)r={&ΐ16x/!]*Ț(+Zߍւ0Ԍ<{=t "t!mI)u^@'?Γ)؁'7. 4Пß;xK*n&SIԙC qqPS qyC1O%a,Rf ԅRڥĻt #yDzƽsEq>D+د.Z(kbn[(8]"hs* @Eh;G 7H[\ :E/{j,re_1L/ qe껗yM`60( XBA5wC߻?)m4J,;S֙/PvUnW88'sT(j[0G'}w*Hv˅T(ST 'j+#A&HZ#'XWH.UNC&*v C)Z;6JY `3P AV':Yr CECs|hW^Uߕ]dL,}1ϭ3iiv-v͎M=.vM=.]g$|˸$T1xS L)v_ 3%,ԝsPPD 5\g=ނ2 `Frw"w>K/AY2{qX%`%*{[Pxƒ͡XZPq. lYK *OSCq-yjA+*Kf{Q ) 9ҧPSK|$X\h3j7P1 =$rqwsHL"e@#[2bcT'l.r(ӂcֽIrA%[_Ϊ5ftC{@/ /[R C%ɤ?Tߢ+^b!P,o 92BpPƸiPV)~C^ C8ieO9Z0]=F܂ )6<."8p |dC(~Φaqu\M!"u}x@ @B y@ NTa)SK1]t5zJzBj\ "H$5;ah ,0$v@j {#>[",Q"` ~!tq=K0axc!$&da$EHKL'q%縕ۄ#}i7/7p` #HA00w6߼ӊ4ЮB/x~y[.qإ()-A,S.-n )`rnbt.r10 Jf\@rsqVn緐u<܍Bki-/*?SN snJ]װv߈z^G;LgdVab>d& 5DG%+Bz.E7vTwEECtNLѠ=PZ:r0}Y\'Uu&dk@د î~]R+y%WT|S!)1z1ʀz*y4PuJ xSҠ}Di bHU€ ƸL$D҃ǃ#H!&Ra 2L %_Aԋ/p59(?81X4 ?\b1;_(~Z+A|tXJCRRW ݏF?]txKQ7yk\c3kP~.}G櫿0a+xePhF.eYġS̆ [D>@@K9(́osRߠ磨ct-Qpcgej'DQ#J>P5n._qk^8f؆5ekؘ= cOuZ.ա HB%Ȁsh GiŬ[( 1WwI%_D[RwoΩ 4`VawRl gŌb)s8c%r2a62.J:DYRUEt0y]KwF6Vi,nb28EV0ۏh!!Yc!3p?FeKZSݐPq7??}>2 y e᱘DG%DV{IU[qc{T${/ JrL|%_zxl kfWLJyRWDY_?16u8ob ܒe3g?c̈A=m$..eYDn3~4ɞgC=س,E>4;0UМN֮Ь^]v!U2ZRE94S@4SoNP0'wSWI< G%e4Wvqbh8fӁ{MEl8S˸^ol4SM]l/6%:N> stream x]=0 "7'T)BVU (С-w+q6/Xu~[4{gEgփR6,ko:?8'ȞH/Ů1K#0JZ%NR9f&B(Bɺ& ;ubF4J6IM(BT *mrIK 7[td9+9c/e endstream endobj 5690 0 obj << /Filter /FlateDecode /Length1 7664 /Length 5424 >> stream xX}\TU?>sgmށLͷ\hA\@LEiM 2ɷEsmPrH3dV=iQK"ߝ|{9w9|%j$i)i$t9Z1}¼p=]Bs]!rb=pѐG"`{hpBrBAl:Ai! .y,9 ɻs0"qǺ瑼sSs/>^)Z >MOڦO ;M/R \ i7+|X  *UpNv~ dg8qx9CK5mv]Npjr[Mop8s8uq8jrk| rxH{Z<;;#~w>8j8 zp ^1}>?Y>Yerrx^{,îF+ v|`@5}mM5/İ|xa^2<8l6- ,zldFx 6m<6qX6Ū|*S>xCÆ~:T`CE>#S>XkpxPf5Vs(UVPmc%>Xa9njLja)%]P`Qq(^x|6üUV 8aFBn<sa -34>\1miTfӢ^+3)!Kwsz̦rK)&&M٤42L0Wøja 'C&n۬phGh F`$]0l̆Yah !CC\n[t,-:HMѱT` , L>,l,?>ӱ~& C<8xQN<Ƞ b@ Vb8DC2!EƀC vp01 S>9A㠕AATVAď"Z 8F> @8 _$Mpkrb-bۍY5"]jV*$"Ff-Iw1ػ?*,pޏ*܁u$#,=ZnTjl8,[,fYHL#f)OaCͶmm5W]We~K M{Mb^+x1}.+ʞswY<6`kT$Q%7ɭM3nҞ֩8z&Q5 _kr:?OC'u''t#z+PfOCDbfL#h~n1;#VZG S\o˞\}zkzO <8a3G%/UKsDOOΦV+أm1b,n%Qiil}ǔŖn!9>!c(v/>NReFDURIœS^*VZ;M#nzgoI9!kP({RLlr͒#IJtD8ydX)I 2OzMHzDζv+rFNR_sy"ɡ.j޸~.e(ʕL3/7 vwg8]M;O)6~-iUyvﲢ⒄~=܇GF\0:UQXz-qHjQo:^BZG7nOCYBjϠj(J#2,#OU$M&h2 S i]JWZj@ejxsٛ(ϟy?Zotu؝A2؀YcTvE9D+K.ިY຿Ȋ+ +> MaD։JnR!'0p.[W9o։_yWy1OL߿z<ͷ9Џ(W!PLI 3 1I R 8"MJ>NqE80Ƞ!L[wۏ&ى-"6f %?rhl0ZjL%ޣ$oZ{ݎP͔}4)xB} 0{qQay0򿇂lEBzEz43 YĘP'H*lYb4EI3^`TDz2>o!P b6=^R͠rh<‰K(Igwa   !I FkPU+5Z0aKp41T=Dnφj#Yo 7NBzZnBn1dhD_a={6nܻ)DzvoZ.~U~uMm\&᭭[_(:shCSU|Uhޒ%XB~ H.GQ7Rkvչܢܶ>,6.mW{jJm_ gDHJEH+lTчH"9C  ԏҌҎҍR\jWK9> d鶐a"i&DF,9Kz{ϖ/)瀤{͗/7c [6]x,'Ք1˔5KP_MM& 8G(9i Á392E΀]geL)d2l*E*.$P(5jxf3p@T!C柞=݇y'?M/QUPسnkQxpC0ZA6m9|`{L$k>+ABl߉sIKS҈>fN7gIoC <67EVT7EP0~= )7\MnUf-!CHz8gXQSj&c8Ђ5*_@ dJ zfƜeŧ42tw [JNc9b`16oe\V:AC`P]DZ*7JŃQ`T-j{t؟q"k4" O:p`P̽+ PZ#xv4Fr`4{G (=h%Amўm`Nn:;pd ׏:S]TO75.3ne9\Y,O7+.+(qUTxmL $v$ uzrE"wȻڵڽڳ}V:oQ {2R8~au{Q-G!dv+; %&v+6|RCcS]"hq'B0.MʤVG@SP Yq?֔ E"RkQyl芵D 6>MͲUO"t3o\"9zK{{QXɿK@>E "jA+XH$11g4h2jSuV)&HKع/H" H^W}stpaQE,Xjcَ K- b2)dVrTl'wXQ&O"="(FAN*ELJ¶o.`o4[ qv߫w0,w $"7 endstream endobj 5694 0 obj << /Length 618 /Filter /FlateDecode >> stream xڕTR0+g@aKŠ鰠LGJMW/B<:J,7,$9g`6FsPH8 K&c@vu@flg *k1){ 3f<$? ;9'uX$Tq٧$kw,uPa2 sت~*a=ATi\[+S]k<VԍP-J- җh.YےXU=*4 A22&g)z> stream xXm۸½kqrqI+m 64 尡e&"K$go3%vhb9"%g뙜)xq4Lyf׫Y*E$$"Irwѻl~d^8>IPf23?Eug GUe7dZE/R1NB!JJG״Ւ;Six)ip˺3MM5D$! 2)x1܏ʢǭ0 nU;ѻ!AӷeY3K&Үms%--7h{c1u5d})Gb4M)1;WC2Y@}4+R2'A{;XP\yKZKj&quO0bOJ/pVdVNi 8_>,!Pw~mr'T",vSINRqzf-zOi  :r吳F!ƉACO4wJ i?2 ͼ^0)Q37f{),6qc:}eөHzUlidl);[b _Xp`s20&|\?391gct (hVV-~C#*4T!@f|˶mZ Rm5"%{Vӣ: 8*v~O~ Tzv, [k|+ePN -nXB-P.&]M0z)zľJX]iNsO@Xや{mۤB&|hQEY$ǩC(`a(?ԢݢEB[w1ņABKFxmt7flUNyhxSurqb+0ITQYT Kwb'NJv&kH~GL%ys5}_B>賯pٳrejCƧ_`p~0}G0!$#6SX$N<N&o Vz<TU4$*JXjq?Ӄ5x[NR&C+dO=0oGtW|Q*<ҕguH"?!8D"Zjr9:~ϜCuHMg هT迚}GV:5uGŹ2vYM-s,hTcԂ(8FcˈV!]-CFg-ݚZ; ,RcxPf/?+q6 Y[*D{}f ,q_-iu!xy8,LU.On3f[{\.õ~~H'E):Td@ӝ午Hue&R AO"bhO]W_4ʬ~U;i`oUQfx(xlӓ3}Эы|Ѯw'$f[`Yh~Oߩznk fߟ8!ϘxW̭qE9~s7n=]=ͭs"|.zl[MgȧL=~2xj`!‹7/ K- wj8(E͠ endstream endobj 5726 0 obj << /Length 2951 /Filter /FlateDecode >> stream xڵَF}B>X\dv^{ ?ƠEH)Rlߺ8}uu]-'WٵYD"J\+tW>^ra'ڍO_.~|p:lqlŮH?ڋ--/yXg|BgбlC(qe l4>ęMr+7Xj=y/Z6{OWʢf,*isʱAWДlkAQիY9KUk/̺E12lT;~^wm*{v+ SEZn;a[nsd,J'@I/e ֎m&2߭xYV_BS,ׅǯ^򩢻87|;Y4:m@E /$^xtDA2tY1?V*+9zZ89쥁lTUՖD ҷ(HB#}r<_mVi LY&^ NߞNNnj)[k?:667H2ۭގ 7v7y1|=C ?HϼFgZI̻XQȬM([C?ϲNl?X1ߪbsŞmz̏ \7s,E$iH/xQ7\PJ6-;5{%g)-}PY>SZå+tn|}gMR /םY)B0v|:kD @>_YCrqjB/mvs u4Q3;e[>}#0Yxˊ1Mg{){YĈz%y/s=O&_]WyԼ I&¡EJ{ hOg@B&$X+˱7m)wr-pQô,AhDlJCILrjS=ei⃶4I @KW<Ճ@@[3 ݫeAlDEQL]DZeG{ؐ`oUxf^*#d YxPӐ GSYcjXZdY)$=ow.csnurTώ6Fk \, A N$Q'OuBL3X>([2pka&e!!h1.R:AV;m8-D"ñ̊FWB< q=tĕ;=W<[ܜ.u_?(:&^S!<ߊZqB+%"@B; ; ɷ$0³ k;4 s@׎T PC$m#u ˛I}M::kQ9HHsŶ1z?C!BI!ֹ`ɜֲnYLU` 'Z i1q4Hab,x^ytO'5}ydN^#J ȣ4pƿ׹D- >"LYnIA8lY B@他Ȑ"`&Ǜ>H{o+b4Nje.$=E2h޷͖s\=[PI2FǒDFuyҷU>S)8/8}Fȡ\g{4 D]zR ɬ2 ʈPh=y^U#$%]518Y<К[ ha,mƍ2sj>͉f?FɉB./ԥp҇Od2М k/ \iq}ZQ %7!^v"b2gAa}$}֙L۪&5q6 PW*'r-#v{mV+Jz{U|񉅐! d&,@ Y("vB^>tO_83Tj?SgBˍBҾ@Za(\R]u`"ػG򰝀GsgMnmV / ni $aT IA endstream endobj 5771 0 obj << /Length 2640 /Filter /FlateDecode >> stream xk "HZ*8$3icAƊQ*R )R\͇~9cv;yg\=y{N"( ˕{""'N}Iru~EQ_s}ڔkn՛?~M+^ @8q˳IXQOm޾%}x"HBnP볿y,W wvNzH4͞")Vl,-n<he$ ?!k (;RO޲)Mcta>3+ 9d2}$O“3!vl=|@hwxO,9|IBR;D0D5B&c򍮯T(DhZ'-Z>ɧ%[G_J͊)'#ιOrBBKK!p `'V7Y̋2_2_D/VTHd:m)#u2 G>.-][\т<-n+. A×+=uޜ? fٹ֦A7Ƣ.|Yrt^uV"ZHAX`B?>yw}Sf}UV7wI.xV{*$ 6{3o{n|V](7'G X$eu]N :Iz 8ϛþr/8DDXS'bFX qwEg?b7J(ۊ~ 0Ljk*d̓L1g\@]6uSF>Ge*Wc| BCc!i^E0icfY6ؼQ|墣[]]s5VzIۼljZEe#^b_8m uhPD*%hG.p{~9DAGPy,..=^-B;15Q4ݵ)'WbCZf@AV+L*74NߟsI \fä-jHS}yn,h4p-'!v\BP_A,hw,3f97'O h(9.ŮYіu>vwht3qfJ [Táḫ09Vk, /7}&XH le*Z%9qmU>E}}@O...0 3W=^!ÜuK K~"JmVfw($#DuBUl(.+&g%uZ Uun|;A$/uTxpjOC"滓m <[d jz>_>Rۜޕ>G6;[XR%Ρ%őkjzRý-K (9=0pMK<޲4zm ƈ.n|,%^ׁ#Lcp?7R?lO`{?w~ߏӷڻ?7o?`?ig\{o6*ܟ]9coʴ ?JD'yuFT?P|G!ߓFR^h 1qhQUW۟oe-W endstream endobj 5654 0 obj << /Type /ObjStm /N 100 /First 954 /Length 3054 /Filter /FlateDecode >> stream xZko_oMPsHA$ oi{>(y[[2$"{:vƊp83%Y䵈IPږ:$0̭00pVXmJx?0 "x R"̵̓H:hE2JU$R{"DR%΃ ~񟧠vD y+Uq4`:h9bH¨rR( Lfk˒?$~6.``X;ثUR\YAa j-ڱ&X޴NaY>EၠX=-?Hpt9&ģGbJusNmf]y1}zL@7g9_b/E*Ͻѓ͋0z9z5z^ `CPD)IkIDa2ɨ-Mы\!r;bKlAޖXK'vH$˭Xk_}wnz<궉dAM$#S!H[ bI-18G bIUEkw׭b;t2;F$ k! r!d{xxq2_͢;_$jŃd+R߁`ERXͱTS! -5Vd:q4*Wkrum=zq*{7BwT\Nl'?/r}y),^mQݬkmkisÏn\=={fuҵV-PK S%ƒkU~7[{`\PIB-nt}'sLwUgoI`Fh>x6t)vٰ*L:f =~tojUv4 AWg`R cn6-nxRk1wT jмn( GL5$ 2ҫI{d?zTV=nإFGwo_tѵr:g d1z 8A *'ocyƘ凍7J_{oCHnKZ@"KgPJ.϶cjڤGa`vW$P&iԝJZ{ ^*mDߖ0! n^G\ϥ*Q_f_2Wg\d_jMfjMfzUEngAaoi7H)8he8%(ꐥutRᄼn`<["-{ ʀ;7.tܪQp dι{OO;C,w_ '"" ١w1Hg芭f[kwՖ{D'n~%Om7`ˣ{!qq3 ht?0zκ{κl/0_4  D#dJo[r3,P1q<0y٬rT[טUj5LNlj* Dh{s&DQ2U:S8kd8 o)P! 92 DSH9UyT,O :FdbF:; \-.͚b@iШ+0d;[:fЯm7jR+rDc!m%i.\,GVј*'hpฉ( v1ileC?. wj֭:["/κʴJ bՔ >2n3@8 :MP >b3.vUzRHf)TW3X㤶(4 DPEr,$ ;&Te&:*CU2 e8nf4aD6ujrN&[IyH [b))hN 8ć*]5 fSkGi=Հ.߈ߢCiUY@QOy3 -hN1] =8<*҄KGz]qk@D0o-<UVEfWCjU]U'WY<jR-uL.yP+ta%Hfg]ӭ=> stream xYo6ݿBAb.*E]5.-ӶY$9NJ}A"W_#gz%#̾l]|'}ys(+N51GEon"]5|>"fe& FV753`^)\DR#_:CϬrQ|I6GjK-8Ih,iEWq:ӳ1 ! iJMJm뀄>wԋ4Y=Z}uH&rn$6L/@>h`UmވK:W;In1J)ERl1D{b*'Mxijoq3f=*O k71 > N}~ULD:0@ GZZ ~e6InRA^;DQ;]@1MoO91ijIjSEH#Pm:^œz0"՛`VѪ`,,剞E+}}J#ybT<8?CI mkB#Dp3J38uB% prU#w%)@T([IKñM0^t˘<ǥCr[r=08mIʕ$ɺ\ɍΥZ[e]+8̑&@k?oP^**`y)ʓ(#p{ɋB ָY㩙B^DD}ˊ`FJ*>IYy\O *$E`{Uz6&3kY\$(;rtIR0`0hcIsI)b rP [-A1Ȳ,wV9m lqI'z|S M74&^5'ƫmc}&?V$$n܈K (G ms~SuzAa*i ./x(HZs6P^md-ٕnQoeYmr;lS^(1WbJwmwt֞d(UT"岖(C*MdwkEEZ7r=& WGܳ\٦Nr;24ueSN4N |]L<1zy@@~x X6I`}kZ65G֥]׉/P@{P֋#^܇^mHΔ]=`>E.te=;@֌t5ƒ;#WCQ)UJjN3T*hn|$t|>}v 2d.KRխہ@m.706Qρ2N>k\htNEdΤ`!mT"./oUA.zMJ"j̮#gWb|0sS4Xd%%5O',3}> stream xko~XkkQ>۹ rRJ&B I);|:IypV6,ﳣKa =6f+÷Xy qcMٓljkrY,4r[6^_*IMeq/G ,}d1}oXAk3ױa7G8zf<άLBF{fAy,SY>Y|GYH-qBU2Yg@pdꇖ9mRZe JF$bt}ud|T[**Pv7D>B}$7&ab9 ]DHMT  h{X"!,ip5zH 7"™^1 pq a?OkFNf]8"r aJ #bXF.aC&!Nk8p/z66q󵉫e@fRi`+ZیvU|+K-R=x$4GGQ+)IEY UҢP?  ]S[t|˖ziϫa@d| ӡٻNh6Ҩė𢎝gF +0~hpB]esNeAtX)RR+E7Vv>*舦ms[(.?'$qmZ)s^T9-.wMRi:tAhhv h ݳr8q5$W&ʒ.(=qTE(=eEQyp=fN]`pNiwZIZs%91 dϨ]n=U֩Hu;.AsT>h k'E"I Q'MHUYO ARm +k^r~`N^.($;5!s6F=kvqRVp<(RwS(0t0:(X4Wm9`[$U7-& M8̳V%.{Zdɹz- U*@]uVf?:X2b 緯AA! #ݎF$:>.8QCl54J EtMFVH2Y-G^+uB̐d_ժ UG7CO _ NZ}r?4 ܊4ckL@, *Ɇf0|Sj9so-|W fZ]/ށD 5$qA ڷ롶VT R_a6KLm~p4F1DYd|hI=|bH)e^յ0.Ї;uoT9ɗ:%/@v8}tlg3/HcZRH*3nnۃꟶEDMD-;my|@!OxZUaZĝHN8M`pJ:rryv>{wMcq7a$ǭevQt~/|d2Ϣ|ZS6yrxb|[)h4Z*j|` }Pxw *!I'=[N1EyAVBJ]DbXW<@ę} u=MUDtjE*s1&ާܧ)=v5B4< #|n&*~m_^:!hiW0USpP.^hP*Wx7 ߷(ivIag7kCg׋.Pۭ gY͠ u5K}-u BoHE^LoU_vq =iDϷ;uW77r`c;1rzmجɺ,& L1/t3)c"\[M\"B!ቝ[M}|hA.1 fYn1Q]˪6(ĵN:LXIA(+u_XCUG}T#L.dEwGR𺖎VfZB2ĉ"¼0dpD`Nu{vr%}CՃ@77<&|iU^LQUz֭KoB?,҈S ۏz@+<_SqW]H?w endstream endobj 5833 0 obj << /Length 2425 /Filter /FlateDecode >> stream xYstl0#¸OǑiDZV(`{hy5Y\ JÂgBqu0KaJ$uQ.$hoO1߳{$Bi(.TFQZB˸\#\5y2%b& yMӁ Vh$}#~`L|Hx.Ԥ4"3MxA9ŵ9\I9G(WB=cJRvk5%n<ksC}Je6U=ϊf}^?RB }qRL\V@Z%Ѧ"rz" szqMIA7E @ 1A)!qU5-PuU"FU#ǂ'-ƅ~hPmUS 2 fd; "` r8b2qQ8flq!JJ\r0Iru E)W9A*蹽M8J˴GrUOeOKc6l1`N5L7@t.zDϏ_l-תc4_ySՠ~[' ;]APkTϥH>m!4ME)j%劣+@6arV :i8گȹ*w>;'lS Zy, ]P✦DY"_HcPƛꐆY/TWe!#1ZPDV\OQ" pWҰ}<L\vSCφn ˽B!5鏪MRSlT6n]jwDU`GO]rLݤJI1J׈)U8;ޯGd^|@ +dħ꘱GQbu5X,Zb'UzIUc Ƀa":i4QMVSYl$p_c+|x}@|T`TpY--mKA/(sѨ|.J`+,%# :ZoJ26;:}?'QX ߊ؈MQިUD!"$b3NgTfG`o]>pHR:Vx^Z}/6S2w]Zԋq6* 8HNM#~dɝڧR\BHfc,_zNWf`yM)ueRX\jmzE/nbbIP;oxÂ.k, juԹgOxҲ26z@VKնw PuT4Y Kxva*܎d!f?Jeg֭ߩpvqhvrkɘw"r|~ax8g秋|9s&O=\5'~#c\>&^*!#g?"*^Q_5TO+"Zvp+tk!)&jg̶opo#_7{~!Y|_JľJ}VT_~8{؉$<{'/ymGx:+ 5YSC7  endstream endobj 5852 0 obj << /Length 2492 /Filter /FlateDecode >> stream xڽYs۸ւ IGsLgQi0Hq||HTbOs&o Z[/'oۊXuBEA`n]ge|짹oDڔ_I.5|UT?|8W?/\xO\r (bYme8ʭ.=ƹuu{$$6\o(.N㻹RH9Mʦ9gmۭ"/Ld4^U:s+Y"UԷ,hՈQe1fX[ȭuve1ͦ[*&1 nsef^?;Qn,cY~@vY|3cr%s1"g,۞lG1#~ ZϸX"ҟ.kpQCNT`_qF̎.vUm}HhPbB G39DU`9Ÿ]6 "ɏ/GެI bu 9c{I4,g*$ mw؊Ip7gkL 3ztCCpuBcys>*@jp{ @ߥ:JkD>b HEǭgϚH?@p3- ܡ07'4nBќ&U4֍{֥~TeޘA s7VXZneqzTw9|aCU۴Җ]>7aR=ۦHK,8YS! Xiڶ2s=\1mЫl2<Уׯht=z{?Q H&*#Ñ> c+ OH\TMɚduMr+ˆu.MŮ1%SMk|&wO!!0!{< |O d4oLyqŧ4=Z{hDDgvrAPYM2&ȑs&RT>fUI?lD悾<(xOq#M CU{O2=[("CT>2JCJ <|IBLҨ8{vT qopۏOP4*A"9XcTg,ITmr I1Q y4eF*Hyt'N\G&-DF:Ԣu)jEAؙ#SL) "^i;(N<2k4VfS8溞I(PPau8 .Oh FQ{x6ET(q980`+{%8-PBDMf8Ӧ3QiRDP_s5T sQM/#zTHT"?տ@^g*|SvttʨwL!$rr5C!hNob]O|'>l3h{˧h!mry6{N/UA;62BroO i̞8mۼͲYmRma~eJo<ﱈrBN'/NA4/ӻg"цJqr ߩ}d@IDW7܎X;cM i|\0oGjM!?D2ᣎ{$8@{+i$R?T<ǗZ8b;6p4p¯{c`RO7ToYcR8aݻl~Bo?< r'S(ۏZ(R4]-*{Y{0N/^ #Ύc狴k,app˗c {ޤa,tÑ+Cn#0pidv9mxmẮ*es跺lT%3]: s㺺ag73Ѫ }74]v-s9A{<s`n]3L S$L[ۉy]Cӆ Z!yQ͢މT|P$:9f#sdXd!(L{ۮ߭ڜ M"sc[ᵆi'F*=x״9`dGA7zC2.Od!m,vU,)Mc`6o T4Gs՚VA وqc*u|֒Ut_O#gOGˉ|38zbY<ܔ JMop މBTIcbDn>WbGG?lӈ{F5N8+xmYRa7ž~ endstream endobj 5888 0 obj << /Length 3118 /Filter /FlateDecode >> stream xڵZ[sܶ~ׯا $$k8 ŅlFQ3=7^Em`988XB-^}>{X.BeGAcbYga|ہ)ţ_%u.WNY/OvHvr}*(#[bs/(w wms/yDCe;>v}xq0T8жj5vm˕VJYWZjJ (DFz-?.=e)+J<+h7`%=Z~^WR+TrJ;Sn EV524 d*a(<43G23akbd6J94h"R4I܎~Nw] І@WV}@q= {[Sp/a"#81__Pa3ӇKF܌)v*eDEc!9;[%|s069*i#7uȪ~:o5Ģ+uQ[4 P߆rV}@!rm wk 3 N@<myˋПZGt lu<UFDZ*ɯQp_HRIc^Af2 @r`8(g6,:UR 8s(H\iC:>B{` =#NJdYԅ!B(8|-K6QEzTw7Sl$p ڵA)J]V$71( zصxDh7ұ59̙ &Eh&y.y/F%Xɰ N8g?VޅD=؅L{J,Tķq.rhe02(=Aap=߁JZ|wUaKa^CAPΞPc"rCIbs q|>20t(\a/2.8LojίQl62VFMю~yO)"}ʷEssS'7Eyj4dq[*}*%|<lݜ۟+%||)5]`;a#nr{e S%wK.H2xeqQڻp9=d- ЛE@ܗ.jwq)foY endstream endobj 5776 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 3323 /Filter /FlateDecode >> stream x[m8>"ᄌ]VbaCE {oę-;z_OͻhzHhc\]ѧv>Q&v z*.rR,O|wĤ BHr]G!3HQd\JG-O 7YeՁ{Q)u΋Gs"Hv.7$HfS⎽U-I:V%qڛ:qn;qan:0˝R$!CŲFHt2T * 9dN*.P&,.VY'w!|A)IhHy~WA]tG0,wy)v@-z/A`5 `f]buĥef%2ٌW@Uf,%RrHw80`ث%Y{a"tlHT Ȓ:U#fa+nnfoyIF$rV#֧' -LTU+EX9*y6IbMK='@8gVwuiۢ;t<&4.!"FC%DҕgQv"cv^nule3_xqX7O-}S/V{כ&c ~mDݝ;qՓnu>7'uqbP%` a ng O5))~'gĽ:-ĨYa_7d"q'J+(YJ4ؗї%Ggs&bi3Md?r}1y^Z6ky|S6~Eߖ VW;!~xyqs-7WuGn9/y6:t`5.TBNޤ5 6OA>^o6/k -7g :o"FaBpR FPG[%ǛLDNXl猅θsp0OyR0N|K_7"Dy^oZwOx/w(c\|Gáhc؎th2݃KEؘEy˛yfr5AvW(^ D튴 X=\ +&[=[=ngoƣr^V^\+}^Mf[9Wl5>{؁!cM  (+owBM&&p MsjSӜ497͹iMsnsӜ-v9:,3A'Ϙ^'caR@5rwfoרGG%lzу/Ee;ؓ GHgS?I$4gT lb6~NHeLȈn.m ݻ|$JKcʵzi{=~*D0Hu}1auzvmXE2NS?HS4|t ٕq|.\YOȒ=%jpB]0==xmc  BaՓa#KEm/RfWmENmEN%wD dCCznŠޝ`طc=l0t;Ǔ~ W(Q9eւXV q2J?[?*F ^!3ӣsh k%Lg<ɂ-M` Z.b1vs^#=yØFA֜seX>߄VY删x@Aȋm Fu>P0(I!-_/Z۶CO~3 ^`IO=WߗdFyxyR1[T?60`RwTIH&E5ev*Re;DŽ}z1 DaA854w3!oö́1!itGݑFwitG;: Lim13-GBEr@q./ .jC%`b?yڎ0\Ɍk揬K-7$,!Nb\ޙ1ɎY죭4 w"Yђ+b<2/5k!+Kn#.X5.; -Cƺgٝ-7Cu{R>OF^#Cnoǧn|ۣ -PBaŰVZ~b4Ǧ96ͱiMslc܊S+L E㥏";x$g5zpf! Sei8;G\בF <#wpi \`asdT& g+J$\#k)S)q A[$ZP7pƧ^߫|0ۨĒ@H_6| egn2k Xz##wf>"2*ZtnΞ-(nS9Pk]K |0)Ñ6&+qI|albs ulLFӀ=h߸}.y^h&sXz? t i-g7'xa[Q˽ endstream endobj 5908 0 obj << /Length 2635 /Filter /FlateDecode >> stream xڵr]_crlMH*AB ʿ{HPE/s(ZXu~ǫ?*NJDu5BGDA`fh<;KjM4)rAo?Oo?~zqM#yIVO'Nu"0ǒ-!Q$"YWǚO#8KBυqa]1' p wW@?G&zYf%WKF\'|xߎog}fYؤo&P5CEa05ӑr|(5Z%u͘rF(' r`^X_ѺI8L9;NY$5GLR{Sv:L2/ "q}1)lTҲg=Ċ걒VȚrWz{l}׷m4ZYҼeX1Vee=$U +z U,7 !^LRc`Ʋ<;jo,I;mEeqN1oU!;!uBi|{A(\ՊqUoX|c]t`YgjE"+5tVk I rs-"ڳ\`?`{n׍FLLzz:;[5 *dkwXe0(tkae^|}im+y]u&F(*Zg 4ndN8k>Xt{Yr>ʷaIi%lB2*N64o:))5 hu92e42!K> pZ PS]g0;A' Wst)SͺXZ1 Ч(]T5`ı9F&%!hMK*(l QVķ^RpڵbXi1 )inGߐxVF%)0BZZ|$?P}%V ixv'(;ېH .o[tme|L#t$UJ(GP.F'h>hcLfҩQ48"Y4C-6c)$ŝ!}(0^7av{7{38Y`*ZFIme2:*k ;.ǚ .OL΄5#pL% +}W.YH ݭ7e4LNN[Jm-z v˪ժ,xiuii#2bIuɤL݀pX &5>ٽVB0S,R-fy$Af2+ӳ'BuL8Ql(pL3Gq7Mx0mnn2kIM;:VEQ!8A]:Qfٌ شZ55:DniVoRQn!"iv5! 0r?x .|X1Lm',g6yLG#+6:J^`;՛&߿brj22Wu&IWPd=ޒqoeLvg8MM?e4_(VjwhQ >.4rS4t3K'1@ Ц ^\pr "5ПE1*b3v9k(;whׇ14 _~jtt8dQTS('LF. mφ`jQMY t΋*iD2b^;'dYۤ8 8@% )5f[Ό%6!_܅q{!Yd?@ TB~av't# rIF"U}]{\cdcۙt<8a|>D5Sn\l @{_ݽǸaKRK8ޗA-Vjű*~pO/uxsÕ#3M794_>G {n޺R}7;D:sɾhl8 !Gh!4d5`k/:D…]g8bk^ 6" 'CatcrB  sL!UGY3N7DׯunRHhV:5ԗ.ZAz \ޗ*_snFYog\UƇj^I '_קW-$>ңn7|x+'f?bˍWk}6e|җ1.~j0~zo(5m{2'˴8>Cn>w쀦~҅Cnx>^0A+G,<_ʝIc̿4ي?;Lzg5(^_jw?$lZU7*r|0¿Cu endstream endobj 5937 0 obj << /Length 2132 /Filter /FlateDecode >> stream xZ[s6~3cxo6Iem]Ynv$qB*I9fB KJۙ;㓳(6|eﺆPc<1Mj? >*קo?DeJ>d8>(l55G>xqr | |0lBmA;5nO~9JBhU6GJ. pI.lnzA|'ReoDon4}kMʿDH=AUE`3*z} ײ'3gcTCJr]+Lףb8χ?:v-˧̣RdShZ|?O-Xcfe-0C-4qpkFcz`$f2p3ܾzԳ29zɲG$eHjƚgr ˨ȏhYj) Lٍ׷P#VL\3V x.9$T{?gl$2RÒ*3>%c!pu'˹Qu dvPY&~ŝA6I+Xbd6**+4Waf?_]Gh]`KyVv<ʪXUwXB`SE>+aS಻,u=(Ʒ5}ʓ.1v%tKᢣL;ӌˏQLیED?(Q1+E@2jȧc$".,2iu+x,zTZYX{Unlޘuˍ]6 bø3q-PG44@ޒɔX-'2l=*} "6Df U/VlBh-_j( ț:Rsz>uom!AP/dlVͥT>EY"b!!c-99$}֡w".nͫLf&c;.q7?ُ:_.Dks܊[zqeVe@Ma'] l( ^dK~QJ {Զqwm4ﰹW#p/6<exMɱ>ꁋΡZ䠐oCo;"!M;! \BE [G_ɰ.Vij]AjshK>)6+ѱJ<m!?;#Zo* .ۻ`x{lkL oGp8]ѷMC􀗡)eŌSho {S#dPCA/HG&C2AVjJ^5qXKeY=tcq=pFZ HM|TT5ӪNc$n}sChyRCyYX .u3֚/}BrQO4T-O[8xśjx /Fw7O>5div-!b Mt/qRoUښ[a2wmyĈW]Q]0fһ:EٌIDqfkl2x^]^'9,i<ҪdűРY ͐I/G Gn/:dI9_cڐڈ*i zR[iTQɆjb^Hjo{Lf8~)A|e5Y5g endstream endobj 5965 0 obj << /Length 2538 /Filter /FlateDecode >> stream xZsܶbG"xxQ$Gvu(. jQs-HZVSx:L?w{6iӝ.wOtm䂙mph3Ӂ Gzlk2w%?_^[O ~j'P/q ˄X&7?_kR´q]_\h~yciQ MGh s9'D(qʮp-ŋ4ɉ$G8^y8毼:¾$ ?&Iο^ 3i:8?]s2u>E(;8y?s @`S6~BfŅT-QGKgd7)Mk\0n 3DRupץ] czGI8zjBb*igy'P[]UDR3pPY&g` &u/:NÞy.mc(2$>/;~ÄƮy*^Pu2o?Wgfŕ.cNp4Og6&tPXy1^eQe;-e6Gs#O 8<@~T$5Fx,R%QVկ1ONs6~N-Np7Ïx3/wK/,>JSt=4}Zy &OO(~M+b'{! RbU3(K}=AHPi7qLCtF\b)x&@!&%죸5z:ss[ye0B(nQ̦["+%$?'8h2},+2k6uǴPH:,oZ Oؔ|i%l^wf@ ?"Lj@uRHY7߅3Ys|EYUWi]_~ps $~dl||}jNK3gV=wh!3{58}0[av0zT"oT1{%5 p*c7f$: [hI;}ߦi`1xl"⸭٭Xڋ%^f#fӂCIKeA~K!OU>Ml.\6g \؃M^@Z)jJg(AYt8#EV{e?PBLۙ+[|-Vp poY| bM[⭆*7{$&yݓ j ǝuַ=Qd?K4`S7`K~.{Ctg6&L3 Kn 88@Di}7rd Yޕ-h {wg!^Zv Dk%ǾQ.>5!pMC<MQq9^}9ƴ@Sƨ崮+5Yya%NkBes},_]eYoPᒓkB]3mjd`!!/OޝN0)ER4?l o@hQx `N5`UdmÍ jPV~FABGY! ? [)Y$M1m]}`{&5`Pg d5qf*+vb^= B G}m"-jCbhR.dcEQaMS/M7vBvYv9!Ɏ41"a  m0Xl ٶm< UB)w%M,'Tyh+6uiΖulʷT7PLmE ;)[:՝!%u`SDSm%RTZ%D8 tD6o8cT+nYos0A@P~t/6)+Ըa#A@聫 `}zMw JhxZ3&}^f%&LFr)}'YƃINʴqZF)zP,=)z @ sW x x!iqBRU 9ÄZ]gߵ:IM432Xhs^cGަJqIERHvXgB@[-z{R Em3~݌I|**\zKI ѯD8#|*.G.HK"qد3#?=VԼ-b Xڠ>U ث#SwRn,`@XF$6Ls]-6Ǹ˳TmJǷM RbD8ָ|yF @@7S8i/϶~KqFE|O 6L mv24;M)Rm endstream endobj 5985 0 obj << /Length 1886 /Filter /FlateDecode >> stream xXYoF~ׯ ڦh˛:HvZi PJ&L*8)ޙ]$Jr73̊[+[Gףs[!|߱VYVz9ɫ,' 8IULvM&+6:>0[b[vd=z[ ř֝\a8F?x[HX>'D Àܱ_0nTv:.WZˋ|O26^N}L֍"<[S%l.rfZ/u۾2ñX@UZT4 Efc?jچbSv.`a ݊v[Tp <$LlG1F MCUrxRIkr;R{HHIS˞j>&uh,]l~MSuZqFRVUє =|GhOm*Ԍ:.7 U|CHc xXB'f.Գ)MQ Uu%7j..W(]=cxh91 .:5y)Wi5N!9A;:X,pN|.RWggϞ>=GjsF!MB Y,Ve>ɟ|.?޺@~H4fCI}bƿuIxcȲǸ#o),|Qx+^w^rV/qJU/dY> 3t|rr~}vIeUsZkx,pisv'};<{F)̇('O}"x.qx&BO/{s'Ggo&+`RM >;/*ZHWI!?5kh]LOS5һۉ ƹ)Y]ةP\5s`ڽ/ޞ` 6 94>}Dҏ.XyvؓA|1uBDH X(G;gY+!a^f41~VET6I(mB+P㻉1]`5T_,sG{N@Ot-.}w#halr}-C-)2[zF(6'2Qj 6.LT;=rrq6ِJ_^3Ef72v5M|~b:MYL ,RxH\_“3tSNO2J mºMǝk-JX'%fP,!9 ,i @ww$Zc&}Gjvjd2Ώ2a;-̠3`/md^R`Oqu43;JT{@: z?}Aa~i}K=l avd"$Z5%6]3Qn\rv:o~- ۼ#UАdNB8_4>sַNCi"nƟ¶\Âa `^ݤuN] \ {TzZxR-|w8Z OxO]Usj/`@HLm~@ B]d|_|!sY.ܣ+/:--G#!{l;&7]np=0ܼ(ncqR \+{0\C endstream endobj 6003 0 obj << /Length 1879 /Filter /FlateDecode >> stream xڽXo6޿B0@^cFm7 b h AX,"(䑖dɩ=>ؤ;:֍X/9Eė]ټx0p8bi "!>_Nٜf?QDAIı澏H?gw3i]Oכ z҂K"wlDZ_&%/I2\ӊ+/ОAs^紤r>'؊PfL"a=bәA[S֣D1^peQ#Ŷz )|fZD5Lf@o*ΩrWdzNLhZ1BYt}:w/£كKj1bPA篋*+[ay xSTh#$~pHRVQl<.#ALɲ#{)";":F|Jȷv {(J1@\׬LF(> HP|bME/98bS268?&j̭3FD4` Y,8H4@Al:QQd_Ǐꃫ\1<9v#th`QCpR؈x(phj2N|\$R_Z*.${j^IG#YF9N6l{*E!>HzC^ |W|^cReϩ(rBGF,xnx7ru[j_o9εHA40 3޴ٿ'2n$(ap[S"މ'2L؎]eVا)MʵqnLv R2QF(ºV4oK%6!D6szi>qt:=uU~"{HDT} !EĈ,Ҙ?2k6+\,?6MHYANՏJ1WMUgi̒ H"vʴ.LmM3.; eҹ)NLICgSd]iJ5=F kM2NG^on 6oD\T,O# 4vbvMz]/k!WZx ܾȏ1u ۺ˶ԺIEܸbX(jk7tz_x68l$QϱY^K3tzW(gojy;BYJ FNULBVr-a ZVu[jjL3*Jq1Aw AW*k9YADHĚG݁ DٻaLN^S/R?(2"y=*IV&n43-n -ld 8a[' OH~ a^y Sp}A;ojFusK"?1JLstSv;wx:rc6O2*j 8DX@ۦR|[J2Xڧ4(gN{騔蹰2+[Epb?_ a^, Y^/ endstream endobj 5895 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 3624 /Filter /FlateDecode >> stream x[o7?}iX"  8qrk`kl  QF$߫qbX0dNO!ER l DqPHC Z4"?0`b3x`5XNa}n oZbh p2cb 1!.̌[9Ci_Y #tn6A2ƚm49P/Z2pV0:hk+ё=ç!bjٮ3cVX|{tU֐R@+cqodPylm̮ti.ƒ4d\jQb xul `au xP h򺜘@׫XgnI)lK!ޫM Fl?^ek&FI>&y cZ.imuaQ&0p^gp1'r?If P 1f%Zq:™ 6e!" `d6wggUΟwg_vnu?8[Z?ջ[ C#Ge}φ>ο7ׯ_v^힗EvgI}8kMUh L18krxs#?𼛋oי2LbDnԶd ptGoy1|px_\~)!\aS7U<­.[fyTG$΋]YJmke'8NZe('|LZ QĚI#)gI ^Z)5=Bbs\([Vs69J 6TL듟&7OtU6!u&^N4ST@buZ5 t'/:$Tsk*K&p -er-E:v;֏ysv3Bk %rx]Q8p.\TWKYRVt)+]ʆ.eCПzϡ#u[jcyY !;>%e I!?"F`Qfxv?mh\`6gyDR o^,;f5k?Up09W~m#9< !)fξѮ hpmZ QsIADʔ\n92z+vp4r(e 16 E9OmY*i AjN,Z< p(U]PgĺP&o,oGo57^R+(#` s ;@t FRz•H4z;|#Uv`1aabywY.UFە3Õkk|g($XJnbh)$v}ƂD&JEUbq.&eCǠ ?Nl47pHBpEǰq'P %,bG؉Bג&c4xد=S+y$L:O9HS,@-Ip텄~0S|iԷCm_E ;<{QRĒ KBMZ0߅46o/9;<=^ 5Tk^@RNFaES lr5V_+^^ш{!#E/R/avH}]אty?q6#;#,<%-_`$T}|eY V^Oa2$ \>oMGAgtߋ>Ϋe^”d9 P5TT{rinH Z$&_RP$ixEݬlQ¼6,i{)K'n-N-։ꦐ܂[DkZq_$َo!$5}c"-){n4FuemU $ HbG+m1{N٘"~?A|۾؃^] /r_&x;L,Glys?Z{z7N{N'>u=rgl3)`Zsܹ`\0w.;ySwV{="x\?h~8/WOK/>Dw(v2;T: {)+H~q̲ endstream endobj 6040 0 obj << /Length 2238 /Filter /FlateDecode >> stream xZ[s۶~#uF3ۤ3LҎ 5EDI߻(d)u;y vdǺwW'~8\jf cn]Mw&_dA_>5{1p~?ND/>$e.kqwGgw;d9̍#kV.,w0έ'8}fcn,H13VpnU'g(.|u|ybS&uN[\O,xL_Ps|G,tC,NꪬdMa /cQa3^!g'd9#T7:vQVtoǧO4 bE4[≆P L]c<[&<-M_4D(IiX/2򬹧wSrYVVٴloX`G[_O5=5ZElh[B o!g\&G|6בp uSiC.[Ne.1z|lghWsYɱ'.._՛apשb:MkA_=S!ǃlgm2CCoFdq.ߎ؟C /5W 8nAhHu-&KrN-.G#!Ç(6=ZHyVCW,ulCNVϢ63SƨfOX#wMI4*o#!$YU.@h1l^KWY3/ۆ^j¡tPtc/J#@h+y>98'.6XnUl`=.✟O89 ;\j;*iX ;nt.m.+Z#ԠZ-o֟g*H*ԗ|Q \ҹj;k׍CEhנ\9ЖKijb ڋ98^z\_TF348ݱXJi]TRUf*.LB?,;,  k ]@^KߔhnHЙL=hΝP#̑ h OY ~P$+>E5=sJgeE#tUz1U]~ B y,D!ciÀߙD. U !V:*~ݑx enX˹X_CS|ԍ\e p1qspǀpp?J弁 Io)(/ hː sU9&}ß _A&*ḭQo;}^b*4`W'c}8֊GFmݻgk2m{!"@̓xYNIlfdwYQ'v \RsW%J.& &|PswH>hA>C`ueK|dpd0Uñ9.ò6`OYkz)CiUg~?Θ6F :^bc>izz=}w-2&Zz>!:@b jKGhBsͼK $A k|"r# {avN+FJrFnUvrۭǺ׼~/.GHշ?@b o(EE>0珋n@05+tCx?]UnBbA#hᤕ^uLCIn;^赐_4eME )u;\ Ph;5i gFz7ֆihkx;]:戍HLjΛ#,w` ǽ9ZU+oLl>7=sw(RE`!,ጞwVϿ>~b.ia`^®2͒'Ne70G ¾vk'dزAl)tZe>a!oI{zf&bfV`ކY"ı =ѳc,WsrJǬ(1۷w_% ~8יs\&Iu^?&DGvKU܃>x(b ;aɷ endstream endobj 6084 0 obj << /Length 2157 /Filter /FlateDecode >> stream xڽZmFGYw\m>ǮJʷsqX$^K_L&-Z;"0Lw?4kM^:;kY:"Չ84CU],bVsOyvgYm>7`]78߯he5AXXѳ?( m${ K vgu-ko4KO3web_,Ѯs5Sm8a=DKTs5=nG75סDM %녣3TXk s(Aj:s -(1 ;ëC'gXP xPã? YGq >y% &KPu;j Â\y7pp\~;O8-Y/$.5:)50edazC43N(ްUy4 %mͳJOÄ{FadGs?sVVy: ֿ\._~rw=\zh ~ =*s(E[ v Pΰ>a* "h!v#c4pJѻgOAI0'Ҡ}Dt(a m%Sb59~Uy+z黎B_ige7↥,'<" 7U,UA+nw*cc4Piƃ&KzίYɞUŰ.+J~Dg9l#ǹa|"GmV%W&}CN |xoc"زJRi7]$8ku@;91#h,g\Cr<62^]p$dIYC,Ê掍Ȩii5$hQFbk)".іI=]A|jU9$r0YPfD?[ P ftb")<Ӫy&9H(=\K- (xpAEg%1euwJjZ9K%VQ8M-9=H&p}g|x. yfUqD9)9y wXnk8d2x/(Unp&'z8!K\BQsV,?T(4N#yâ,gEDb`B6jU 45suŝfGgP3RQg<Ӛv - vxYvNXղElT,"Gʑۄ<{z4. P)B9^/pӡ=)ub3K]b{vs -)zy ZP My>CU0+9msv+U-kƸ]Vؤ\ő./ ND$?$0W:fMlȠ1-?X?Yփ'4Ӫ{h1_߻]½cR( M0%Y6Z{M j/[%a 2 9_ߩkǗ0KDŽ:InsvFEG5VՔGUm\NE\Adz)hvkXr>Su*X=zQGrRSrX;>UȒrUiynuy \ uii퓈/AhА~ vB#kn9-l﷣ :sv,RJ u`}.(QДY'$*Vfƴ #i59  f(|[(7Gb2 u[#g狹*bqdƑBC;?J2_.[sw_p@-uZSHuq"9eN:bFQkȏ &u4=~S Lm"xTuvf>f*AW[?'kM55&|R)QQ={U qU.S>_?q:V#&^pxὬƴgtj#JR멁DZ~iÏ&N+ !  endstream endobj 6131 0 obj << /Length 2352 /Filter /FlateDecode >> stream xZmo6_!¾ JJnH7b7Mne:E|\!([Q#r8g8-j8;xkS+ !5[>%ڄ3k<~l9ٰNQgC >m:X̆#_*\w:b Zrfg' [5siC<ׁqj]GMaCfqN e% 9#w*zf(00ۃ=j)|1/nD1T/C-s] c^+")~3;-(VmEK²#c`^D=GaTU^E) ]%KqCteٳKC V|"U'bPt 2#PmwoK⋈ЫzJ^sJw%E]WIvLShklJr@!'~[y|#˙  0Q`y/2b5dȐ6MZ-հPd@6m(,^BMl_Baǣkqg @ M@_(5 @-a C+YKQ|hq,lW e"DU95(#'[6b!@ :2*a>LV8zJJR-M]t$zVnL+ʻlet*;o2KD!J/ʛR9EmY簣IUel.6 60mZE\?> dQ @bHNQ6KŤ/~<)q2.2>0-(u\=ZFp̓t ,ĉ aNv&f2_gq^w4y: gHQiNx3z! "lgU==܉7 5@1H92)KBd~А$-`Hԣp9]A}kQM`"iH^6ɠQo(;7T dagT\ED-BT` %80rq)QY넯lp"JOEFh0_@tyoK&NlЦKȦ&v:;8\KFF}Jgj"s^NNHlIY2Ñvm&F갗uUϩpdvK&d31zldSՑGcnmd>I\}j@wXG,2+tݱV'ɍ Wkm~h8eD'=Eq-1ݳDa+?w|Ν/wWK'<*MԽ^J@N 47NZ BEm/^4*xҼ.iEc@}P8ۄ0C:vS9e:IMNYilJe$"nEj.Tp ڭ,8v"u4g]Ѻ>Xp m'3cuJ9lA$JׁZ:gxFXwzrQ. ]fQ~I<ٛw2 B5_}},HqΙHF&F,(M2C0xӐzv^z !fz[ MQZ浐%6BRky)tJzTF z&V:vy29 oS5?r^u`q͂e 3^}Ҟشڗ1]SvǴ`R,&Uo.&gߟ; `M Fka)*.Uאy3ڙQY3Û_ԑ>}{y:V|Np"'N/E( yzi_ݭB]rdYWɂ1ei)=z^t6rv"h֗d3ȗ> stream x\ko7_wX/>`L fvC`?(H$c<~Ok;WmG no,V)Rx"MA2`C BRل4]Q^*1 :%8É@% CQ(FD A-i{ o*$M%8rI@ C.. KqM 1:L^vT 0(o8U۞Q`4:7 aC[4X$GyT6-c]W( I  |mx6%y/ņD[L4$sAiHiC h)7! ]6hCmȉ]ü3Jw57|Z% C=2̛#H a1qGf0"{_B&Wo  эm "$y 1@O#FhShiCA!aֈuň08c 5 a #amZ7I٬25%vSE&M֋4nv$Wdt#OLFk&m`abA@3 m t-Kh C |x1 "4ПI, ,oNN_:~{yyu{rv?zY ppO}89:?0&,]aǜdD{\$ };|ppWÿ__{{vξZ7->].gg7gI֩UZM5뜦A_?642&?cf)d5J֦YMM#~1ָQ}%V%̿Egg|zy{v~^M-c1'MK4Yhn2UK5d%ej&+u q[$=<u.#q%KYtƖ9sC)89I(t|ю' C=|_#Qonͷ7[<o\xp@ZF#U׫뛳WoۋW"Yuհ !r1T-c ;09!t౒,b]Z,R5լ-*iXu]kejmҬHjCw2O<ʘ:y.߽y|9htA/[cDF{!QAAY 6ck{ 'Q}O1+lc8}vx>9o<۴U\כLq{uz?lhFL`sJ7[A[:l^.H օ؅ԅ܅r/p]3w5s]3w5s]t5K,]t5K,w_ hLPVS|Hciŷgg|squ)є(0g8K ˜؜9Ss7B0%\Vq80߽#޻40*<0cw*aRҨgYyB+_D sq[aýآP-2Umq5RxǡwZG~~B޹ =+R\3cp`':*2RR2iu]- @SXÍ~ -ms#S,\i6i <%26 Zi3׍ת5ĶJ˨ J[(0w*QXغwD C^\qIM**Ҋ|j#jy}QGx_]]s0RedE(Yk&.9ɱ#M$Mߺ`u,rRXdHYBlFК͹405KsI};~n;<|ֹd0%",!&DgATn;?˨UifKuٖ*U"Ahs8x96nWMwVe;GY]z\(ٯ*NKmGi:=~91:!eB#"H_ercob5+R┓&KWiC~+3}Ezy`01E酱c'~'}۱NwA]...tkbԯQ&FkbԯQ&F_{'1Y}QI՚QSBu1Zɠ庆7'Cq~,%?6gJB,t.R[j@0ۋۋ_pe+\$:6OmNc"d3 !V˲l&a޷v~^Ag2XՕb(5ZHpmQ9 8;ְJiH &?Q^qEJP?@M#{,4'ZҢuEw2bؒ<%, =Vi3B iLV~VJ endstream endobj 6164 0 obj << /Length 2525 /Filter /FlateDecode >> stream xڽYYsF~ׯSB1nRz]NJQ@pH!Z$(^>H3ϯ{5LOMc.BwL1}#m[bmN\Mgv0֤uO%}'rjyC5[j#jcū_ Ւv835j A b.K_q-a05Y2UAs8˭q ӘٰP/qɾ,06pĚOmoәNQ,7SǜD1^Οi0kղ,7Ip0trcd5j"iGuR|xEZՒfL %!WJmX=p Od8Hn0$mCdmGm[)L0 eEs"G,d!xo Jx@X}Bw(MU2یZ%CE\5]>+ˣ 0RL| B]9¸>8 sA#<.)G'IE; +j<ޕE.w]6A9^*39s8Y?QDbJ)3U^NDH6iRn+e rjs\:"Ne'2n]ywzHVZfQGF  3Q5]MMLF\뭵wyWӹݱ ;TgW3>j|FQL}S$Ջv-V+TqG?X%|\a-Ô2;T^R0/rCNMo~? RK]b3Q5{1v_Hs<i7E9d͗ߩy{u3ϞiuX@w<Ґme$&w*P?JMT1琥+*$JZtwjVٗI7{9UH#4tA8(J:%wOHVC* T_,}}P Gpa /8S|>0}>"%iL:y&]<'3J ^j6&cpGaW*(oLы rmQ4RXpf!Fxr<(\=LߵPKvĨ߁= R m<Zgo :-( "Ai>(3 킾I. W4=e r=3 c2fj@%0e>~[:e\$37MWc'2^RN@; [1O.]'ūdL.+F7̒$ % (jQв(%oW;nRP"|N%$:QX1hUdGq}'p쬛2t0*8A݅zTc:o%sAR\ɇ{4e$D$ob(}Dg(;vrcdf_ɺ"+muoD/uŨFęa6K5럳}a=2y-sYvIDߕOV> stream xڵZsi:bkAXtl8|dؕtT+h:}o$ o{œfɷ'/-s ϳg׷34ϛ :rj[߮ٞgxDxeyl g\\sA`3_~3g1~f"ml渶:6?NL"VShK"fK S_ain6͊WlYF3ģ=܋w_ZbvUs1;ú(w=X%4%,+,FB+_D ݴUXϤ({X-&#>g=m9xӨjV&-~p^ ㍪nնer1Qگ(8Dūˋ7~=˼Z?@ וnU!Uբdcv[~ܖ垒r]&xd͗x}XFq[^!Ѫ2"簪ZE^*%V#en*Eؖ5!D봠`Xrhˁ Q-݇BS!m@eny" õmV]`߰}Kpgh֞U\1c$G:m,pxW=9oi>0$nY>ž)nY" !bI%d`.n }I*._A“9Bgۖa[~SA&d3W@ 98SmE[rvF[*ṕsV[W7V#G-BX(PAB4CM5Bs ԡc~3"9׻hw۞ ,mʊ+8 <9BD ԃ1'eg;{5j?ͷϯ/FIR1b1 idVMK+=t(b;=0[nAl 0(hG}B$32B*e k!ѼnEgeNHW^RC$%1vZwS**PGr)#˱'g< %csKŽɍG!)JI0$ `ދJ@a"rj riP <9㜃%W!j1SsMWC.jH^<KxtY8lL\O*zL2?WlM@U$SD`&xt."D_A,ӋĤ :MX w ׷k,|DmE*&'%m(hިAtqIKd3+`;RLr\ڌl Ddc\R3h薫)esڐD%l*CA")HM}O'}'" rs5<UBpR綬+v =Lcز)3 $~~ ^" 5 B-;f #]v endstream endobj 6241 0 obj << /Length 4378 /Filter /FlateDecode >> stream xڕko6~9` ĊD-m4E^g8iahW.Zi~͋\',5I__e^$a^$4W^u%W*w{ݞt_mo ^'}2z;U+Mgq8<_w^".'˼LE_W3aVQzqB^^Ÿm1pl1 <_0M\U >⤻v ZwU؟lv^_CknjQ7]'ڦʭmd|=<^`҈xCCw}d}ECF,d:թ(NJ848(N殡²GJz⿿z):]2Q :.-[7kvwsۡ珡cG^և)UUh]4:E|");]?p?e=jR֎N# {q߿}"Bєt]>E.Zw}r+_m? ͖27@S ڞ~T ̅ V%A3 E3i6sлC=#Ǧ顴X>s4Q3AZ4N=?D)X~7Kk(έc[5`Iře&}_m|2R&Xcb >1C=vmi"πqd7[X*yPa`׷wo~˟)!qߝBj~ܻ7Aa>u! 6%H|{4**զ%ف9&YT=Defڙ!D :Z Tq*J ā&`w,N z@1..j 2OfT%+dm4xae~"`rqj)a#sf3i̛_L|ħ}U[V j T)&Ȁ6`coGyfqB|6&5ZǮفQh׶%@֗& (WY)z׊V3R $"iZN`NYO-pغ >/33#*Iㄍ`x;ȳD=õ'"pvfʴZJX\>2l)Ba1uWʽ!-qz% M dA|HKDRO4IĤ, Τ8bRIV䫍lE:6q8h4놃^䊰 g\Z@B2/aCW3K9tF| 6{`LFcSzgG+j>@6fIFkμQY'PďnD$ Ҹo^p^{.rk'U>YѲ6u ? w2tk06B/>! N<M[+zY,O[wdE<Y|ei ЊSt.PRRD/ c;Q2_H|7qծP|% /^JH4>`$\`HҩIi'Cu=G0F _zNamO)?N.RDQ]-RFm`:ӽh| ϘԖ P=JtUچ@f8&>I[WE!0KM\^ZgR^<1I"\Cв>W" hu O8aeFŶأJ3XE1ɷfUM!%L\PSrhұS,y,W8x0n=vfkvbTLiv `+H9kvlfÌ$Ptuҹ72`tJh~dVBc4;JiBEz .b>)2-^(B]R>O vѵ*^_S y+M d2kmy&LBN!b|.I/$(DՃi#7$o/gɎ?2|Lh-L@wK&$CFx:_Xm.)GCk^Őmt.>tyX@cjN]07nƣ\@.eMia@IsB@Yז>K9!`,;Wy)8_ZDS1'.Y`p̅DC,K<|6'Z YU46~{AS*By^:\\zi)Ԑ [w R%6q|#|ay vMb&\+j\l.2ͮcJ2 oT̬̓S F#JmaYb4jUjJؐA+"&,͇+"l(hӟc2AA5Nr_qK=ȀOƘ؇1}\w6A2bM&Si#>2Bu<A"2OdTq>3bv ˋ(@I99Ih}]wI%-00{^tA%?y`Է#lmiu,0 ^]<9W ,K=P!0 ̹oy~7J(z~Ne_ߨV lH&R :rJQA|$NpK'0bƎj}(.^{]KǼ6)X[q]p0Y=Y DžzhGITXBcZtfNp-JBd$2RS?c [ɯw/N Ћ;T080ua8.Le⹉3}b=CxƜJbAv'kmf=>>/p'痜D%s}a dz^/::!}8vOfAyE-~'" MSE7fsQ fi8!NVo D`݆0ik[ݾk/}JD }q61C2/m-hynmN t\(wO8-# >Nwk|s%N}hKl+1xrnAI NRs4*!_o?7W!bij.䃣Jh5rDe{dq}Q` >aR:u~K{$GEbU[3ƞ2AtEF}ܳѽx\^^hMLPy}*Q7  %?~s+Zr@l_ ;6[OTUueJ3 endstream endobj 6139 0 obj << /Type /ObjStm /N 100 /First 1034 /Length 4011 /Filter /FlateDecode >> stream x\mo7_PdU p 3bo- kkYze' Qː2CVŪ! sqr)i!MC̢#D<9vKI&mВ\JAV)NdcRcH|7 4Q*Y%Z*xDihC^Ja3إ[IPZ>͓x-{;I\Tƒ4y]H ص!fEpqe`0(BeZ]XW -2p!ZaFu6 ӄ _<;;Oc:{~uyv,]^ٗ>dzoξ={[}?C &8yu2#@` %=b:{=|?znշrSv?r1ލE3V`0ҽT+JS6?=ÿ˞d#XSeUo.o.W`:(UcbSΒkI9Dw٭pUp&;}ߗžOW};/~ݼ)?v7x95U^( K0'R+ѷogyCYa;M$\f;Ej\\l >'XoB>Q| 6zkY)y9-gX |B'"[DOh"(>%ٕf^=<Y&!!2A G2[ }hCC'O'݅>4÷g_s =ؕ]T^8tTcv*#k/T̯ʯʯʯ***\*,-ĵvNZI+KK+KKkim9-c˺w|v.] 浯~+Zg+NiۓWGF . Hυ]5&s=жGl;{;XzK\]C7A$eޚDacr$U1ʺ yw̶y-1Ɇ#}~##vd[˙@IJn9q@A[ O@2,"^jgBA a%vj 2(m]idoKm#Ę{eo閼th=@50E7Y>y4?W n`\9|"!I \l2l?ڄsGj5KYwlm6^ћyØ#k,P*CǵAdDqhM 41_4ΝxJ WSyԹ8Wr/ɋ1ZH[b:A|eFXPEPx)e2a)P>_D"D|A'gkͮp- @S૲^1[KnêvA L3ųI$YW mo֖i/!d|UГ7b\Aj)(aqJa{͂wFے^`ʈ堬gt3_""A_"z3Нwa|x\|, I7E`|fy9dBHDybo$W~hb5_^^}8/|u?+)חwϟ?v/??j4-6=(`\V/aKt,wq/Nx5 t]%=Y/x,OBF43:?Gk:XGo^`_[*BMՍ&xv MPЬK"QW۠ E2 '8 þiǐmnI_ҡ;Ca[Mn n--Y߬_7~-}]]]2-2-2-0_>FڀGqz L+G@Iv!D4J s k ! jjnej{1m1Ք,DLL7.#]imZn>isr,.UFf,lu$(ur%x)ⓤM87ټ^}X># d\}TizC+BTbL@[=_`O;ing)4;w`%sry͓),iEOzJy/gkbr}AqSؾQԮ,{U_gApt)O-t3'kã'zFOpܢ811 u(Ju{3˫W[z:8E=1%<Dp`{2UdC AF̑HrCӽGI6)5Ӥ')Q`q/f(,{K$X{)Vi&)8J&vXSps;?- rYt /1Ms,m>*t)˖c n4YrWL>Dbk{Ω)պaZ&Z$J`= h-7c=n.[y}ߪ..&(>:@2m%ҚkÑW]뗟Y W. %eip> stream xZs6_ucLo&n:iQ9 5E*vw P$r݋  orWow+fIzbmEЊZϮ?Z^0pa}m:vZfb5Qlnwhp31]ʶgkk?Zغ[< Μ lșm lQ>GA>Vw1)vF{1yɶͦٶEε4]G>-Q:a` "OgcWlZ018Fx{}|UM{L^jUI|)r׺d׈uWS~}%j+|K09, bDS6xg{0)g[|~ߗo^bvq9 $)19!F{4BltV]6K.ϟ)OaUoHm:;У .d7Hx= ŀ?T%f"v6,ZltMJgSs
ҾxUSA,?=#u?e_i~zy| EU d { =֟&+BL.Y[n p\(>d5#2WL(˜&Kt.Y(c)տ@?[0x,\PԻyJ]pZ+0+1TU;zEɋ*>CB$Y"##~MkIɕJHuFnE4[=%8 & =G0<_|&i)¿,ы$$ wtI,iwZTkMPK_բLJWQ'1Jk(E @zWrG7hs?w=]9]d!@k$w|}mQN' O endstream endobj 6325 0 obj << /Length 2751 /Filter /FlateDecode >> stream xZoBrkm|}p'á9N"4P‡'3;|H(Z73K[5{~3ۚ"}gv}D2"<^A871.T&MV.#5ч# Lvۆmwl޾f)yf ' g5fzWGY#Q儨'U)%MHY6)SA$<˞-D[{oY\El 8VqҔUC8gU{P~;V@Վ`c),pxZ޼.7F[[ך7dfﵳȝk!Z J6U[U5-v<[5޻gmĸ(u~&Np ,jǎ'wԺpu9RzBGt-M%p&7EFadzc *+4qcN]_41#e֤ 4- 抌 Qm긶g`0{$) G)IJ79I>+է=8f&(?dMmY y>C֣zO#8PZl47ۊ-}1P:o ƣ3:ð~ dS-љ>ب0 i9`=8/pHId u )J۲HuXw}[Bz,`{rR( x).Mq`Y ۉ{+?PXRHg)ӐqA(9Ӿތܦ5-uUeo*UuC?V#m5t-S8A =0U`z6ˇS!twhXrYDcQ:,F4kʬ=<ި$z5׺R)+bq"ϫj9 J;T eP@o;T{Kc5p<+g}2avl#5GfR8=a3ޖ O܉4P[Q{$"Yt摖]ow 9 qOw'-r\|OJt %_6%=Q54ZUfVb˻mnٸYLtgdqR' W0){ӑ@; أ&NTY䷦4eO$xkk8 #L5kjl?R.2N I@{64| Cr6TdJ '\ qK y{iGl\!ZyBg\lת DzHS""|jף:g$i7m7>+(#QiMC)0tzuCAa1U :̶ vǞ7tе>e$fL+~,[JLLxfS^#)Mk=S3 u9ڮy$x0`kܬywګY:V7N%݋G/sB´V6t+:tH6OgQT+AMMh=3wkQVГT-qKHjP/ 1ޒ4Wԛ Q*8Ϥ5@"&$6 gA-eQ@ꕁ.њ!qQ,U5͠=]p^L, 4u[(\.a7>mm(7=\O&hI!#$`ە.ta zRFmʾ=pԘ͕6Q70u/8*š>pp"HkZ8m'Nw6*J&'z]WDB1WI i]&tӝnnƤ;۱3D%#tWV{eeW>:b&&gvK_b֪YV&-Ziv@{} 2d R|ψ@DD=Pκåǒ6#!X>nFFw&>~sZn멺+[zq3~ /q=Wy("L/`Ae2U:A|JW<|iSsCw{w^x)bWX%sst/0h`ވWUU.o*rL/z +7`aUOq8}9c>q-6ylēW($=6}ﺮKv71M#^l<[)mHI4\?Hyu;.*"޾;*N £Ke\](@p`*׈oܴlr5ΎݯeZ7#zsLdG]8{Nl S[׼:>\rh%:"!2,KAN&! |Dxkq Nd -.'Rt6),Uy> stream xڽZs۸_jF/̵I&饉3LzHbM:~qnwHrMXoW\}[og.| @8ElwWa~/n"}>۳1P"x̬rN"E{i^抙z }U:nBImi#Ͳ~חiWӦHץ^_ͩrr`)}(%bT7L ]()zP^L[Ҋ5v]mAcL>늺םuk/-.5JO!  w5|y4Qy#øP$!s <"viĝ]jUv9ҽo]d~BQRskd":Ġ->z3winz p곋1{[ ]Yΰ5k}7k%gㅁ#l 5:]S+ xdIM*Ox*[ 1~Zӳom +׹>7߭<{_䎓 ;sSt[O@:] lA uuӞp #;8IȍG|Ϧn z}ٿңZuvڵG]DG3ZTnUnYwkT4fvxLU9lG>GWΑKј(0+Ķ_~>>p^Oxy3ȱT~Sxڃ39 czt!͢A聳Ä- DV7.iM qSMD)E|  ^WiI˴왽{zwQ h: hƓ#Ti2ނ_[^҇T8񾥹*oidLM[^c~Yg2MSc$hgT{Pr0(a7_qKxT0ft[#@w㩠*"d>~P+0Cr=`~kTS #T,'M-F9kJ0J.8(dh屰^l`otjyz 6N4{2iq!`geNþt='nJ a!IFjx&g84Ef3ŀGB#FVGb?M$6ve1ҲAtQ r5 t`88/7!@IprmN`'@y$&1|&g/S9R"ۙ@ 4C]O zhC yBAkoimŎyػ|buCtAsi)n*;d3p]U`2&hŸEJoõa5D<v\GB`P~‎sb|tkv4318)Ox<WNuĬeB%(4Xh͹,uY;q3B ;2 H82Q " ;ݾ K@S+ ^~dZ1|C[\4["%6 v#\ :r$iU ghӷmCpinOH@ɡ'z0JI-CSԃ(}ݼy1 3#5#CsKHYq,xǝɄSbR\[Si"48x Q #χԄEXڗIw 0OsD$8G4d$4 tqX>"PXqW-#@%N39SC1e:.L3V3:c 4G~-v>jh\6i;XC}YAurezVȡ7r Eg x_dID1ۖ(&m WܒVv&8};V/^SC0.~sDТ+[]ѻwN]IR> CW:׾B B#JXEPt~q bH_.ѻ}`MIPm6я:(x IcT5^d1QXccn8PeCU^ 1ռy(̍̅6f7%& O*sۿ~UWa)Kj| ~?=vu&PQ@~DW" L O]u0(:=|?39)!UfI~ʄPh2uwMp JŦ598.V};mq1=PJg_Kq o^%L&سiB92ltzh +ƧWf[H%54T?m|RG+ Kves""]輨:SG]~tKxŲuLC*sxN#[Gc/|Zq.o ̖N7#_'9OI.\qfo# Ȼ4q% *h٦kOTˏoW4*0 Q|)b(\W˧6~ N{xnH#}<wޡ?n:}jEGWb/oC endstream endobj 6259 0 obj << /Type /ObjStm /N 100 /First 1029 /Length 3362 /Filter /FlateDecode >> stream x\[o\~ׯ8 n4@@[΅0JoKnx-ǫj,psAtC0Hb2߂gD?hl Ia( ([Qb$9^H Z9Iᇠ~M4`D0( !G#^38,%c4pVSo2H`DB|RqF3a2(4@:(*k &nʶl1%8$ję^U37aigaHAfoxH TA:dگq_Ӑo!Gʐ3GA~(>xS  $3JTÂJ{!C%B^v2W0L 21~ɗX'(5ưFD̍l DCI tI F#!!`BXd ؚ2DeFOjBc&fe1l\لl1r2 Ij)MiピԖ(b6US5V̦q&-b1A&F6[j4bD!lZUb=5LAԆT=:;:&?8_g]~7]`UN ~vu=ΟA7^{EHf=|j%3 ־W^?<}6^mzvsݍY^vvczw=כնg/K#G:-Y @2Da?;H#9:hbRrHsSǜ:19u̩cNssǜ;19w̹c{m)Οv\tvRjW;Kj_L3D9y*3ozf8ˬ)W/ܟ^__{{q..׻OPK2%gFI6لpJĢFgRq V"?w5K)qיEeR}:-cؐB.x`N`"y:u=;? Tܦ`2Йt5Wc6I(vVRpƊ#bW3}Eɷ{וP;cNp¾5CJ֤#b+E 1:>ضVgPueR*8e]WʚnO=jh ]f (o|%/>"$ȉ.lEN~zgDYϒPCs?ջ+"%kRXSiCUvjR2tx'oFwtO0KqG\-1ӽ$K)4FcX_F󺽁6;<=i\BqYS^ hU7J\"bv D p K#^ *Vd7QJ1:JִqyqlT~`&iZ#=i {[t9诺ж]ܛ7{ˡkL:ph& w@:;Ч>)OA3u1SL3u19Жg,SL|23!|,u4j+T뢊$:e:߁$8 b@ _dA ^.^;QGSH?kDT\'L8VFD$ aР +UL0)81_򜋄 SikDsmC$[/=0W['WF6)G}N0NI=e{1O,@ez1t|g39;РŒ| ~;G ̓J(YQϢ9Q=mҭc'8aYۺ{xE|} `,ʦ~hX>AΪ|>*]Y/^ ek{K@4LZי +ρl!2b.*BA{W{IEҔeש_:i@N[geg|*B&orB-{=q>x8p.M_D\56OV(eN^f|Q˖:/ S-u8-[fy`ljpJN*TU@1ȶ˃|"|/{ubCpNϳrro (%mr[gg1ѿ{+8xP=A4y×p"~=Ky&Y+ݎSf:'+NjĖ9Տr$$W; g$nʱ:  qN>:. @<)u endstream endobj 6391 0 obj << /Length 3071 /Filter /FlateDecode >> stream xْ}O),¸9"[+R]d ̒(קAb%Kz.======}jWWkb+ Cou{l+UVno9fFƳi*s~l7n^gi!۫߮@+gVz^0ʶ$^Z0Y=Y9t,ݨL7f޺;Cg%c$웽kYVy1Z/,SۥͱN7;egt6ځ7Ngh#-L +7#*},ٶXlˁ fܗ?Qԭj1 5ڱ<=ٛowf m/ovw_7ɟXn2Q |^%"~Teiٱ_ZR6rǖb=Kȥ0J7i =sZu'V [r?PQ]şC"/1QqqFy|,d>(8ょP:5A=G IhZՁC_U;c:;DZTqf 0<֚q?hh0^C*rAz=;V Qrl+ 0LxzT7[k5im5DaT#t[ V[5*h/JƻLMI X44-0iv((tD`/HZm"@ a)|# a1ͦ4J}@nPɒt`ņ1+ f C&sÍ0QY(:Y>~?b(YolRUgF8|IpmlSHjӽ'Gb0[UQ'n.̓o7j%>]]pKɼC/?]2Πs)< 3%Px>@TDӳ#8eZyoqDAZNa,86CC nyvB8&KS;%U&t(ԏ*"WʃfV,3Nā^ LםǗ|MY~uYI7ߊX#9>;e+x=O1ロ ;uB+Ϳ--j((]HlOwb_Ql#rK҈<) h[tZtN  ۾Hf`Jq@]DQD&dB&(/\lLf 5Е pl5+0yM 8XqI!~0l'VU% ZqZe%L$IƁRi- @tE_ ;6'Y׃"(P.h{=A0/ 7QSи*Q-L uV=4L7%yվp躧abظ9κs<ÄgcH*`֙>Ud &sRs"&Y DՅA9@FYb$'"$E= .wvaXm1oX*q,tsmb>NRӟѴ؟ANTatӵƖ뇆)ͤ9 jQl֊ʰе ;kWPXQ2kSz5B|CSbla0Jo夬 !c, .d$, M#a[=%*|LsKBWN)i:X&+^M.x$4H&-Z@I!6&# f̥ RAwE3j(cbvq{*BQ/ʟgHr .ddK C/`+.]J O] tEH` y%nU-,3]' Q,82c ;Zp2X~ lb)D/ 'KYȔ0ph7q? q_n)X&f/d| |c \MY%1 -7 l|id3תV(>6|Hud 9Sz6rhz^8>Q&Ujε?rx endstream endobj 6423 0 obj << /Length 2249 /Filter /FlateDecode >> stream xZms۸_H|g~\&v]f| MAc|f߻(Rmw\bg)X+4zmLo ?Ǎܸrְ=yde<OQNE3^Nuaiqr8;495Lfq+)3qm:6S?̞|@Y3Sk*PvQ]3UJ̛TU)yECE;uEYj]$_؋*׵FSMiGuQFҪP]D_$rƼUϏMc9 ]TR-4:-phϦiI}Gd(׹6E`G ԪEյ&jj}Rò**3RJ(4ɫCӵߝQg5M[U4eL*zFh":w%i$ j59yr#< }V<)@j>q]*R^qfgzlD1,d~˥uHЇ`>CC)ɼ'øx9Bg-{r:{7h_)ngxׁ>nWz|?3ZV^ytg Biu-Qdkj2JSlС7Lc(EJ-u,Z'Agnކ:ŨJs/jɓ6KJ!At\A%˻rh{{SzF)kZ]_J[NYpS<Nqq1ß7ݿ92T QW:qŗ㮊jgە(!/}[xw[ޞy,4ӛ7^ȿy?{4}z>G_&z/LrOw\nU.Ȟ$f.eއ刺7;0D?P 4怰(a]ב D^+}2 1pm̨E8kRd)4%.ǰy{7V[~WM满cB& BއcIgロYll96ct]GI"%Ar|$qQܯm"]*^;*@+yY ꨵ"P[7 (tB5zڶKГ&F^rs0`)pv]u&kO\ %tђԘSQJ4ٕIN s; T>V!vMgJt{-"^5-]FWE|G!"HVTYY4W-T,['ݡqgHHz~}Ϻ-܎jyћtZ7e ip+g~P;p]H>x{؂f{]B~ڥ_ 3^˾blv;Doh]YjJG> ]wkG]AGߛZA*MbG15.W[ x'Mp3qM4^!HXa|}>vRz̴#^j:XA' 0p#}+DpC5"GwU$mx`)hthGyg^5~܃)+]5h&$x#%oCDBelEM4Q~íuQm!H&b!C֌BQۨ"NEe"ʕ `JY DЅ< BBG}bNZy?EZ@QD޲jXM,7_Q_Z*5N$5UU瓶FR}o<0Z[z>HE qՊLt,hBӻ:ku:/%|ϑGY m_C`R Ƕ*ĚzܥOԲm>Q{ͫBBnǑ* endstream endobj 6439 0 obj << /Length 3195 /Filter /FlateDecode >> stream xڕrF]_B7l|E+T 0"(_}  qgoȱp_9!>^ w"gB`绶ks,Squ{^8fXBB:"ke7I1u;ڼTE_/Y+$1^ߪ^oر>aZQ|W U8v]; CKՕD3~s^_~%?޼z?z;7q˳$CJŃA(WJ=/Xێf7'tfo$bط'lNK%vz]D/ <׎tt yK]j /n5:TǺ@YNɢH^G-B^HlUwNOw#)b:q2^lZ6U,**ϸ $pSAzUS!\5{Y^b*k:X%z3BPshЕ=)kЕlKہW3D,AdIŅm` >'FY -IWyi<[ǎCġi$@g|)ṟ~XWE7񯰚T!4׮ŷ#`Az>(8%ǚyYu dF^ڎ'54"nƗ_j/x/$1X`Qٲ~87%H񀃬cG0+?a}r]?}_!mQzR m}uDJ-۶ 0V|,Z Cƍ!p$\~EдRV}Py1$0D@=u\oJb;5`O_ fgǓ.ʳ;9%qTog ' -&lKw4y:3۳͘C:h FNlԃٙFRI\W_&M+YǣAk &0ᯆ`,-dv7p)d&{ɗ\c.H7!x/9?`oѐOȡ4hⅠ9A2#|0-fCd#*`T6vMGHth!gLc8`SB <;HyM1hݐ",pJ / G.yiܷ0Pރ4x Λ1?Zh;.U4D qppOF;%)X17㌚IPUkEu!bW؊[V a%`W -Zn-!w E%a쁤lo!gx_cme)8ehGD-[ Uҍ& -,dgrGuPk@ D Jb;Mf?UDsd˸ifLV7%h"[p }o,%eQWg60K^vߛ39&z˯%q!!N/oqiC+H"23Z-tϼ Up 0R)R=Z7\:)n ymޕyCq!2 sh3ԫ,F^QΊM5~NŒhڝJFFZdmE[)O٠bgPIO+B>Y/Z o(}B^ i1c\LJ=;uд YWF?HuG ĝr{{bJ;T NެZc*sERjӇ\bctF@Vc &%vcy J Ƥ&O`jpRѶ{Y k{iGwZʫR!uR_ZeE'%ΎK^FRE13 L=7rd ၊Cȱ;.`H%#$PjcQUWY6;"\AVpldMF {>i8T8 Lk/-79J~2K('yn0͙ <̹&;}ZBEL^Җr ItF&zyu9$P4h\h^sp%%᠓q/ܕOd}1O=:V%ƚ*yDV]nz>zi1Gؑd7 㞱aԼo! !m>-3d*Ǟ[$9#oJ H5^W7@֗ugC2XW*U j iXY׎,,&i [DZ% y9%g) c> stream xZ[oF~  k2;!:tud4k8PE-/h.~9$6 lcr⍅g1 hly%Z,3ZGX X1[]`#_ 00̅6rڙ#,rY=~h ]=p#<"hL0dNAH+0߭:MEj6iD3EW<:cl9[XjێF66ۼ3ehU 1P%\.TWB.]t&E"㨎DϪj)ޏ6%8M&0U"]`\09;.hS%C$,<{ A ͙ݫJ9b=K/3om~&#qi%fQ_7 oY>(xB9`b`(5JHF>BCW ixF\Lq(ݐA.8 =1>I6a9QW* 㚳^)C֌2zT̮?޼k Аjʢx:tTLI\R֊M\: Ȳ\T+"_l{!cIAY D<$xwGDʲ \+QX6nfWJ4>Ga"nSZ.Һfe#,Tx\b ̣,͋Vc)DLZҤ(js/ͣϲ@QS}_(w\F)Tw$-0dR{SNyf*:͚G8fߍtXҖvk}+_lՄR+ \Dƽ)P{ . .c~Cu4I)a1\B'樼@U쥺 0(ٸmkb!܃%,1xMЦ5;zT觍kQP zN:!S `_ur=JD7s֭SuV9M!? m9i 3Σ%E%sxCg=a'E4,4[c q<Ŭu ^gAqJU \.d35 !gDF'Jܐ*a㟏ɸ= 2ع+^G slQ HƲõ4۸?n|8z)5?،ޖ]d@{ajևmh32S]-'Z֖.jQ% %B9EZIucU\RڔovA= Zuk`^Ĵ\3`(!PKVkEO- Vc") 9+= ҟ 3{Iyw^OgN/&}cb'=5xeukjU?zXQk-!l>/m˘ a& ˺lص\S~P=;]`v`^mlwQJVF!՛ ϧyȞA2EA-*p u:lu@ƽ=5,"k;gW maatm{:*36mz 8Jr{HxhO [^+v8R\GK|TW=2 /N1yu[D J=ĝ%7[u~81C* ),QsA*|@~Cw#u̱}*-U%A"Ix }|KRK{ۿo.x6zuܱ"ӣDžu= $QpÆq洌 t)|`!/ҲշV-A?{[?`G/wK"C3ZV endstream endobj 6504 0 obj << /Length 2173 /Filter /FlateDecode >> stream xYKs6W09lIU+ڃw8:זk"!1_cVvhgv/` t7ei\}}re =6;7YyZ:1>,}4\ .i|~mPA8ROYvh,#O>b `I a ˌ#g6,uYF#Q^ejylq+zM !7BPgy[IA2mԤͻMweG-Ih\a*Y.nM?m,Eq9 BT7q4{?YOOVJrI|s{9E4VVmW} \L.ҏK]<ЮLUNHR9Ї>Ӣ0>}kL\pQ_r>swYn `4>v E;Mig0P"; ۦ:_-Kbޙ0FxZ3ӹ t`7E= endstream endobj 6370 0 obj << /Type /ObjStm /N 100 /First 1022 /Length 3563 /Filter /FlateDecode >> stream x[mo7_Pd/@cˉy1leA0`wec$fS=CN6^H Sb*.p]N]1*Aw%|CVB:):σƉRbGrG*d;rI&ב u$QLQڍ8E#9MZ̑D5`P 9SW}:Ov%SG)w=_zHH|vϰ"Aq'w zLNRAV XAw`SP~(Z²R ⤋afbLg*u쬇'+|tGS&q* Ώ(_Br*'00gN=H"]Vr'>q686f+l;l,5 ,y9=؂^}q@l>SR1SlOȫ\wr M }lcl̈́( )y@޷a:G ϊRPb# `yfluټXlX 磝a6N ǃk=gpxWWLv:II'P H݂WpgG7Ϻ3l^tZ>>E~ӟ_l7ëzx;>?]u?++()fKD?:~Y/7ۡ^\q~u/盟tJh`;򏘯lDy'L0k`{!H{"F4ΩqNsjS8_,,jX/O^V:dٰnM颵&QOfꎿ؜mgo7W'/NWg媬Vv*Xyɩ).҇Fa5~(K n4f@VOחu{Z7j߇1Rmr!IMCjr [~wu~^37@}zƾXG8 r""2`7ōgੵ({Ipd#T4l+d"Չŋ(ƆlFLDLVtw2J~LS{WiHMz9\F (aV ٹ0\LQD.2Ju:p)O2~ʾ "0.P`v.0N'65^p<Cą`PjW0A;%UL"YM˗]V)(c[CU7vT $ n5إVCc)C!in.:MUu[[_}oiE dLvf vnTưxʇ1f6Έ!r!9; ~,Ŀyh=V=mV j77Bo~hrO4ήqvk]g8E5#<1×Wl_V$ju,/`N]@``MDwAqrb[XGP@A 9m߇dD{慨IBbcOUis!!K OڈNKpǀcfo+wa7bBb3#%2Q3&);e1Y̘n0Ed\zdf$$;^IsJO!Uɝs^&zт0iZSʒ#I'=C}%>E7(ONcəGP  BT#KWSEh+qA -wf>#@Ovd;$vÄ9v쨥 w^Jhơ’}nf{ =܌l |or3S6qdfxw;gf&T&~ D"p$z~z#:'tE2!rHc.?`822ָ!pP< D%bCL Ox#cq `W~0ы(7L> \z?(3no>xo[O;pFf8jpuW㽻5!5!5!|kB Ѻu#hm 6!0-9M]c hHj7 j!>ǥ 0Xk8*k3ˈZpiv>U;{ _~ݬ5<_PF zjRެJ϶Z~wqOgKFQE=&XQ,_.Uyߍg>? 8`^Mz/2zPn%r'H>"[Xg=[ժ]>Pj=zs) ߅;?Ė:I_3 ]F7 0!LiRv%KI4 Ć94ΡqshC8ƹ]}^5 z0ck!t>~I\,}$I˔r(iJڸ]=?MD Cnr ߎ|wq ֞k?JKPdcW g0bg >}/ NPL;4;W |H.R8|A5/܈oG_W9?7HYPKi>߮o.fhzÓ_ŻЛjryzxn%)UW_:1$'T&7bKj7N= \1F6E?01 v)~G/9ȊdD~* #r% LcF_,Y'Ekel#|oE&9R}_[}8 ˸deYz>_SF! C0%/5 `n.eU"2dxAElR𑞤@8:Gͪ7{ni;k!Es-6Rԗ2RE;8j )?wa׶ɲI?2m̟a!Ex=3q,NC{e{d?18R] s;haʹ#\B~]EQHv-jo75nrkָɭ%[K(Pns endstream endobj 6544 0 obj << /Length 2420 /Filter /FlateDecode >> stream xڵYYsF~ׯCn17Z'앩CbD )tρA`8= Xqy[4zmLWo ?G}X?ϵ`=[;2Q.r<`tqmw +p# Lքc,GiK$vw|p\ t#S +kIZO5{J6GjɢZFlu2Ӓ0N2|+@.Ni;01XaB jpG,IhrC&sOlR9J|葎v$^De}{YU麷ӴXu $t!Y9K*]lr;YS $O]@H,MtTOl+F8r}"Z]$R21Snr-Q^ J h@H>{vO3ϔ tO'Tam,7 K'pyVȼ~R#oNr%N݉plgofxʡ) lQCMq'v*)ߘ@%:~.<_?Uq"}#{ u|m?J6xr&B6 ~X̣&^׬Ȫ| \-? YgJ?!6j Swd˟.ڕ|@hWYUX(UZmg;D.ŭfТB(0ޢ:.O2y)P3 p'I ahB׉_آfY-&8_mbLP@jz߲m?lhvcښUVXKDz*ɢҩY;6d]M1U/& ,Wڲ;(hjᄮI<}A&չ۷4^!5`AEr|8CJ7/n~C"*IRpx TM, (Gp# Hr޷OPy180U!hMڻ[` w4^^.bDX>O~$k:H]2pо)\j&ҡ@%k˰P5RJi BufbgDòљx\8orέwTWѢ Û++a P+x/* Y dFkѱe!α?D s{8q,X Dd.XF.ٺ1`r%ǼZjZm ZhhbÇ޾̪yK@P'` "@q*Ejޟ>fC85uZQӨ1Cx׃6#bEE wpZy#pҠT~Lޖ|ٖ6ITb:[&ZB0%*~;P%ⱦmRb}`vwZ7-8Ih i1gRz :=űzh5GYmѻ5!udt yhU4Qbx2{E(2z=usՇWwWӋg?_ޝ="C<~ i=H}9cy(ϝ|l\+H-&4Vi5cNڑFI`=绹[6~lX {T)3DM~b;1äQzB˖oBγLި[g>{~ endstream endobj 6570 0 obj << /Length 2223 /Filter /FlateDecode >> stream xZmo6B衁eH꽾&/ml5Y ݕ$mc~7(qu/`Ùru6jb+D; 0 } "|b]eֵ"Lg4˼mr!^hND*oiUƱN_- c`t! k 2'N\A@{e]N>FĠOV*.v:s׮6y=% a[Te#)hZwG+R[DB툕 [XƮELB%Ǩ."Ǐp&>/Vv.h2.iCq5RPcVx*k4N>"o, pUn-in?}8ߜ_\:߼Bۃiw ~~pib'^@A"'ͩl"Fq04͛foeU&)8s0SrUj-' {9e6VJЇ0`yD?[A Y|! ; Jџ@z֮wlyw("6z A,cz p ǣF*Sٷ9D8Bdb=,8 xD㑢*^pM{$0쩿{cܡm] 2EB}ų&E.;X'Lt;w ug\7dw: źXҀ~^e-^W1W1*B8P7ڄJ&E"Fhu &*|RCr@VfſVCp*x^v3 fSqQpu0nF?R,Y2^~EcerGٟ|^^e꧷~<\'?2rp;ܸ+@pI:>'v}z k(uz -HLcٛϬvo?x,ӗfaY4 W`k!w4jR]UrkYGK $GDf-Z!z=1- FMg3_(}& RP|ƴQnBAz81M_M^qz tgEY%/:inqfʞ絉:)/Tz3ixwåeiRD`R}&o8iۺݶy.RےQȓ$| RHQ@ qWqR/jÄWO{ʁN۩{0$yre=s{#tE6c)~ϪTUmB[,:/ʡTS=s~.;Cu\O>!/Wez쪪hɎdWP!:@qtYu(74r;n  Kb~bXғYCgN\'6owLՅ2.iB e*.aaX0\?6g6qvuwГuR&\ta}$䎟dCeUBvr-QXSqMZt H;{CHb\?-t)f]&Rx+mBնlHUvBRsu=%(m:Wxd~f6Ke:ͭ:~2p;L'S~M~#nW;˼NZeJZlyoD&h q Ê- U8!}]q _|k`1 endstream endobj 6616 0 obj << /Length 2140 /Filter /FlateDecode >> stream xk۶~?eڂs~$ޣNP$t"sw RDnb] KnXz;rVXk+,}+K 2mםr|}H³JnGyLhT;&/'NlhCJ׊J`{3gZ5r=y̺s{̊f}xq*G=[Sϧ37vZX]QU /)Z ZIԿ9yf6ʣ4mQ*!#n Zzc0`%ZN$HĺU\b_"6_n(]wXˑYP0z&*bO<wvڳ;U؞pѻ+(ˊhf[[һA`ǿlU*Cd&JeIBzLjuOK8b2_Ґ!gZZO73:)rSǨim:;m4o6,ΏMrݎ6>3ȆnV@<{^_ޙ<ə$%?`i^v?$s1{J׼Zpz${lpˠ39AʦHO6|ˈͯ);7!8T[KxB1*z?z* l\ĥ4UE9va'M)Y!aIZ.@-5H/xpcv_*3ZWDE[@6jb̄1W 7&=XH6bn\1?4 NgcSqRR!,.B m(34,ך; (B54|uM~NW'l=}yq<*@@a#+ZB!؀A!9/:+R졐[s} OvV42SaEB=ԋ߱/ NtC$@%y/K$)@dj8.*ɬZm YX57L]y8BHʑh;Z9x6 8Kvi^jpq89<+͎=zqV"g *mLmT\Ч޲:-m Lp80_ZВN ƶ}$AMBvl=)o6CT d/JHKi~sHߖ}7`[H?`O# :c@s:kvigDNB'Ywu]&MV媄g|+xMX0Վ& \x4LgiXB* pA+۴K* endstream endobj 6512 0 obj << /Type /ObjStm /N 100 /First 1023 /Length 3708 /Filter /FlateDecode >> stream x\k_s?E$`p,^ 0l,,.9Zn4qy3&zSd[8LQ&VarLڈgFB>LmDDsN[E]x,Fa1*֗(䂪JxJ҅SH:4W5X1b"HԦJ-84(alWBBӲNeW^T !b2}"l5s"kFFb̆'%5GCnjn`u &b6v]09|H#Bu]l/v`NVah>¦71Nϟ]|M.vr?g{a~/gߴr?}/i$9.]fcf>|vﮧ^^?v_zno??}\)PI5Yug(r}}uy_]=_^_vvߵחWoo}yj~CR!iޛ1?^ (![*>WvK)Roi-)̮;qka݋v{v/_f "c䶶sCF$[]Kv ѪK6,{8o y!r+ѮŲ0bRXb&C4B>¦X$YbNJ55r]Y1n-T7:)mBjA2lLuVfy\gwdgF;ͱ#}fgT!)u~WW~IǾ,e }('`0 \RϿ.k?O?i/x߮>6~wp[ݞeOSw P WQ!|Aİ;9)Aˡaa4hx܍ǝ 7<~4nn|P=O HkZOq@Z6)KnaC5M"la!,@Ģ;x l[fhP sRe@?3Zg5?v-{ j]ºm`{ޢ℃+CڥMn!DO#؜y![ZhF@-%<RK (5~+3! ̉N7k6,1kH!qf ̤1TՍaVyֺl[?Y}]s{lť_diلLlbg$-ӞbZ(M+T陘JK3msŖUH $~~LnHGHm[JTRfW@ v.lIB{{c[_k cbmP,*-~e$dk*hl΀' uY2k0!HcڲBUELJcՖl,\W2َl:"TCU,D98_FD Trphi E|%M *Nz֖ ɁX>I󫧐`\=/}HqpfVm xgX>hvdٮo%8S@_vFu8EK,aA!6iC@WmBрV|_Àa8k5|99999adyfL9L!PY޺<4hhSblj1'ScCu Gwș+Ź蝞Z|a'"=%&)7K01LLY֤ALQK׻B?%/mYO$:ьJP2ͻ}A^gWw oUfʣrI&}/c[ rp.AhD6!+K\k1[Gy`H}m= qC@2^n3ASVG}ÆKET)/մ5Ʀx8[b87h|]ݒQ_Ha`_ %}?F"CÙiHEl.~9G6D2R@yv"O7g^9$`Ğ.ų`?Q,Pz} }=܃Jʊڏ 'f쬵qYޮnzYXAo)O\xӓ;ϼf/c6> stream xڽVo6~_G ))oM(͛nEZD'Bdѓ$__G):( Ţyǻ_$AjvtJq&DVk aAѪ@AiYu`u$7J;Id,>5l(̮?T;DpinP̍rnjxd 221fA1Auި;98y×fC_ C)+`;]kT=SXso{NFeE%FimY<"iP|UUARh`P'k2QJ6 6D8-w:4vkk3y1CN~bDq@_' Qq|LeIˆ}9׬xrY"$Pڞ1A:Wu*_ɀj3aF`cז-Mh ҹ#d)f!;id,| `0La]:VeVz@ySO*K2,ʵ3S lZhotqNs M3]X腆b1H2m(A]3Vէ{Jloʢ,u~ e'U{i (`=/>ӫKXjlϏF!NֵnFrY6LҳqD}oʺ0%\h1iV/ Y@ɛ6.vծPuY&iwJb')aXjWM*@j 7WL^/dAʌ sy'ڵ _@忮*=VĎz,ZG<">U/,a4dc~MyDdSuGz/7OG^`#Qx9O UFSEͥ‚VE}sr¸ 3FjLUG#q endstream endobj 6637 0 obj << /Length 264 /Filter /FlateDecode >> stream xڕPr0WJu !C Τ`( 6q>Pڽv0g{^Dd(=d`-uC$P ly>;z쓩(@PK-lkZ#Tm(Mg:#5`^^?;⍧ˢ$uFmJMЄ<&0e8&%T٩6i=Ut*ğ˦ڴG6%V^L jt\e endstream endobj 6649 0 obj << /Length 2492 /Filter /FlateDecode >> stream xَܸ_y Ԁ[}lY;ذgvGt3C=uQ- CbX7;ogn?^p4牿}ܥ%.<7ImysRAwCdNVtHH؍2v'y0u͐ rtUSOf8󠺏wR3z͓$¤n,퇛4sL}ZuĎDt?u@?R?aP~`#\mÀ/sHWgi3<TE*Yfeתt[A|n9!o@#L)q8>Y&3tBc9ajchT Q,-d>DW & lN^ Lc=r|L /rׁz !;'#ԅԢ8umӎH'H)p$ws:1 qm`?Ѡu6o̒:Rgx28E[ǁ|}2^(_jIH*?-T*%|J.$cȍ vMgM{~~*dENC7B9h!/Tj{(hOLl\,](H @05<ꖩ &(p uSh7s*E+:}?`DSjBUc5ؖFV+P7,_ϰNssRRb/չfHD`bb)PXBH?h+ pF;Ҡ̷vÉ-Ny9Oœ}r8݊!D41BjRlk!20-/~c _`[`Å`NE>k0U˭rPlL h hH 06IpE*E `%"tH%C4s"R0)$DǕ\ly^[t$4=/Tl*X/lA)<]<G bqb0):T%90u•"3Â%D`ZyfU#]4mⒸy %EXyT-:h {=? wfd=te RSg󇍚l"zqb&w.w.Gc48~Uf6m r%rhJM#OUM^oC 1}+/ ?p&M"p6ɧ! =7eZor/s!xWr_)&yN[kU ezXx. %u}%\X>Ar2"Ҳ>h<~^^.6\ -ZЫY09!e9^- rXMB^?R͌V$/3pyYk T|[@u$InxѷJme4nb)&ox:zB}^_5&*HB_y:R73n*5VS $?ago. JG m HdfI'/C:]pc-y/*ʋ#9ŨҎP:@DUAs5klRE)@\MceQALY^œXX%f7GύmBX #k,fd`6(7=zCjXW)"꾀K/Qh{CunA[]^٧N\CΚm֑uxrC{7d-GV`5EH,M{<1׈&S6YlŎ=PF/._o-5O- ŶOK?xs׵Yu^> stream xڵَܸ}ՀG}8Ol"@x`/lMXG(y2Ta U,u_.CY·<,;eg>xA{?03/cx=qUsO1p>F5xW5^in_=|ׇB)8(9T߂C {??.ÓlIiú9]++ 2GI=UWL4M_Q:8q Ot>w3_WE ‹NZ/ȫ "L5㵟᪻pA"aiJl m0<,co9r->ԓC4Nw !QӇGZLZw; zEN-Fԁ88Y*Y0"P{O {sް{]]j# &?H`>#U[cM /Jr+֜Å_eh@Xqa 6=Ptj !HVp{Cx{̵sQ{Ղɺx%Σ\ZQ,' -@ŤXVhKVuF|V_War5tުHVU{3x\l8hha ėlDxh]U}^ #aH{6&6&w$G"CMAڐ]9xA^>FiKܒPd.@00LYq :R? Q^`375bPJ[;z)3GTg9BB8q>u]PMUz M,EJ7`fiiwÑP^ZsUSÖ޺S Ђm;q9Sz Eqf4:yi  cVIx<3oťST[ td 盪X0dѿn|^KZ\ ~U`IHFbIQ͓2 \#ˏ=kF- Xhɸ==lݛ#acgx.J+I#d̂^@+)R1nGx3hL Rk!) Vs::&`~3)$*#ʼ|U?1D xc.2⪑e[l#ޘy*)$:i'kp #jG̻ȑh4e]а67a R,489tV3T6"<ɏE 8$i>`K926D,0vavAYK'UWR uy%G A>|}aaWl8ڌDdmBz]870U]-otgŝaGqպjSϥܽ*:mo aV^Ԓe8(`6(0\/kB,~TƆ9fVJY dGIeV)u[E}pTD13[8MMĔPՂMP0R\,/+*OұB,siYL|`/qL)+Ϧ~-@\ZD+'Ii1lm"1yb1ޭaQ^7h1,m Q6 wz.Id@2GIFTBwM(BӞ JzS"r8z}SԃAn̕OtJFe=K۵m#FGÇT#ǗG 2l6y@nwG]|B|\r11 u[FY9m:ѱj{ͲbL̝מ͑Z#v8F*4{BDNUbn}pQU#<|FSg9{ n(x;HC$ZY{ ,t@ m0mc7L ,}>O oq5ca| eOP/Ax ,`BxzjaX&[t-s%6i!3CϜ$7KTOmbE3f>GiyFP32p :#n P)톔[Cԏ#0(MLa!h|PL$dCzGiQv) @DWܓ71МdqL~yVm;}]c). :H{ Kd~,;`דЪb4!mݴRDy*.(JJӌ'1 E叟PfiZ@|w;j%>2M)TE&穸ɲGb\C"hR@;kO4@P-}`q3uNEyw'rۅMNCSyq⮯R_pgv ߴx__8SDv茆5Zo{J @WJŽu xvh/i= }c?@ssŀgk- 6,>A* _ɫ(&Ȱ Ʃ?~.{cۊΌ endstream endobj 6681 0 obj << /Length 3719 /Filter /FlateDecode >> stream xZY6~_/ nEj< ?` :}77=m =|䅒m^]+?T=2}ھ@Cq <*nzEɜrAX񛗉$`!2D >f!ċ؎P[hA)0ĞO?˜FjA"jҜ'HxE`ŚI|D\%LEn 7˦ ܰ"Sаp g6G<#N~P0 s4C$Š+?]}oU8V\ƒlC3T96; :9pc0Ƹ/i,ǂpKeǢHFNR:G1s73~y绵-~N!]꥓!s!( /KޡXM 2^ipLS7 fʿ>SW波,#׹~NijM؈n2 ].G|/`D;ɋ?P2'8d<3[%"ͤ&e#X\Bv MN*z`zLP˛kr `L /jym;}Ih &6 DXQ)KF0K5y3Px$8?,i4|s`r^QRX-c6khe^֦9I9@NQ,]f]c85>يڌxVZp0S i?6H*M<K[WTa</D q 955$3Tx@ŘX"KYqy!V/iidOM<%GKZUTwv|k(~b{vf(Yt4d#&Rۢ;Yo'>O]o.0/v$gIjԶ(ʥ sα8.˩Pw~-ACSP }Q{(iV(0/-2@G e#,; @2OK L3XzBdtIzqO-LTd2y4@4tqX7i@Z=6A'2V=L΃giEV߾CYʓrQ1Uw/(h/o{0t9Dv 7/ =x>5˾A`g DeÖ8j^hr$;DGPq@"~I\ع@Q*eK?U77/d#"@=qhЪ 'wo.[l`x*ekl"wrkuw ˁ;D7mJMݴ) m9H A ?nHSػC{P&#^uG`*8;Erw=2UrA'3._ʹ, 4aMxPLfhp iy M3'7'HWMAmoӂHo7PS]6+>5 7t5S,'I3~ֵxr%?9pze rroy-5JNr)f?qD=Y5-AN&VDIdSečdh=#Ita 'z8{0hf^4o B fZM+VZI8&K4gK R-% tt`NgK@umwo&Z$3$a?P~:ȹMb22| ܎rG-8A3d4OP7TQ߸Jd.9VJw,{6&m0a V:MSϹ>m 5Q57eGNW\ay"<^v3Q4H\0D 1w-u3t#2nVr-kf t6Vlxj孖m>Ͱ?\9χ~JwW,?bvi|GhcwfP-G@(Jm- ,8HzR,.tq%jl pOaٙҎ?Հr\ ]N%>"q!^Ry"[a3 tf\K"Uރ-Hɺ> stream xڭْ6}B UY4 tUd=#Wv+(Ę"]`o$ bs\'E'e"qhN`(^nVxjcjKEO+ ~%`VuLˌ~ʛneǫכ\yL!Xx/bc?.\G&<.@:/],nq垝N͜0?{ˇȲhZ߮+=Q gln\M-M @e6ȧt_#ϟD#|#L,C`Z)I"UIl4Ye; ks il>}]{.ꨩxW]8],rw =NĚa&/- 5KV;j5Fߊ)Ao&׼T):t+6;omi_5}7s#9kقRZc+0 B1[/~ `1QeHF2}T)h?ozd ' p1;''B9yFfSj7nS㱰e~HZMf+oٴc^\; kd[ I?<-̈|+ #e `iG ,"R ьi 5xJ8X4GEP6#UZmچxfR\Ӳ}Oԇė1E[Qf)@s]MKO"Ϭ#9=62]b@ݨJMf s#|G\tlMΘ>DLӘYx[f*孏o٩'^pݥO`ʬǵ|;UcʂO H $R1ύ#SԳ.(}ZN7Hx>g]~ȋZ#|fՖFHkϼ`yi33erYXă!`r$J`ؚZ:X&ˁooکf{OD4Kf%=4`#Jl-.$"O@W(fDصV<{ 3=0D>h#jhIz<ѥo!}YAH=C{5s;U֊0iECiW[1cgM774-`BM4}%UD0Flf `hxF-'892Y6KwǾ%P@g4RHυt s2Zc}{F"FbEpԮۤmi sk`UDpq$ӌC⤶.P G3^M}"c6 m: 1ƸbcqPjtD.$w sma SO nJM=2``)ӌPMF4@tͳ!Xiin& {nN)#7jMCFȐ5 $t)#[{/y 4;DRbz(RwUa=(bAxV?5.x8t{P\>s: nƩ=~FKZy>]ۘ"HCD}B50v]ť}:Ʈؤޯ4P.eK} {BDs?y2J&s."\$g4\H[y#gPІ˶mcA*kdJGE!k=b}9v5\{=;\on^yoϪ:JjRv3?|4 6hZ Fiy^Ӝ`y?Cq(03Sޢ%`ȅ#Htpt XP)`pCUoxHG—9zk7kpʻYyv*鞔He$BG2HVib[*cУy:XtG2 9I`Tp " !yړZ $ի P@M3S "[튦uh+D@{ֱ~)X4^cI1cSsWD(joǧ*7V|OmImơ 4ui5fFIO6o0Жj6`{$5(03roK<{@Afڈ l?PoQ0@*j_HN>oQ%tI\=@:@-6}b4)QȥfOwv;!a\e1YЩ_t57f" jA*C Ȩu&gEWy| 7Kld(>ф+&R` ̆#G. 1xs7.采;V#  ё}yܡW5ywk/J)bZU ڇ bvG!CqLme_ƉCL4gԍ8pmWSN͖b`A^J|h!GN⻤B2vd'IW 3͇7Q M +3^<: *OĀwTƋѽ(M9b\8BO~y!@82G2Z5)_O`="pv87фIX#zk0".8aM/S+J[CFɔ4RK]) FV0myƍ{n_\_:k7q^|]92'a0jKk0Q8vLwcǾеC[_w\Oww#dVm2c]icrPU㜮n Ǽn*j.f#cu%_@|QOtO6 Lp.0.!cX kNyQfoRXLu2 Fau4cI\,"F?em2C^ [<@} <D8{e9e endstream endobj 6741 0 obj << /Length 1652 /Filter /FlateDecode >> stream xڥko6탌,Izd<6Ebh C[^#rd[Z4xӦʡ|wND9['$}'83O$tƃнzUSjLR#xٲ*!<"!/H갭0$!NRL>|N gJ(t e ̄f;דwj_Yp&Q@,tS]ԛE ڎEu?ݡjc@,"—U>YhHUV93Ҭv o*`Q"jPIjtR7UwkNRNg "owP~Ԣ8ԓA(!8ǗoRz5bD$z"dLYT0b1 דF0@`SpH%F!h,$ $ p@ ,OyL2޷q!GB Hf3KnF_:=oSbɾ)srv7^Q7^YJ+$s1je%@t.o%ڬnehQv EZ'Y=f48-b 4nRܥF my^}C"6QF,L½ kwĭR#UxUE:MUV,ۤ9:{#o9nUD%:ڹ^BWkD%:56s}7oZMr b(1u3jeΫn$Y׎M=/{wCNHȋY|mbWA[4}΄Eo Jc\Gz}F"zDݷpPPmk\D$& p>R `<-E 2 D'!{\@+<ԉytXY[m3 eH-$ g)*G*2Y"ifh}6 3(%f19-wNZɭ S֠uӱ$LΪUz MU `:BsSӿ*SY\DK]56'W77W'XC\oX@Ӏ0픰?N}gZ7[ƭn/G$kJu7,2&gOC Z&7XgkIUnei;f1 ( ?j8o+D--6:ϒiΉfmXcqiEWC!s>΁86'XdW/'T$R6u A:Q]0vX=:PHP7^نCC~D]cFbh6IO cu^C)q<I,@Avi ѫW-NO_?阁"CJ[Fx'i\m8G |Yw{I\uc/oתݜ|OM/n7e)fS ףc'<Уvf^R5&E^n$B3q={ zy+#U{WZ?Nn endstream endobj 6627 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 3137 /Filter /FlateDecode >> stream x[mo_q87 [vkN K)ƁU'$ο3{Zٮd[rq23gT66 ن2aSIo6Q6ɜ䵕 c0'5߇!'ƏюqCID9ʍ#0©q KoN8"7.dY06eJ7rY2&0>%>h?ύؔFdmD?*`b4E% -!TI<ъJg9Z>6XS)B ['PH.mSX3Qԡ|BRxM@ 1c {4C, \f~q~w,VD+΁PH^GD'CIG87jDlDO蒡*ڒ&;ivDhGHhM֙€4 A#47€teUHIovh#"v^eZ4":u;93Z vjN Lc,Ţ61U%mȤg QstcOpYQg=[qVjuz8l/'O}]b?O~aov/q ,xwCѣfq,~zt,O/ϖWϗ'}}[/ˣrb]O8Dh =۝ \x0Ҩs`I4lo/= i֧a~6WϚQ}ѼTE^aO\8^5r N߽Iy|go!HJ1 `Կs?Q%kġx3g=B&NЗMF[5q9?鞾/ƅ`2)((P}Hϸj?Q/N.NNW'cJϴNȍ0^T+PE.ߛ79\5Qwo&:_S#iVMfkJEpxQV}Y#4N,/NuAHk[kPۧ6ڎH8[u P#N❸%z}l %ǒlk۶W!mw#BBB3 2{R=:ꢸ$h շiM$r\r5+G`kIplLn?GH:N.&6Y]u՝ P(WJOLrl ӎ`&$xɎI|Fp4 Uk}iKZ{tHJ̭aaok@C9bbr/w)khn`R6pl) tATĥܷK r"U#d"/w /`jԶN W9qZ6C[-JScpapa H)-DPWhH"zd(a[9uكfrפw!݆1! 9* mhNFef롄`q*%W_$9xx>\)3Kr~goK-) JGlD$)Kxo<7P˄HYmcKp˖b }p%d3R4~9W;ކ_utG{KZlؗ;;lCijp%!NdZuz}&D*RۄOI_NB7IbFR8qS805f- :GL(]cp;^zv r]WOWOWb]'UwxO'xz0{4ʪ޾l1AM zt`=4! 2哟/3&\3! 3OyYOlWO|b^6͜ n͟ <@&Gt l|rlrL1'`5$Tz !&ɻZ)& u|Եϡ_CvEŜY\wf-q#ĈiRƳL<\yvZ۶T<05ӟJ zJ,d}/`:=0oW/<xtw64O6O6O6O6iU>vՠƴiT1C6N4&"h1BFHB27tTFh7w%wVx}rgmz`!qv0yKC*JN`(OF0]`hvI$# ԾJqꔸ*7If|{i黳P[֕+ﻳh1^-D^y] ܆3#EoHoR[cC^L`dUvVB]&!(e/&u(]sޑ[ z%* %>R̨2 56J$8og@""|ß}`y+뉀!mg6AP5L 2oȐ5%m+ypt}I=⫏ܦvGIX K,%=xx3"yK8-3)]s9F2_5S?ںIg9}U dm΢ۘ`\qXEG/xT~avSg@JrKw/]TiSJO {%T endstream endobj 6730 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./starpu_starpu_slu_lu_model_11.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6743 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 6744 0 R >>/Font << /R8 6745 0 R>> >> /Length 2200 /Filter /FlateDecode >> 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~__| 1 endstream endobj 6748 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2374 >> 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 6765 0 obj << /Length 2980 /Filter /FlateDecode >> stream xڥZ[۶~?BO>b WɌk3Եz:GC E*9wH#h.:l7f/n~\f-s0EtC1[fN x~伬"p>(vs*Bx&ҫqKXUrvO7mZz;:y3n,p7`$}2+3?Pn+77J,tHx8rCO͢P=[V|z=}[,"+Ug&k ~|;^A*5ňwG0ۊ~!B7RpGۅy  5"pʳ3Ռܭ^} InpgVra q幚6rAMWkc(p\/"g'*y%5QS65nզ/S#ѵXB{F z, %YbsS٠}8Xmsٶd㉬WG0y}xDѲh"mڳLL>6]2+j2ik~#j]]޴11%UE0'^/E:,,S-EN8煮_ Q:ys`XSMI]uG^U}7+>ev۫KWBpǫϞ?~XĦ^4a1ߐ>Mۼ*oA&W\j灁e :-^@6]ġ8E2?_8XH !#WE!-'Y 9_RB64h+\kTα6@cp2"%-:E7zSo"T I ݆ slPM3VOUio"M 5Hqb!Q=x8+JfBM%`VCX]r!e<7v, ixM#Nf;3O+v-1@t KLjxX:-P2em4oʌvfe=k3p˴h`-|Y;fT:Sgϓ% M't[Ժ޺j 2|giNpz[ζ+7dn3Of3@4x3!Xt0Y:63^EicȆ,]cLTD?i͔&R=+""{ê)Nvҿ $T0XgXQ)oskQ C߮ǼׄϘ+<;qKa⊤hވGC;2#(̈́5҄ g >Ek(,RnX}dt(ZSa#S.vL+5>Mx'z94S>/5wK% p_յzG d2H:ZIYVxۃ9$9nfR8TJ'::$k&"G&}Zc.1%bH(튶a }y}UZ*FeMKs4&kT{;pNqԙڌ9@'$ɆѺY\ˌX-Xo|tjZiLA DWꗠQq1k4J"ߤŗW. X)u8֩.`mKeJ n@PrO0US,]pA0_ b™y$okSnN?HZIl?e`ΈФvU4G)}X͗\NS0_ \%! N7JNkWQ _﷜iC~16=T{ `%؍gϟ-zEx!K7OPVzҍ < @Or2 = r@&ŀr2TXDL". %1 lH¼i:quŌ'n e)&b6{mdDWĖ[[|BgLl*"rV&4 "wdJr3hFNiҞ}/Qo;f6d[} Ɣ4/RS =uvsƪsa90*+&OܸU_yP;]sfEn(aYg ;BZ~39Ԧ:hˢD:pMHazՑ-`T%/3I7IrSt問&os8z?k袼+< žy(=ߵtG"#@7a0B taf7*ta%.&O R6K(Э@[zG00Eዛhߓ MI0xh)+=8?_; İqӕ6"J΢>} Š{)zm^N,R\P S rVU*ႋFO_ FuU6vL7 juPYsuB^͕t XgSMo Xޘٓr^JV7L覚kHo]Rn'G~=.S$8Mj^$/[FdO)x<=$p.:=1|PEeuH=5$b|LbWy0 eȿ_gǕ7>!C|C1p9$/*/J X ˿c/ io< VaO9/zÊf抪W}O4Je`J~o9ie0ݎ{<7~ endstream endobj 6784 0 obj << /Length 3482 /Filter /FlateDecode >> stream xڥ]s6=o'Ԫ$R_ٛfm\<"1&ZR@P  iog'ߜ|1FX/bMhbX8q+sKs6諲~XzBJᆱʴN 'roO~[0sE,4v!C &X>gX"w=n+C! YpD:F@8m֩YH.} kXlJK?tJDsidbe{aU/Cӷx2HR7Bôc*:7) eNN?ktOvmSj _Hѭ넊Q2DpNK (g((A?.A[ߩ^Syc2]k}=in .dz"r>EV)g&F шp+t0,(UxDr|dkT8Ja(H#f"f{K8q[Hk4΍i|FOYye"+BDmV3CG,.cd`TIH SĚEI8%/,Ч t ^W;ep@ ,6},bG|(c9qeNgadzb,_h4VA>]Ih øS].p5'iv8|x)HDenR7GQN٪ݖW06tC1_dSR.̭ ñ:l1A'ꎳ%S]BTκ3@ 7㼯*olYY: HM8CXz73%)G:}bd݁3` Q0F%o8vN̓Jo|3/.=Ϙs}aῳo?CTY@,{ }Y< h! {DTuBbQ 2>r)|dQr@ruHg`VZ5pAҊcaCSg_<.QQ 0XsT4rB:"C2/ W 9ADj|):x:N0!r(Cln侯>CalЃOBIT 6 SS]]iţFWV$f.PUF\g۲gd9$<➆iқd}BilQ*7M D䦱Hic텤V>A\DԺٺݩ/S58Ȫ1g؏ag{+^G=NE+gwy=zcE^d,Cz{~7$W(txPlB!?]MAD"l (-Lڣr4X6 zс` aߚHwLecbPsH~mF%op&E~'t֨ud! vfɑ3fl{*[!D6Ŏu"RK\%!JUX1f5UK ~sǖcHH+XayFC{x&3ݲ5s5i'0CicRTCHF.Hb CXgK_OEi_2ؿؼpFP`zZ3$Fq5GP r v o^ ol:Qc,'<~2=Nޘ2pJ,5\|raT( l,tS,U5"Md{YyX񹦝sWn?j!r6``pV'v{'jD8SRC j.?#xG[*uXVD;MmS t#mZQbu_UA:^%dixTt 4At6AgRܓuoƃ;EkAgqVig޼% #w']xi^dLzѪQ&kt}=lMc~m$9Ԥ\Dh> stream xڵZs6B/f,oRic7{I.'sv<KlPI0]q\f<b 3͜wXa0_xK' k=Oʊ?X}hsB[x=VJoo翭>i}Ǚ 293!I fo,g/ك,fAaC;uN+rml$Ik=Os/cӈT[%ҝ-!;gpc;4'硪|9Z_{{{b}旟ܮpGFV!yNZn@$TEŪ _*-QRɲiĎ>e)tnqL+ɫb14]hY)3`##ʮS4He~X7,HLeUpeP *廋/krE}wus=whg[HMwY#Zlk/T+*F $s9ͥ2#3軕&64qO6UZ}#>"AkR\;3׳K;cq WXٯm98}P gWW^baZ.\nĸɁb~h<'ڽ@=R S^ +xHc3mhp ]ŒL5>UQ)-ˤ4~/ e*C<.&m t@9/D$g&T8EˊL#ccF}K40hsv^Z:}] AWa:Hr4QrbΟ,{!6KՆxˁM#ac>Ҋ;`*&-t\HTv'o^g{IBͪ*c*\HgM_Į38 !<':fgHDHvu-KEA-|Z$@[Rk/^lm}ӟJdӐ{>a!٧g?M$6re$'xA9D[>4^h\F vAvz[vXФC~h55^Z~ p(y uںb.Zm0G0RuiI=@ω5hMLH!0v1Lڛ8L |]sv8֝J_wB w%7汵=_sӥ.qoiA@lx@u gNI"tDԝWj<AE@ -e[ + O#GF90x` ;6^LU})@HDCؗ1W헼:YrtxW9p KR)dcÀ&熾QϵH8վHΔȧ3d &i=0 m@#mX oxeucO@<=Ýt+S\@m^ NA9\=%: rwSBux7 Źd@P{"39Q0 %[= yܺ+Ё@s-MЀ#'!9f-j.zJpxO$5bI#N0 #t! 0EiBËTgJDgJlS5_$$2EHkR ?AȘ݋z_ qL>[:[9ohDL\4 g^΂/k}%&Lj34Ko3{"qLdcúN8GM]ڵ-]Hˀ'->l *zoWMK3z:zubıa&hyphyaw!W(颠VZ!+Ȝt؟4 jynX(cǩ+`k1]tA~7ވ477~Dv5s70A(4,W68FEߙJ1N@e[gu[jT ()kZaZ7{T&M |6T..WYk/d˕{wS8MjxWN̓:MF9B=CQӉm8͒dj|HN#Ўԫx|ΛyQ:<((b3Y aW(N,7>sgoJwmk6]E=| g<j/Kks` endstream endobj 6821 0 obj << /Length 2429 /Filter /FlateDecode >> stream xڽY[o~ϯТ=2Vt@$)u ]DʢK\ןPKQ9̐a7g?>wm#faK#8 hZc2+ٯg6o[n]lXhf8pMXP˙L۶ͽ@76ӤeIˉZQҒmcV컴ZTtj~(ŎKL4I^[隺h$xY'{nYr;R ͺj1WH&ýz;7޷K}X`gikQ3ǘ\xf~Mo\fɞGƎ|ˍ]MtΛZ7ΛUm$*HQ-C-oVB(QEAg ef:gEnǚIJ=7TU+WۚL82&“& H"9p)HxϋAmZNjgf &Ob#x"MCm0բysFW PdP%zo-Km6mRJ 6A^vhKf4z߹4Z*@oxBZPF$͚m-T?覲Y2]ԈARz D*7ۜN(f949vt UHl'e>w:!=;B;,C8iRM#ʱPʗSiS01iE(Jc˅@&` G)][Zso#L)Y+pQ  M:z>0C0IQӠNSFH(=g 'RP\V'WrL,Y 4jfy`%A?(87;Qi,vz֟J,@NNƊy249$@5293* zdpdb-\xPؚ |>Xb`/:a0+Ar@_Q;]юRy HWSKvANћZ̈́ ):y#yͣ+jI$HnT{ƒQMB?FFLPK)M_}ΐPG,m c4D'CɴW-{jPN:?ZOW?d,ğP.>_Dif2d?aFٶY2k)/#m[Rޱ8#'H"vRFn8UpVXN֬nX =)N5ъnYb`ʓB, T,-:jZ !9w=Չ}(κ@]t-:%e6) Fn8G6)u3ucxln}2Dө(u6=ܣ`sQ(8c̅`h&lcAaUћTbu*]S}@#1H>zA# %m,g~U$DBcג9@Ua*r̵jޗ.=w7sk,O sd9[[dk2oҥU8# M:H:'/zS^E\1|pOK ҄]d;aU*U ;1+saqedNH!\ct6O4X_W'wU͛7_4-Ck:> %~L+aHp'<-t{1_t5krֲz NB\?yyS~Ѽ"nZ?yևXzz8hxqiL?1/ zVū"*:YK.\e8k(?Yé 7Xx?A~WT=8[N@=y\O_ޙ,'6Tl*ҁ63 endstream endobj 6845 0 obj << /Length 2555 /Filter /FlateDecode >> stream xڽnH_!` il"u<ٲaG;ȿoUW5EJt&.b]]W7Ĝ=:eN#<{rx-dr?u Mǟ/g>Log9- iΣQy5=ap<`r `QXuSV2eDf_H*5RDh+ QJk,ʆ8e52yEUY|EJ@֬0^#fNO./^ܞ,Ӫ,rYFQFL*Yh2 7J&㶑/Q]ˊE4k+=EC='+N]G>"\;Y{ۡSkTP3 7I[vi1 k\3ni*#" KZ2.bn'JDJshr(x?r^wN?%x|t6!(yN/GY@CNL^$sJq[3Zˋ:zzKqsˀ-4N#~Ars~8ỡ*ێ!V8ͱ*˂fH5&\E̟BTK.e9),`R ۚf@a":2ufSJ@Q X3:zn#'(H'?S‴+q3EcF9T D[hMy G`ۇ9ZI!&v}AZ:ǟ"fwKYxpZt.>ѳ K2y[&ֲq|8%5OH#arY6`gB]{ 4ڴз,%KAM;_!i-Ϫ#3g])iH9Nuge؊2i3*_Y۬qnCЎt\Rh`;>/\^~<]T3*^}0\~;;L\\n/Up: j[0_TE=u5GZ Au R-0v !v-+Qp7UҼ% ZJn~2x>XQo L1};]Fv2R-u*b]]w|eU ItwX EA6`mg.8*kȆi@3WoO~kU-\||0rPri3?zvsGmd, B"ͻAr7$x]fxآ$E+wGC i({(dAiC~IWX n?ÿS~qDle2q\YƁpLgv(Q,/ax,dAeX S!"p&;,bK3vY$Z,JV? V0/ ޟWߟc XU/B}`؏s}#^N _>KL6J(I>v"3ރj{0$kἶl}v{"=˲JoJul>пb 퐐 endstream endobj 6746 0 obj << /Type /ObjStm /N 100 /First 1018 /Length 3985 /Filter /FlateDecode >> stream x[r8}WmcIkGDȒ|ٰZK=]$ǥ*E]=*ʖoejGnUe H$2A4NBiǂ)X,P%UH%%*$\ id Ò-db+S"t%N}x!JF$Q,LT!KTDUr)[hZ,B;X 0"pQ_ ].֣ 2a[xtA܆7)F=`#岄 :w&]m:8Ypܰ4ƛgB TrN"ɡ{-z=q^S cR:{- 08UAHV)@!@=DùP'$! XGI!"%Q Im" A^g˅E9y^<9_֫f_P ^uLq/qJmYQn”9KX2&_ *qy __,4HYwif3YMb]qݜһ4+nf|>[W󾎛<]:z~r{ՋBWUz?4{}*.?L[$Erh/R\㲀TTou_\Grhsɶᐃ?k'%?_ms)>lK}o[ jkW7{ѼY|Z D٘d]7v"~k=34Ya]sPGgq3jٱ|/~z*U_{g8+:]Z Y!U1fxO\گ*VMVUV}5.y?OբZ󲺌4neZmVղZU+ZelR6fަY,S3-?m%Ίgof|[,3zZ=^gw_j{x]zd $RpT o_-Ӣz8[!VrLOM&'i-qޤ8i4UBS: =5) >!r5//uҥA9ԓ*j4]\`ºS9ɉD(yD6ʱEB$6E%єUbJ{%L O1I+kbkV+N6Ⲍ§`DĐ)d.Q0#NN(.354Tqp<Ưy;'lkKΖ!*渓@>Ք.JCMq5S͘5RӈC:6V442 (JYEwaChP9# 1PpW7` _XƚvM[L7>4E:9|tޯ7m{5il:.ZCMehQk،LUpHwƐ%x!lFL'#T'!DQ6Y,в/b)`6JxyYPR$0ґ!53GL0leKP;W\Ljm 15muTΛ4@5]oԇoiXzYAwXtF:Seխѵ&`|݃ڕZ$2 dn3e^n5`^l(ĮB>uْ,ykkX<qDEAi B hNL-EއxLF( "W*RCqa,j%0wDkRjtu['YhX= KaL]4^8SZ# }ǜ`. R`Y|5VZ۶!܃{;Q<&5V2&MJm.="x /Ay4kB;N!~Q!PhO7˼xv1MϏbG\!V<}r׆QX.S o+#Wx d{q ]C&vXDbOy-MS;z[Lecp@6 $CI0d[k۱vlʜfui]ۉܴQ߮LB(k;7i &O%K{˦/ҿ1ɫ/!cyC؟n0#6%,S˻a}~+QJr=kȦO# 3jJ0 QW۴\a˴\.Ԣ뒱J58H[)lv )btG(*=Q)+p1u)(jv]&kcL]& Dm0WhW#3%,m~q1[x~>IIRu*jLtUp鳄;Ǖq]7Te># Xʤ0n>X]6M:[W͏p۵ ]vt}}@Ï&0la5 [a ǮJxxCe1f& ӈfO&GaEs0nUI.)cF H^oH؁#  ꇭ|@V)@W.#Y 2n)tJ)ߺZ`8H6 L=8 C'Нf44gXC+IUWx.J<|GqJ-H|$>Nbre8RDOGe/[ m)SpQ ,D܌~c?yկϟ,5|:DbAJA]0a`On|<%.z3 Md]=?pVC7gMoi!ѭZ /TYJf|0n476M|vwӭ uvɔ]A'nC=l~k?xE;dsڜvd1!`n;lQZ9~:ʆ|rU\AR_T`qqgϓ4Wtٷc>|ymɑ#W}Jm1MY,AMʘlӦqՀG"oll59̔~\Y_jJJ|GD.r9'sveC7L]0ݸIRX|1|i=lUܽ;(<εן[~8 S;aG0 !MCȦ;UgCjddi5ùN~cvkRWGuЧl}MD-QI%oab:W]-'1/V݇ϟ?;1yЗ4W oΕL|x-Sqli1(Mv:aÄ(/r䶧) s<`8=mhjB@yjOc/h-ylZu\BbDGiޜ_z|* ؒlejrߦKsaXd~~nC|Ia8F {nGH7j]HD 7Wb[' endstream endobj 6861 0 obj << /Length 1077 /Filter /FlateDecode >> stream xڝV]6}ϯ -6@VjvW۫J6@Cqc&{K)sg<=n$\yQAG|I>VkF( \5MQJfIJIF\,(a˾{F?ՓɠQBH. \jp<*I%T 7Pa厅p)зs삄 B湏AuSM GLM^`KfzsNZU,4_qݎj8%Vpbv)䶩MHaIwqPMTE3zj R}s8K+IJh$vj*el q/C݁DnRҪIYF>Ú Kv'u4DդTKJ%z8ܕ2%G`1ܖ8;>WhVJ᷹]@aM/Ow~?y eqrgLmBMu:p{AVfejbT <,yjqdo}l׌0uL'RGh,Kd0H = FȿU +xU kx!`̟+9xDݠձ-CNukBfM|1MXB'0!Ŏě 8;4/]snh|z*l6?m7`PIH8m!w5K@I/{ͯ[PC^ڏr{X,19sGjޟhN16Zn%Gք8l'ۣˈu$ )kt:2ef'UTu+ui<;^+ǤXPp* endstream endobj 6858 0 obj << /Type /XObject /Subtype /Image /Width 801 /Height 602 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 84143 /Filter /FlateDecode >> stream xXI'B/EOzgA+]Ϯ łbA`JQ@zoQQ$F"އgwvvffvY@ IS!0? L*`Fs000000@z7Yl_ ==9Ԕ8|VYnjݻr# ֔z 8|U*FW6RӒ<,K`XGCVwV0j?ڴdm8n\z-Y?[6GsY9;a\5N 8pˇ؁;ܰGb}7Q~#V,()ÉSǮ_'**Uaav驉o=.N97'< -UÒ؇|H>ܶ|2gs7n\W((}# r?}twлAN.g߾{,-=Ifge Xpb LV.f?b役6S<sb`v?^y}͛Wץ_VR¼¬fqFO ˇ 26R||Xx ;!ArG#F,}a-CC,L'Ndd$g8/*^nA/YwiQܢ|O W T}wl}rvyf,:;Hw)gy4X q9Yij4txZznvQl'Ofgdd3Lnk>؁3:.8Paȝ`Y apXCa4lzGE^Ϟ;Ր+7;k׭\h&+\ba8uxFfZBRܡ#VǭOgϟ$$zycd98嗷=mmN W'1b 'r{Y>g`Xf٬9`c2ܿ)4P}gM'; ؠ$CWJ>,Zt!=z a|a4do<{YS=]!@f֭_cfyFX;'$fEƆF1A}󂛯_9IJ/}څKW.;q$:*^<\JY'?t-;Zkq3LYOĭuLbs##֭ib-0YWRZu)IQR\X{/*tIShϚO$v0ICCV;Qw޽/.~׉I v'm}|.fg45jȈhɂ~>tzZq/ƊX)IGNLd6[뗻{Vnv=櫒;{8݈ m,fI7Nk'w7 nׯ] s{Ov5핺\}ªsIfa hz'_=0K^yv1e5jȈu+W/efSSRj낻K*=126Es'㓣_*v[Z|y>Ѩ~?Ƕ /̨ФĘzzEVAWI\퐴R&F,a(beП<}('O DZX@>̦?fWXo^>ybj=#w2r]X[޿--}qs'q̦Z ]tq;L,_0nh=]=1bd8wO/׋=q9G%\=<<]DAGcb1M&eSp rV0Z=3e;<1b+  >6P'@auYS6PPK>؋UiǷn4¢܂¬9=xTIgpM'<ݝR0hbյeg]ڴ߅<՘بg 9b3N4bĪn>ޖwq8X⩃Z A tͽ{FFjG0PYGݝ\pqQR|mә^'||"!8PX>/ J_>/)->jwOwDb=*~{_<-}O_|rI{;qSEC/uf+G|"-$t.V(|4=#c vцB<|w} WG {v:,_tɂ{wt铧mikׯ6YhY?xx6qtA =sic3Ϟ~em׮]tqu03ߺq:G3kΉ[%<pj/fggȘPlnYXv[7gggPW%Ŭyңp-l3o}51 1a{e9殗/K|n\={TLLă0l¹۶o?{\:`y-6:Gly_|~>Mb292Ws`\n--qr>Y2=gJ)^}.i} [fs;&:55 f4lO\z/tl5NN? r@F'q3>jswofe>}cJ`p|a="V>;i#=~ٻo߽{~/ѐہujFEG&&GD=wfe]sErG',[tȐA~ \n$~rVxfI`ҳ3~8|kLBD~QΛTԜ+%Xãz>TlM.v]sw73#.BwZ{N^}uV^~ݗ6;bxϋEeddeӃo=n;x|7Ǎ;Ш̜y[<>5@b=z@/_>cݛ>&۝RGbED]ve] ͳ9z8<
iV8a!#F٤ĀO ه {VAa9^^gyMZxfzΡ0_s'֣b33nÕTY'Ե?DEE&%Dc;qE7T۟=z &W_:xzoSou>|sϧ?!yk43L̰f|pAFn`6 g2nƧM7D 8|؀!~⋗Οs8(i=>Q>{G⤦%܋+^i/"J>9p57a){+e榽}fc#!KW]SDQo|S<%isʬQ[r,nm"&gm։OaG%'Xb 7pC ?,w[N AA\|)$TʬٙE23p|2kss2q='d<abĵ._yeݿ23޽z0}ܫ 3diexlLm94H6"tݿ6vuj| nB~' %na >lp浢F62oI'M+"B,_apb(q)IqɉI1CRYM1Yu衛W#{wp ʊ~w=W.{ywssqtr<`o!LY^&]VHƇXq pp{{s)-u3hݩΧBv:쀁WF߅טO;l80D;#fȸ{?!8Zl =n .k=gX11.^O7wgw7'7g}6lZu=8$pwn`ӓ_/V!B7VY8ϦxCg#.^azW\t?p3nkp "V=cjvÜbQV=CBFZ"(\^,mqpLa# b9{QawB p[7^uᡷ1yb`M@k(א ._xKDoDa5Y````X?" 1twX$ӱس&b7;)(X=LQ`hLV) aQ?,3l }^|r VO 4\`````\b5 5 \````\b5 5 O%\5勞JP U dC )*  V##Z\wDj -'XCg9ۨyQ OD̐- ƷkI*zwv,)h.'vى;,55'StFXvSYT}6MQQIEUU6EF "+7X%NZanA/V=#4E9&@$Xk.2 ͡'q9Ѱ5 _`itlRd ټ.lWxNz!+҉MĪbQٲS#췍Rқ bPe,v`鸖͔}. 7iJ4=-9i4e!뒫zrp1hjt kTZ3{:oLuԸÜC! | ?VxMod\'۩y=7bz#N F 71ZGWyHz- N 0nz}ӯv802>'5t :-LOZ9H<7L\j>Rl 0S/Zع8Z kZAT9-ȫMBX"ewdГ#|#kּhafmFv1O4:h}r \Rfߐ!깈j̪ȸ$ݣ46U_=SNpU8;z"c®;ɚ_h]\_bK`}k&Xd25 }.鹙ɷbɗEDMod\'zR10X=bуMhRFhU@&RK_Nc&T9TpғUS0X`̔v.v-5 wm!0yմ<" t@WK~̷CƷM[]} ڌnĖ/ WjZ^zXos䔻^IX=ل(_>fU*۫ Y 2ʦe()9" 0SD[|5/L^$C2E\!,6SmLAeҺf//h7Oߔ݄FiH ΐ% +M6'[kZEL̺hN1S>Dc]A2Z^_ڷfF.ow}uƻ{$HQ d>Tj2MzX_Xksi8Jv[oˆ"( k*Jj)zp"} 0S R+\&L' q_=cb[`Jtov$N/Jv=ko cXZ{6{%$eexsI`r(״(0'$/Sm!XD"~QWLė!\`}k&]! b +Îh;m\kld 2Al9|XdLs-Xc-bMvNQLi3aPɍШܴwvYKrSCL*'xio"4193֪AzJX 0 T$v"έ " atVx^nzkqnVR:k=w75O_y#=q|kGk(kʘeJ[-% pBSrVkZEL 3V䵾Yub# ˈE]A2Z^_s0w +FmKX敟}oŵHY I9t drR7 a=?xP`5 8dPḥoTASKQM~k,6pԜLBMCF)u4/-tPv9)me@ ŽWMH'W+p̡'Gnه}}z,:wv<}yѶ+4do*jͫnۋx*|M0TSj%Aawشs_TYzdŎfjRkmU*":!tp=Ue4OXf%,Y@,5BsHLamg%X=LۅD reOS)b0?;RVk{nKNwg%ثtϦEss;j_حK[gaFp%; jf˦FxE;HIw@X»-G^ZKX:gws@,@,5zĒdWu+TG6SmLAegQdJz`D4VBe]92'/zHs}dbuW;EYpU`>9lڹrˏ"#/ oIF%,r6U@  ͑?J `mGEbQmJHI J>UOiUXC'/d(avÃD&@FXwhĔ5C/ x>>k_{VQ•1+5o˔>=LBX;w)Jp,^{B/ bĬd*ODuhQrm{;r?QزUAUI՞( ?sfTFw8rCܕ %h9{<~Y}Y'k82cv}L9*ZS^ X$SX999+ (4d.  =bW;{kOgx'X)LZud\ E99E q<=`qCE,aD]_8 ?d"  XyGf(Nk(뷛  @XB,|ַk gnt#M:O>@ @zFXZGUNA7@    :X v@XX`X Ă;:O@ 8 '  $+P5| jNWX @    ~QR@ @,@,0"d_ i*@ @,@,_}#b.bbRԔذ"\! h@)EEW@ n5_zsNNjI_B5Ez'F$ D.?ׯXꇯX( EkQsjX  yy1dUݴ ,P=P$E7ޫkw"Xd9&X/^ J۔ceepWR==3XF~K bX ["44 čpu%n&p"(8sX04$TguH$'CrUN'7RzA_$ʣ;\]H[FSb. ')+*k4ts'K;t\fJTyվcDgѫ߿ rv/mDS3 :#% w۶Ymuըf=CRS*߮wZkӨr/$3"JSRlX" ϗ KD& sWx@Ǐt4s&QOmGA+t܅/ !1pғݛ;<;5y 9_}UigRe$$"(Zj[U]= x78+CU Y#e۱I'BU b%%u17Xq=ztv]0Z"ŋ!!!QQQ勀H?~'O2\1@J9}K-/I0]Lnl_ w %;BQΎ@pP(/JV.ĖD$lWgIz`D4IEǚt!C;1i Ozׯ~~ӗO7k?U_s ͚zGfՎUqqq)D<)<|K.ͱC)@Y  =L:;ooMk ͑nώOv%5MO`WĖSGZ, )"G+!%9?/+/+TE,g tB)YK&b<4>Q^빖-vD*==[HTaa|}^D<3BB)Ն29n|5'3P$E{x ؁sMLLj^9;4kuXbJVb!X761_Wu$(:!75dĖdh Gz=-oRD,aOf=5o˔A,g t]kKdRb] %} ypFV#!EsNDnXzzDI f @Y t06;0?'zݴJ4Ѵ5I9QŘ U՞(̰O{ Y~>(?ROM7sĖ$Q'aa.W)"~zmͨ2Tmp b,q "WӦinpNruԁ@ @,@,X_ڜU!wC4GkYRG'77̙<3A mhÜ^( u$ӭ{ VQQ^?=v|ŲlC{)"=4|E e@XX`?b3xr)U>itrMIW" ( zBlGViHLL6֖_1?dÇfeq0V(jW ( nWQ=gzvpQ>&bLuֳ'`J 4kX~bq/~6+ݻwW : ̌sTC"X@Y  VD,|fo99 }I@?{2kLt#sB)_D,,A"X>1cg:vdO1I F;)Z#Ь_QJPzw)3N4M?566KS 0> &0&grӜ~X#}0;/PčX- 9ڧ#66$o"\ =DQgZ2ol$y,n3@Y.yBlu/ti $8=e@|}M{BQ]|J( N䱭R*؆,2-C(&-)@VGYk|Ĉ^uQGJh ( jE2 Vd$/瀏Q+RTP?yz)p YBHX[z"ȶ'RP ba %BKbbbbjً5k(b~^/ֈpd)j@/{Owۋ\,XhŎ\,7eIXGT X   Vm+3#ĉKSMTT6N?Qد4k@Y?QeD!$]JjI_Bb5N?rz˖-vv 2%G,k],YYq1UbMu@$F a], ֢ʫ/ީE{ba:}Ė*9;;gKX'W_;藠,Xkj&KMjĈwuz5OMCFSRn8`C\%dֹ8S`Ib:o˗$G,[[f:vPn[7xG!(NDX j1j)3\KEŧfEX-PwI&2sŖam4S;P+HXܫDmcmi"a?V曑9h`@HXW P-?ߝ7lr3v|Ut u99 |7"TSXW P#pwXe(yq EFAt|0#VANVvňŒU q/sɕ~mN7MPbSĚ$em͹ihF%}momiV8J=v=b;F%L7Q֟kLwgk.PZ֏?ZifxҰBY}E(i/W{ݠ}Z{ԛY4Y?Z̀6VL| cSUr>W4=5 #IWY_z)8#Ā<,Ԫ:|*)) a*--"A8A(*z54b PVLuuż[0 w68= pt"+[D^IЈjIYR޳av3sDKͷ<ޟ Հ`>`|9?'W'/ӧyf^LA8s/P%}Ghj],b1,ؠnnO   VA,.^dU}V;&É F?Ud$F3jZYa~VǎDj*] UHzG$"g|08xP be,LME1k-fJ)#'l?/scʢ?AHX#}%O "XdE 9ڧ#6X,eg5+--bNƸ!$cĎwD`6b~7Z#f~;w0zE,5v5bk'e(Wh@wLPXB,RaXka![Db"EM_O,]J61F]#rsI.!cb)jm͞C  !$B'?͟ y9:mPy85aLUƱUoxB4jT+@zA,c9&Wo,~|W5Ö(o=4Qg^U:Fo ~*`K|U 2cE,U̇R.m9Xb@zAr[MtW\Y*Z'k5*il骝Y:-d' *PcOY1"՟2T`d    TrD!|AtxN<#^-q8,hės3m1aH"As5{ @ Y='%xIsv{6E;Ngh(*j0gÓ Cb V.bb5v 08ptsVY%>d-5BJ/@,OӣGW~[Y˖ffNNY*( .]",- F:d_ <=Ln@aNqc8\*qia4/jA B3*c.Eȕ++3DXdl?!M:,TPi rLRe sIZ#$PwrE&RGhBkX3Vmo(eN<Bq`~d% ]\0e'>\By['\'OAM1AK*JO'ڴ0RU-Ѿ= :: *bbKM[bg=b3Bdž(\Ĝ(3d}P5Gs?1?1_9QDF'1mÅg#n7Mo|f?3@u B]j4Imu\p3sc  K^h~z;x#m޽ ɘJ(ۗ/1;!Q\˗%/SիΨ]ysRtAx>w8wb5P9 HzgF$G7k׎K1g #ho[<66?{--"tĤ%??_:_[M$WMm8=Am\>%%?eBU'PIJCxjwfvݫH\;ZOoHoOBA2CObbbb3ҹE+gEA~|kX!֘޽xY@M PJc=7‰'zBlmfff򤟔ĘŎW^0*h㹹ÆѹA|RO]P='083M @,!!`v&"2bbmy(ӓ^cnC~knӇ37/!7G***YX!H!LY5{KNQ&M!_n^tn"v.B}ժrn/ݽ3 9s&\  pE3WZvfٳWih^e>rriNFQQ<;F<ӥNf˜q~Լ-qWPܩ9dt<$~ׯuv{U tBIiL>o߾d @ VCr.bVS 974ba#ԯe'Op.|R|**x6}lX%nN(́<37lYQJ*+y2Ԕ}ݻwF; \犜ܹ:Ԭ3Տx,eٴtQW!I–D lP<薅Pٳg# 'Mryݕݧw qQyq%tr⡲N'nʎ׏SB ܏xyA-bbb&O\[6/,lLUH]_4i'[xIL ?p|l|KLHj'6,^C j]Q_TJhwfNǎqToq k $ p&Ghϟ?30"_#6WK+:*o߾d;axx˗Kx,NWoU˜*_-**+U 4XWӧ~@j*e    ߾I"VBûv9ߢJ{7UZp R6d'_kkQ¥H?HP(K[pn uj@8sc}P_\x9f({=9 i*+3#LsZիWC>aNzzzeϞql` ʇ]U+Y-.,{qe0V5@}yٟ j \yq!ilh}|0F-"ZWsQbj{pʌnM%Y#03cټ9j*BysC{ .ѣ8$11M+s{?ps @,@,@,@,PٳºȚ<Jpͽ*`T%FWWVؗ/_F!\"$K.F-oBC9-\BuJ}}Ya=%z߮WXXX7ЎPAXX pvn4YfÌ'* i  EE["!.K$X )Ʀ%GA>~ҠJjiEq0&'Ī^,abu6'/_G:U')Zݖg|Tִ LPb+ H :xE#ў\+22G KLL\M ?^+#shD%  TS#2WSsNeC˗C?bU@'E429Г[k$'ZwGr"&HOɫ&M9),a֣ ɢC,sF}!yYԪZ(&rjTu*F* i ŠeҪN[U.u6\B,b [":X"%Z!тKc!Ya9t:U=Nyy:Xe7Q>NNPAX2b0 VT@U[ ^o_^8:Czǜ4jKLLB`] lӆW'(5k0qu@/n8/[9z޾-p0q:(a!Bo:d{!b u zj5//up.V\V},b؏Q7,GFFkLĿW;{v_J`T9s%|J{vN>+''WPZ=ky}T gh9lCA+ӟ _/(e4KX֢ƣo|s,'~~rJ.B'h@,5p?ޗw6LZթߊϟKWtӚӞ(+ H:ӳ>-Z|6bIe2\o9>~OO\oLsf~N</^W!@h ʨ*~kQ FѲ#b(G9ڳ y4jzU.MxE95+0(\DK+$GE-5^o,a:b%]>#Ѣ'Kʼn/'Gdf?`{hӆZUm(r⫨̛0=c_RWT\9s܃PAЋj=s' SW/de:u o30k}L#GrߟcVUxbEy={~.ƴi:15 Y><ڪl€NJJ CT}fF; APAX`XXO rh44ְ_2X6cF97ʼnC ]5;̓^^?|kÆzz30!+e~zznȷ(-n׏(+j oĪ7C5 z޽#uLLJ}5((hs{{cQ5Bwƫ[ 1x˗/S>wJY<=`۸ϟ?54ɰEqmt_>gɺ= 7=bEOOas&Ց#0[4aµW 㥹9OfTa ΃@X`XXb~ڕoUoD/qo̻ JFQO[D`&qIpLk0I a?1de!ᵤww.e]|:k%-"QC* qxTQYy ۈ€uբ q`o}&^ZԢ8q<O0FF< jj2r@eusۓĕ"q}(8 WgϮa 7˯Öܜi +55"4%ĸҶ-O eekY:?;DDy!3^d+JD~ϡ#i? =ږ0=hޜ EOdUa#>&NϮXfVab/Dܳ@dIj^!JzgOJ{:::o^ŋX!hbYorg!{ {g?>{Pl+]!vE (e7@v҉ :~qYwg^6yx>eYP+HӂUZoue~/"k.4bɁ˗l$F!htz_z kpr22"!K97E%k_ ظ}BO ٍB{K-JMS*RĢE U٦F=<?D7KEew M%Ck [6,1E] ΃2\ fsE!^PkHu2_f>;l L oOwz8thѓAlON2 K.@ ,#uönk<3~ RBx RsLGߐPq2"E,*?]e{e67cx3x><^[q짵V-2kTHX"l=' V- ̃ȝoNWdS4ryHׇ W!qR>)ݓ*f4#O乯|`\&@y8Vx1^ĥ'21}턝A6d{ E,X(bQ)V"5g zrsrto9i$z: 9al;/Z!\K13Zȋ $z(<_x;3F,%Rʗ8ĥ ,]JN4b[޿j5^,Y,x OuYr]^u)RUtĪ^JAl~I0IIpEu7s=वiֵ<ɘZֽ^H@J5; h/R*8NCH eBSr&7i$_i}LZ Ў{ג>< dBz&/'?51!{| ~ _2>$7~0+b!|Çg%ehvcdh؛7b.Y3lstI}7Cb?< iI1`v$@Bh&W "w}3͌ !Qjid'gC,uC̸P-* Ϫa:#T-BIY FJ_Ew3RB:?boSQ_vUy~ ^f=W;R-PĢ"%#tUKm)66`΢3aU1֪ ^s9iL˚].gtgݧstE'8&m'X ۤ _*#"d V=-'T37l{jdzn יuW;R-PĢ"b:Z `tQKSX&UK{W0_ħN}{NDGXeLn8e~vf]M|,WA:eL}8ȝ*X=gW٘a5c0A,c|r:Suy: :s Ky5U@z|~]`#;fk0tj`B?H_BGo Xu h3o 6ӱ@> xxW'z,bRĢŪ[cOpH2bqc9Wx0Rpk珺 ϋ|Rt"&|+(Oa/л2CF%F)8~ ,[ rvS;{*gX+RɑX/.Uko|}5Z=ZoGz>Kyym[~ .{Z "ǭ~ӪSӠ'Sa4f>^6fVX)8`L&L5IX (XEi1g;0}AR˛wGjc^X,*bV+POPޤw&l( |8.o">ivvwLwsL:11{MV)^ZħQt!,R|eؘ3榌cdWČ1fő`t'Da,c)0%By!TS%E蕐|8LJ tEhj\DDF5zwFVNmN/:qiiqckY{ڑj"Ba,߫1JG5J_FG2Xz)j.B,3_WƉ_䆃aUAg^WA%җcL,|Jۻǧ_Ē2V)> $i]g J: Ftu=x|e*/˞b0_a(f7;iӟ axi(e_ nPVK^9 GH~@HbzBZ1R+~X>嬌u -pwn3>g;-PĢ" zx;-b]-ıX$P ^%;T##W7v:*NeY VMVUt.OǜTL| KJTARn,/ֺAE`ppФ 4&FOOQŮԭ/0w./ `|*%ÃKjhҰb**]QQd+y ybQEZ\װ;WFoϿrXiyﮌc_vɑ#PQb}B#zs⧮U:_uNgr)F 9jp*w)6ׯ/<bƆ8|)w)feEm[zZɎG>^Rw*j/@@֡E"E\RSap74l3gYNvjSCaժ=ͨ36{/({CnЦVB>TyÇIKt Ϟ8eˠ[7"9B#3Qȯ}ĝi#srD=q} 'O:2N_"#bKwڷ xnQ7~%Ǐ$HY3xVs +R&z Qhןs! r͌Csb8u >%ը?&5>$=w.qɰy]Ga^e~уq` bb;xfφƍɽZɴ'XT)bQ! ^]חbB{wE ۉO0'tAČ[EUHhZ ex+V$#(u3r"}.3-[I ڱ08XgS?p ϓwr Chp|ѱcZ10;TXs#fCiJzd-)I`+ 1[@Z[=XHY|Мhk(I缽gmMRkԺuP;NO\F/ ٍBK߳:g6;prwG*E,X?J;~= Xы"`Oظ NV0M-g rEڱvK:71#7E'D J!?\P4E$OboRPjjڵdʔZ-(v)>q<%K5ecΜ)sGŕz7JUٰmB++ F =xc+X%R>ss޽ cWmQdkzr^u~5-e:V޼ysڵv;䳤ӟ}W8X)p“'%r0M&3 - ؿ(ٳgLaPmn(B}H \fô "Z{wʕ/^h03fΔ "ܦw'l˖qzemիW_~-/_H 6/^¹s%Z$ƤNR7Ͽw|۱ou2%88L_jb" $&۩PĢJ" LQ_3s+OFL3]t~wtq0dȡ#Gr&"#5KjbaDR㎒$%<<|5j,իugܹvÆrv>rӧY}L C4۷%o"[ntw/b߯ڵ}| )wܸK|YtNB\,LTMTn@ ֠c֮l)S_.ٳďt\Rrp;w$gΘg{S [8t97_jl>}7l8zƌP`ik@6nS븿7tMh~ f̰MNzt˛6I4_LRĢUCQӦ#.Æv;qBXDr?~l2g&GHLǃ!\iioϟϦO>{xTqu=-y: 3Wp,Y"uOtɑm^^}b-Z\DϟK0z/ᐲb7oijt:D5#:u'UO7!x01W`/\kSwȶ0;]`3`kϞO0qiT)Wܽ+5kPv?qbFf^^7aF ի/ Jj~} F*RUGΒu7]Kuڶ`ƶժ`ZHJRBgy;f9m۶EwXרK82y>EЛ7ZxMN#OfO8R%ʕBIHHhԵ+c6mf,XǛ>~?QĢJ"VIO%{yMF&Ԭb w:8;Ɠz%10yF>&o:g9 sjigg Ui Q1#5xJ ItO;szP֞=͉~]ƍB}Ʋ;&u\ɞ7or23?(H 7lӦgnr-[$.ťKZ8{EGDp]\/m!!A?(N"1{|QTi_XQta7Odeea60ܲEMbkTHJHL [iFE;9=֭F߿Wil6l=i?Okmm i.y.D۷\\x[Ȼu뗆 %SʩI"ŋ O5Bƍ}ծ*W _"[`}FK-?|Aǎ,ea{ڶejْ~KQĢE"Vɓ{$3sMd*"ָ8ƍ۷g{:TI0OaV}?^ŋ2,!I)ˍy:[h0!VpqIG efJdWeڵS0cTD unݪ٪U%n6rr 0<{VD uOrԉJ-7N"j8ԯ޾-u s.8~WQR-U]d,KK?bU%$o{Rzlרvx,Ǝ{X-[?f~"ljtzTV=z=Lܣl"s9FWkBcz .㮹SX@#70~<ٵb`˖\ݼZ5%0#Cb(g%B?=sF+z-^vlM(c37'οA7bz.N"JBY(. MkjQŒB~5ԏOԲ_Eo+YBdq2..(%E;Yho^&p&1##q$ggvLKϬAα6kZs" >(W0A;f46{5~ORdK &XOs7b fRSSЦ "E&heohЀ=q|}۶Zbϻw#NQK/uA$[DD]>ZЮ[7vg앩QCyfE]fU7o .ykar-LIa/8zcrUsӎ;9eKb[س' P| (J/X%f(dXUJ"x )i?!B>OLꨇXO!˪(6M?brߋLO@۩-|%Kb P"N#b(޽ٮfǎ#Gd&Y24=vr=f {N/˶0)I&lغU[8&cFEI,/__Ĕ7Mgի9?*Н/wnn$G-X[N+t' b aoCÇZ3((;qwk9K33bc1TҸ~| b]߈+ X%v 8 婈(b}Sk d#Csnn"oorA8ֻ0X_!7 \~]۰{w-qcw77A3zxw-i ڶe{“Ҳm;\ÆrsE_lѷ/{lO-^\Nutq*#ȭ[ƍ o-bSjBɬ6K^OcS4?~E?'*71T,U$$D}E-=Ѻ(VW& ;]ը(Snz81 `V+'Oe5Ra<T:4BO K7mnGJR*jT ]Uܙ ޾]ft){̺u}t1be$־"ڡdŖ+tDže[8sfaoutt*~LeqJY6d{(ܻ ^lnjQ<턬oԈ}0+(ENIA){{%4&jQK56K^j`+Ա {–L'_CU2fPdEEd؈{-|%K(b9rD}NzJJ=耶 #c-.i?pʶ[ow ZRa4C/>NU7Z8EңGlܔ\Y=&ujj}vJ llدJt/"JV>zx\|mԩ1UԓH@"jJ1522R#:kl  b}[… JÜ,^MCڕ .\\;,ܿ5j5-顊ǡyslw-+/M,Y,H ģa퐉2E桜/X!xE&66UADע"֯ʶ[mѾ7oodd:FM[-8qٸ! SN hƸ)um!w}gϞ5Sqz T.\ĕ+Mu цq|_% 3ǍcK&qʛg.-5\\zs<X~bzQ6|XM ~kXMP&π0jUzmڨ0zF1OJl)N4]'/5'{y6{XG1:9OI>%N4zXOݻg;az.D1Pb>3:ԩ-Ӈ=|Ν;g6wzv܎gY!C{/\(BnژOoZ5olfCNlEEnuD,HXC Gau7~Q=`ebj%­[e>T&>3{ Cj}T)597n24p ,Ã+Q9KTWc/|&8QpCDbcczRB_}{.={}|d[8tha|QYҏ6FK\o*Cl ke[ؽ;{LAϋ/ZzzjR EqБ[Ї-:EX;7wů4;K)p{с"-38iid:?T)с= #e[ 2D+OC1Q:3gʶ[et..Zόoa2t乐K[/77A5Y奼т#H$*Y^oX'e[PYػW˗YE*^+UJw*޽ϋWɉ}v1jwOBr+5m}l ef9j Ӿ?ؑ흻`\ӯxwӞ=ڷӶ\%7J=c8jbJJҾ'Of{Ǹ%]RJ91*4jfuʕ RSE"E.uϞv/_} ufq+\*BqyN[nٌ 72n99`j)Hz)S[cV1;=6Vro۵KIhɒH8rsc8 /_nJZ_)yrR߾-3YPP-><{du*"UXJL~/Y"k˖JXVC^~=cI82[g`*)//֧8lucyN)ełtGgg-{3ƾU oIfaV,XToߴ)jb{~žTbԏzǴNNlfTeEd_߿oLjSEn ط%T$zlIRr:AYMza׮l8Y9]~~ڭ  HK>l" ߫W^ǎ{I1=<Y_cNJwO3G_GX[xrg;q01nV=&ky@zP1/R~Н;ڜd>pAS/ E,*?1b!"ַ<%\QD˦[70T\$N `w JӦ[ myy-Z~:Ӭ,AUW)>;Q)++jV}F \/VP\O$/^7H##599Li/_J99K$119(.2ޭ[{Fbbb𧜛 *4lfM@<&S*UF"##m۵҆_[`d޸vjmMnK*P &"ַkY3G,""n\] ù9EUexlBn޴6_ g-Zy3crCtү{QhիV_)Sp_.d{."'ZLc> ӕ*e{ 78s8-{0*#ŋڷOK P$^1Xtq03OQdƠPEC2r_Y8nЍČccG.n!ҹ&/YRD }}pS?z$񑉋**n 33q>06*CbTUlxfdOTYA<땛۠];݀"ŠA7lw N5F"UJ̞-1$N hj}eeX'OVo֌SeګPt}9Fi\>7XTR*AGnQ\غwm(2R=17ix"ĺkŁ{b^\Xna>mZ?`}d:r?4R|"fBӺ{wntƍcÇX '7Ta_bf!7bt^u߾<=K2U==/T*/3KXW^#GZճ06ֺsgjYBn\61Qcay70}͚v(-nS'[[K-Zd>U?dS*arsGjrd >}Ծ ?5HRHNNcb:w. NK؎ѣ?CBd *j!c -Rwo|{R=(E'[VPpEǶXkSMtrVyq& 7kdDk &M$,!OsisTvu-մquիIwr ;̙3A,ҋ-DDhbaR!J+JCBBΚU7&tVڣZ# <… lnL1͘!l2&~ Q R_sss/_< SK]tة!yx\v-W%5JYK\&xA?}|P s06:-=ơi͚M}vTZrDn+..T]>ss|,[&5%'O=,p޽6cشiͻ]9(O$"F(bQEǐ co/O'to7ۈV+IHݻI ql'Nhn!E+gșUb2nOǼސ#{@A P$|XWW!(oo޿zˢ9L녇CÆ ZYQ^coAɢHY&I簅5&/Hv7oJ\Z,EcRAWW"`ܸ_O='|4XV!%uX;vDJdMwॷQ^6KK4XHKbxx6tHG~4IM)U+)H+UD A2#4u*I]V &&L>vݹ#8x)1v=5$e!FJN %&F9x<2`ږxJ EjpcԱ/FO_e#V|:udV իVJTbqԷgD0bz;+OyZ;YSY A+A , hFt^8XFooUʾommɲ *ZEkW{E,% 4oJǔps# /7w,M𘋋t&< ]l،d?0XDfd ` (`U)׺11dD`Sb|ZWȄL&A]OB66r_?W'O$"W}`PyLNWrD=b&XU0 ƍc4OL{P-Q:Xk֬EbQ*!5ɛ/BvYܹC~ϙC\$iǾ.ׯ-\XAVRA؞n@*iWI2RΌ 7J!C.rѵ,2,<?bP j7m=aUy̌@˗˗L ~Q (ʊj> %usXTi,Eb*$r}"55%՚ ő$Z33I#bEٶuBPjVw-<+ii$ R$*à2vA߾ĥ%[HRX޿? WXZP&*{Qӫw|͗irdv!EƵ-7bzSwF Ynߟ]}#)bQ+ )bwIH S ŋI3g\v>%W2=RgJrYЖ.tx^GAXxHp Õ+0f/ pZر.\ 1 gX޾]p[HbzڊQ`p`v.H|k?ï^Aey4`1ӣgI=с-ܰdR !|sJWRy(bQQɥLrg5(y=5`)٨j#M$<ܔ7K$i7 O11LWRq'TygCR G!͋E"E,**/XY!>T5Ctu񐳁q _ =r$,՚0Uk+hob(z k\|kU+ _kqd0Xx(Q"RH?~R0XT[HNՌ,: xU1Fi>bamfLay`m> xGƵWVqP{ N-E) Y:ܳLKbwqrfA9E"E,*?ܸA^Eu=ƒiiSt2mR,d;VkԈXTnؐd">}&G6=;`CRĢElqBwTxyy2\Gd\dPaƎ$jݺY]:LزК ЪRBCld<ͼO*vwJ:0! t !EAX?E &s!#HMed0*@LG 2!+2/zK-+@\8}:w&AYR~`Dq;a| )Z# >7?9b}a"b8FxEzh+# cIдإxh"͛KG/\C"_=#g"xl/!~$,C#M ;EJ|ZP5;WųAJI୰MmxUF퓘zeZ d8&sSD.ż z7ݺj>ZpvA3 U-d=42-_ n Ta\V1;0Sa"BBXK =,sRPĢ 1Y杻E8ʓlDj~ M% dbmg̙Cvrvvhg:'T֨qcǾ}8#C(_^b.A7}O%X/)}+@0֝JIA}}*Vִ+Q&ށ-kYj4yA]3dg/Lb&5*w܍}sV+m+][ǸBk_HľǖOoNjcolݼ䰧ZVz@aKKӢCG]>_T/?שԩO)V2N |RUGߣG- ;Q_R>K &+~ZGU"(i`:eˆS!/KsccI1D1£GD ͯeӦY<|Ь b_DeҤIcI$,xTodO +-TIf7B0NX|m*5[oRLr7LCj=n2뗮Sn~NƎ qGFfhO_Z8hU]\NฦjY-Z.uLz{n{/'iRz0\xvDeUwߠZ|U ug8飰kh0%G-νu􍁅Wp]m?(|AF |(R|sD6g8C!<k3̓ fMJK>!77JPJo%0B>3K b^!W I1@<4Ċ|ryUKۺ^xcFM6}"#u +O|v&\^XB16\~Q\X|p5A}8J"bxz7co}6(smT17Mx|c/yD,@Ny:U@Ou<׊u[޳SiKy4@,y=l L*;KUt ws+ysWJݩQ=H\9{&Nok7o7e!CG4,ULLjAïXh8ٸ *7H=/\9GrDzfv=!l L7ݹ'J=f"Y:IMHO9ۃOi\LߗlRZ2QОYTA,Be7]fTH)gأa.LWR/j|߾eR YdWhڴ݋o"ba}SV/Zn.ԭS+=,,)LgctS0dn BXW2Ig_?{%y7J֓ܽnДV!Q5qKFbXu%uv|S*wJ >z;"bLsvh>2\?glԺV?kw}y=n#8Te,߈C:ɘ˒y=J&+~PaE5kysslW uihaA(f$+3H{vo%!o&$3FiK±Ґ[aC:,Fobx=@ḽ̌-ߘܫkOI 疻V//\6|N-"LW._ϡj]+VN57R׶K vzJ?-齣KIqgأa.L ɩR߹Ҏ#[e$L^ڶ0,'B,CX_curb=|!x堸\NqdțYd &*9%> -GkԣTITI>m:;thƒ`S8mĊB[y3o%eKb̂•s!9 rs@ 눿.>uz}XO"*E)kfQcѾ K:w\xV رVׯpLH`XZR%܄ơpX>+ 偰H LP+9ZtR*E,XTI,sN>) C&m߮ `<^.]Bnn#ޛ4aW]ĺ зZqAp ާE"E,*T !)\&܆C >Jzk0|eN(utNfG#WX٨Q3fg8%A}oWY5}EsLҍ2oadLXT)bFJl摋 ?=NJ?`]O ?1?lW{@L֡M\k&O7A|Z N;[׾8DX^^̬=X36x3Vƭ()l*,S$rg &A$f*9R(bQUF cuk`JKg_K]ц.Dena []tbջ42&9lt *Y:n\|9RcIJ1D:FNtK{ZW661:<}1W%^90yyT>t`Cb*)N ORĢJ"*ZG, N[fTؑGV|!DhB_Hl(PĢ  TRĢ=p"T%cKyDX_1:{6dm6x~3<5mʺH`!bu;~ 19' wAƙ8p8~KA}(bQ|Eb)PuI,)?,֗=VVڔFKZu5hƳX_/kplD| sY3LɊ Y }~2hkNN6E,*by; [eb}8h={Q&T@|dnf&MR,֛D>CVƧXپ•o [N@-Nl8T3XT?b)/[y2:Ynח 8*:I&OZmį~ї23y>bX1b}X,R%'=-S$!1*NRĢEd"gQĢ=s(XޛwGa2D?*YKHq+ bvuf <͋u8 . w_DD2 |#,5/y_>l`0_%Bِ3E,XT)bQRq"X>>d#*-MEX|0 P%/E,% E/[c͚/?EdKx%!CU4lX VZrrrHN.(&&,b={VyL !/) r ~D(bueC#{ux[J(k= dm/##(bQ)iLC01Fe`v$jֹZ@a,w̙,_hޟ%^9(.S$Cb0%ɴJOXE$U,mġ 1EcN~xڹsW΅(a;X?0bu,2Q{( ?->SĢRfo}0B=8!T =>rEN&쯿L=/`%'4aYTD-7!?q, Hy ,>R!޷?bq놈^;e- C}Q=O>éoQ{((ԲF}vJ LR‡Iz?e_*x "$aB #b%l?`Z̐)oI;0JXc c]m'Yۿؾs{[Z]VAw"". Gv ]|"]6!b2{K,N]L"ԄD@ϞGEE]{<Ï5/?_j*~U:}bORK*wOP 1 s 1~9?%?hw^HTA~kqVJu{U诞]EQ{(2dSO(rzvcȤbɷXBB}Eb ݥ׭yW9p} 4nB?~ۃO]""Z8\}ѐ/˥KP_At))yMi//ᶶzfXRyW{T6FwXD؃kzT*|`jɁ&Uҙ9ٴ؂XͯbEXIw#hy!Z9\Թ3KuLގC]߇A6T.~]j $NO{ Ksp9Ml%MvĶr?7b.hTkpGn]Ľcvä"T~ֵ+hKN]Ecck(MK 7 Q_7d2 #L!.L H5F[# Y98(|*KdcrLE3TO8][P_ԚL&=_L 8t~=LJtuYCʕUTl~`/?bN+7Ckqغ0!b!bmA )!“ɼ?Hm[)VO dfkҼ2EL&JNZ.)r@b@$JN!DB„ZKQW,U^dޝG0QmmUPLMϞIP=cx1XF \pxZzz_,0;4W-8ψXXP_BCy%1z19YTckÔ) dec`9F嗟a wނq$HLXXPBÕj5z)\dƭw < +W99 \ft<,Ytwg<7`:J)" ?8IjSDDt̢ҙM0_ue5d]$ә ^bu03""&D,D,ThʶdՃ2dlzR I؊`mVX3DD/WNkk ,,,b.')[’{{٨V(+ӭi; do-$i>(ή$E-  "='& kjYf|Z8<IJ,UWWotmZ#aZ9FfTߦGNT1%%RXjLVu9:6(E,h+]dMt|] uY%=[5 DA"A{'_rU^x<"Xօa-V"ko~fZ<]Kmԑo`_4% wM0_mdGK`- ]~(o65cj62kP(iȨ * i}aBHT_m~қEj9,ҵիRKvBh#YU]E?w'IP#b}׫X:Tm$7P_vS=gRNL_ 60w.~ta2'yԦrʴ?Gm_ggpr1c6 ӛ*$UYfLk9tk\UbKneJeXg 0Ye^Vb[ IޚlXXX(D,D,T#VaX-J(x8_ Q{ JlLll:F*[,A>[,b!b!b!GTu^sTV&*xBî]Lh 5j ꂕT:Iu4NoSvoiz[߈y+'nn^s}7ҭi\>)%H @rGL)"ן"sMl'*c{?g2A xx@:08iJ"#Q{,ZSƜEṶZ2BB3f pɉ,b>CcC]s>3 ;׀6 O1' ""u7Iyނ_1nLIa?kk+?hAV=u^NUgLW h ˉLa8=4bkzGW3tqٝ98s&ԪF r-N3 :zN?GBT0бg#GߠjU#Rnr_T4YљPEC,ZA4 DJSxbM!(,WN߲SB ϩC F oB"$5?,%_PE(xC03b; e2ҿz޽ )D/Bv(;JP7O-WGi`;wy_61KO_VtkA0Nbw÷"r\l/V=;Yo ("#VMB"!䬄R#$TB\% v+{-j뮤#B2@H/ߢ ֻ+s)dyn'wXh*/1 H_<}{ S罥7j誳UF,^dl3fLInnSz3I ʁ8={܄*KYax{_T_B<΁LHL$,T1 g9'˷ ,.YRXNsnQX΄ .iUX<.[(a6CN Uʥ(׿mdj௿Qjj`ES70>uF}W8ѩ?hSSf]\JVT02^QĊj9+))wMudm #ԗh,]!)FbBT),yE@,["# pzwuku㪻$7nI8aPe 1.zŬb\^^ پwfmlZPj%O\vܠ5kҔQxnZwcB#ժm8򆹲\̿6nָq}͋{'d! tᇿ2<~8e(*#_`E,n;yDvV/D3#4Ti .?VBs0٢XMh$cۏGG}mb;s eܜ[_/㱇̕+F.?٭Ս+@S,!k;8۵+7[^i`O|WR%' Jc$1pzJH! '+٭SJ H3 ,4+! IzC1 2ֺdXkNq'0'>mQI 4:epg,^\Էz5{\m9/[d;qC %_@a·$4B J?(D}=X2SV6[b%'d|D!b!b4XvDؠn M*xQ{ʯL2do9G,M"ߛ*S 9 ۽Â%?.g`, Gtv^PXY $7QCSD,׌Xh*E'Lll82v*UǏ,X,ĢSӳOn^ݷkw[r hss >[Xܑrͅu٫E} Wrrd(D,D, QeHC*6AM~ctڴ)܀CH5(={ث}6aäբLj,IĈaIʹ~}?!ۏ?rVֱWǏ/'$'!{9q*P_ UJIb29.Zq=5<}^Eϟ79tt.G#d$I:Ƴۭˊ3|+4dO}\Y9 $Ő;0J   x,U:uu/\߳O9Er^w !V0!Fb{oۖzWsx9mWǷp_/?-7B>4hR xUb%"[G[tE#ŝOPG#%@BU΍k9B_l:?ܬ6̘9nb[V!mkd{8_g^Ip; r8de<֭R~ڽRc^ Mz;[kQ_ EF#~~oآ;RЊj8W soɃjy)>YiCBFujjj^׳֭+SO%C9HiBBB}QBswT,a{C&D8R~T]iIJMr#FYAD:_)S̸q*xc^ 'j{zE ^bS_[BkUXXX^Ì0L$ ^ '!   U XRUZ#j}.hl(bIx>!)!b tm EsڮιrUZ~ʕyffrxSty#84eJCqغPXX(D,Է>9tˬYA,q&m"V߾JCK̈́TqY|։ Z%BzRw q2{i$CH̑غτ43+!bqOJ\5,8IňLYb3L@IEUXKEOd/8QP4_%ҟ;+$yF!b!bJUz ̃(fy\ZQXjc=5mw\.C&sы핂)bERB\Ɔ c{i2=@) >>HlQ(D, !V9* 7:@ABswTيYbTJ//_^f+E?ܗ:]klXh6%^r^"P]u;ӈA o) 6-?Ke:81U67$20q + ѩxݮFFDm"…ldzW=<ԋ ;.և oZz`ǖ-l{Wmb%'dCb$t+ WPU:bm\>FQjx!J$ıB60ML go@$/;Ǥ 333VAC|CHʕewU[AIAoH xAF䤪$]>簫Ovz )n-[,81 U| ;O2pLF{!!-,2?(BLwBn`xE bsB\pygBskW=V5|%'/@nHy*5ĺ;؃QO^(AAL/BFl Y*MĢXĜ9ٗI:7":Bb@fnR8!xЃs Zb_l-a-X޳DF@GD,D,T(%Zd0)SXP>|_sYZfߌgOv +$8ۏ993|G]ȪU >̚iV*++[ >(ِQrPX cP(=%I1x{d2Yiaiygs+Wr(fO`"9?Ƨ0Ů W5n6 8 ^7lhoiYLzDH+=۷pӬ-g0!   nWW> 4r$~Z47VĊ%7Sӎ ܑŅۅL`#ܺUa3gr/vᇉff^2ܼgf=R @j-zx'!    u71gowNCrײh]z[&]ml6L·X4kmݮv~Celn> p8x#:ԩ̺GK[;qxikwڸŠ Hu!,CF   Uܽ!YWa"5tƍΝɉ١Sԇٱhh4xC]+aÛ7oMH~h=kP4ôj0ffĻ+) /;ueX+?>r™(FE>>`omuvn) S/9ŵoAJ uRb!PR{7GLg ,غPXX(D,w>R` uFKbouXTQ!5g܄D#XI1qQC4ݼ'PEAw!f`( Z9@ "0@?Vʈ3~J6\[p1Z#<~ ȋHyׅP|YЬ 7OؕiS00P=B8}đ 92qPXGV*; Fc`:)<ߚV7 y֪292m_y;njf̞`Ʋsm?Ihd؎<`"HK)~vT.BBB!bG89Kqe&@fs@x a>Űv-ԩٿgJ.=?X{iE|&*.Q ,iDX U+bլ +WB42KBZI   Ib{14(9Ax>\pX )ϕܻЩF,|"zU'Ϝ3&Ya$='FsT~_t7n0\׶-Q}{8nQ_@ w$   M-]Iݽb'_f`x03{aHx4/:8g^@rޜs"܄O=J9(Az޷nQ_ҒO۟"#'wݕ~}f{WS Й((9(D,D,"{d0q  NVI3>֧5qiƜk4(LǐTY'm/wbOmq/eCOP6jj(R)S_B҈/eqAేG[wG,BBXA ݶAvJIJ&dka! ytױJtБftM> HLR#b *XMo{nVihxWîc,xL;5XێO6z68I?f|j,A4k^g_ޝm4+-7_g6|qMi|*шX'^Yhj^ՌlN:F]MIky|I髀xjF-ڈs XL8%Pװ$M TT"h &Z k 5Jt ևTEWPP CH&!X+NHoItꉈBB} b*XuK}Tm)w!b)b%l%4Y>A `DGY#"  ͊5tw*7[,Dk~!F-LW-V}cmKbqHE99εkaPhA `\x`j }|:4= xOPKW!2ߐtuU؝r_C׋^VZqqy/{f7+ BkK֚/XBB}&'E$; <'?.Hd_ 1I# 3hйa«d:nV۳8_7{Eԩ`fVHs]яf&[M~q&IJ'd=_Jl>JR/D,"+._GH _Zh5~qcC ޼ z1TPX +9-/^d> j6q|`at Ն[e*coc.%G]0~P" i$9 9 +[b/"ĂeޱP%X ӧ˶ߝ+fz_:6P }UH` j@`Nux៑T Skԛ+MךnXm@^D<Ȼ.^߼a, ~xmՋSw9~hBMFwpVbSBB}%sUSS,ӧB^<8:3n^cA t ܨޚaPTb3Qϟ NR1bĥ_>[%ec|^B\s1>8aL+W !-$,~H@%$,xn5cFKK8w& +/&$8B2 g('c8z4s2Ģ m$e.'|4bm@HAk78 i5bbJkQ0 4  Kye>|0RQco=֢mUAsWWhO3BS&&pXZ1113s?vu:{ݶcUy2)4;yrftllTzjǮ]vmW޵͛7*gv ͺ,""  )ݷ effݼN6]j-5'ޱ VÇ;4o>y|pZcGִi%] 94={ƽtښmZ쩽e 9u}jirO~-h[Wmp΢PXWl \ݻu7n$IIH6 ҭLyv6 ֭suqguhFάoobcд$%IA)#CxM˖ Vgо=>MAAŶ@3HKK[fmZK aj6?al дٽ{8sQXX(D,TwҒ5*SRRR= ȧO,XҔ+W(Ĥ^rro{큳VЅu+7o~3) 6TXSVZ KGUmBwYff__u눈8]:u #'/4zC@!b!b}_m>YVQQQUZ= #4Zt괓nK\O ?Tnޥ=H3#բ 7ze٪ɓlG/_2v}͞].ZjOȯ jтDGd͛_f; UXBBPQ q̑_y}Ӧ?EA,: oܣvE =VɯDGGuIEb6m߸vwۗWRLw;W>|hѼ9IH(nܼviۗ!(ٕPX("όQX%WW12u1wVptLKy/pѱN ˱{wA!UZ`ڸԭ[a#0 ?QUU+|Y}{_E֨Q8QeX+*"^ Ԣ3}jJXܽ;\f ?~,p\(9Æi^$xӧO/p'~#ffmlK1884>B nݺul,B˨2A, -ARf9}=cΠ &&v  _4Em{p[g#ylܽ'T0&FL<=k`͛La{ܙu# c89ɋϞM4>Bɓ-b{oԈ=_IK` ӽLz>%I   ,!VϞW4XNNrW}.8Ntd^YwwwX\'Z͛,͏0=ZVl49pą:iVJZBJ ;|DANm]A$;4ו*{*BqAsfE8rq62:~RC,y#Urʼnm# Nj"JY2s#yImמXVB9K72b`{x#ܲE+6NNiCR!/WbGw%R fذ/_u?yGlY6]޶i€XW%;3^@*Jɥwh̆/bjP/EWDĈs2noXW ֞ M&l6uwi+..bmP<_wuOMvlWjUY$|y9/81a"E"JA^^%D,7;bL)韇]͈>ߣ$ի.]"޽Ҳx޽(ba!_k&kd#iS͹EΟ?{p0?ouΞEFFZfzZa,ytb1 H'Qsĉ>O=PeXOҲekMb@WB3Cy}"&(5.gљ|vmFҼB^yz_!6->y|0b]r  UJE'9bISm2׹X-ծr]z6=zd9~|EL{ T-?8rH^lرlY/룿y&- 9I"ZH|Yz{0kEB5b#=8WJUW^]wHE|^urq *GbU蛓JX[,B" ޻wr!PgBzjkƃ@UphիҲ@ŋ߅3ydm…AAAy_>ihׂXr0 AKnw3ֹHoK#*b9,R̒GGXc{-^",tll̀C HG26t[-;+7iR)y@/jƶf8i<| B}r9LPQwQi,Ajk1ٹYh+<ѕ#J/ޠb%>'<[;+9Q89<.55.|rD!""*bY{ǒ#VA3ׯgbݺ͵nݺx5/jɓ'yOznnlHb"!,c`J5w#!AfmۻhׂXhYZ ж3o 9kPVxd{cвR2D%ܵkƍlժ]ySml8; ׯ4zkY|ANG(d]qvN0\D#4??@f>v^&&̀Q(D,  UN,xzʋuL>$bZjl5j6Bnۥe՜ ۦMY4mٲv<~\ZaHRR49¤M4 2  BB#q+ծ 1׮_71Bgŋ~Oguq)l59c|LOxrF*tW&#/޲cGhp?E6Z]څsB!bʑrsbEqϻyS3%::⼦44[5:LlCfm>x ׅ~; ;rD8''j͌[gtuA٢PX("hJ`76$.sL= R~p _wIS\GeڷNYFF\B U ?=Aߟ{GBB\H:yd[]$%qVhWjLpxcv*y8Qa%,#LN;;!5U~vMG/!!VNN4@߾ UQG=9A~oϞ ?p1fȍ!-|)KXX0`(""  Unuf\۶\iӬyWGׯƍkֳC%gltE)l#wB%Yډ?~eϞ=m1|x)q GDQE#2xp# ۷oh1m4d>"P(D,D,"P E~ٶeKɅMʈuau֝:5C3U rqQhKHI^4|MK rM-qB sݼ]\t:ˁݻתmw*JO'w.]jӦMA5=]|!aQ(D,D,"ij*׎jƄuәvr^{޽ TotjЀY 0KCܦZ`$Vې WѮU]G8 ޾eVͶo]+hrvVhE Mj=vlɕo߮jN#w)}}Sw Q|U4xEaקXlSX(D,TV~$zy` Z1Z.BV6xm)4%0=z(4ǘ+.IuFJVbG\ض6شi PO' nưi4Kב$elk:`c%#@Jӈ5JoƃE$%D,"VM=:< 7 |btvm>DYY0zrU_AFFQaCvt*-YeRjn]سLXYb eNUKA& Ue,"V9* w.Nox =WPEծ]ҏVagRzEM\B VՀR>{ɌA8F>-z ?F,ΜiZ^WT@ww{dB:+@ AFd~b13G/Ag0==&(T#V(@{7}JǓ'ƷXJȔ?I  U =~ [+˒ʈy@,)s&cQCBI#r[}~  ~%|L!ˡzu6,R/j~.A:*{L12Xv:~W.P 3r#lЀ<*E8۷wچ"-ny (pBlu =p>.M uz&=&xOrq0Z('F.4  UŢ{/>w:R:աX8}=pssaV0t˦YCG:nVۧzbar[o1RnM:s{+mLPSck([2m']8Տ B~o8|瑓NgN+Vl:_3g|ED"ˌe県BQeXX*'ΝUl{Ճի{eC "51v1F\YjtQt𥔖Ơ`3/͸G)ݸlْG+WX\]٣ jb4xfP4_OOkGD,m>/[rupb b!b>W͘׬N+B^v-(tb#\8x^졦$Æ1&BeĢR%ƍY6at4ltwތS~>ypp[*ie <{3u!|U u[< 󸛌<9*?5r0( E /_LwrP{m΃=u+>Z[1MAw.mݺx*ax#w3l8(X"~0p 5#V}= 6y}x@,:= iԨ!=-W:X<',0iЪ1_Kˢ7ų0iv xD֒bmO/%.B}yfk߲q5lsF|2By%("VR߬oENuŽ^ fcФ,[6E kAN .5)ڵ9sl|{Vf&ͶたęCU5Pr Y:u .N~NN5vБ•4XDØŋ^RS^́`W䮑hHj)%D}EX05~OJ>+D,D,Է/OO| <\~Mڄ.>G:u2߷o'Ql,ذ}M9 ^J\4w{C:/EBk *cXoG q6o_yzV>(UNKlwN)W(٨s9Xa皙Yu-$itčY[[kk뛷<-$⑬~͍ufgoe"TOcmܵa{=ױ@`Re{=]S-;S@ˮVˍnJ;}]m^V<1{@ES}SVHco%бpThUr[7UȐTĈ?+)+.Oo^J|EXoGK~111Mũૢ#Utt4c~lcǖlA E@*~;TbUӺ Cnʺ֨ef\^wZ\~xﱆp"B*v+] ;[Tk~mƺ}]~w{ui`7 ʷjvKety. ))+.ol\Wt.BԷlb>}n੤b!""Hֵrse3Ç -q:Xtg|Fv*66~4fm;[씕GҫFZ=6_WF@hlO cTxP>g^egMy6_uQRʷjTKP^ob٨QCz+G[,7%]ÆxWƌ1/XtZpϞ8_/-lOtF hs uHY'x|ry}ݲ{볶G;w`Q :7{V{Qc7{QĨ)F5 Ƃ%$VTQ"H7łH8nkHgYfffgvߛX4_5\}Ԯ `@X2EMTro, Dxmw+pQݺyc;nL"WYtϞߧ X{\ټKRo YϊhNMь+#m;EJE.ٕ3m-Ynk TDmތwFfY'p {B;SIMJM:z4)”"^bQ,bi;LM' xԩ#cI܍7LSK:(V4=r4_ڵoѼyDh|Ha;5\uȽ:zx}jvFwJة qIs|mz˩/y nQ:Vgybg)eSYBN@{kdbPRS$_}#"F[vwyWRիa\nܠO"Ͻy:JĽa](A3(eއ;)Gt6=F̍II,xew3> _ilasm=R:gæ7hwypq˼fFlK*E# :#hXLI)tT>o[f-061 ɓl˼גɳ nx366m~֟j[5J2ŻLiFkWdRgK-d!ɊUEC GP,PټYb8ߌj(R ?|^0~3) eRO-yEygQ Ro-ŬY-hEN%;E)T4;P,( @bժæΔE J(̸q/EQ,!cs,BAn5yE^K2h !bAXP,*)Ǚr})G=D,;R_ENVch6q:1B!IE"ڀf[UZ8Oޝ.zMLhłbUҰP,P%r9{Vf11,(TN 'cOM%FF9 J& $3`łbAXP,P+VǎD$u3};GyGs0A}kz!~( łb³gD(;5Ν&+Kwˣڻw[%K ͛u: AVֳ]4T;.C@a ԡ=;wYC׉[u4iҀ۷oH[2dH-8$Gѻ#XPʭX~qZzZk?:z%VJNqiOcHJ萙RA@@a֬"J^Uڤ0**#pDz+Qf;Ɯ?>?ToSJ iժDn&p`f-*!q@MSKn ls㙫d+&7eask5.'9g|Bgܬ7eo_4 Ghyؼ)C\Rbe曹XŷtSa]K>n`ofT洔χurL]F/VU+m;p0b ާbn崔 G{ؚx&6FϏ-:Jog:ᐅ Ik}RvIk餏oWN-7YCK$س'.{7Duѻe@ TFBGn$^:=UoЂkIw6q'muޣ7S"7zsl{Ǯ^&^?9SHo1d ~U^, \x1:V}^LeDVY]b57Mʍ\fzb:^4vLM>٥r35G  )"RD;;׊ Pׯs*3vػ4`N*z AޡY@ T&ܙkD\Q X8$Gp e'YN3m#YdQ5nb, MfXMy e(tfcYF|}FRqMZӭFjBjRV:X (* 'HQX+q=WtrɆ yMdK 1;s=jY ,\/~4>jBȓ\UY,lT?e$ xmX,Ly1oR,sj8oi=ۋCHi35GzŢ PfbFj*[ٔόʊ=͍DGks =H H~ y5SCbxG@մ3-޺z\ԤԤ@IbҴW,֔X3Oy,7Nrn *Gʕb)r뒝<*7SsQ,JcXr`>S&}\\ZFV!W~#Z幒d tdeB4j?O]L}>?.?9~;n\>=Ω qI;6(6c!/ގ5&:m)/2>sUXn%Z˵kgZ lK7AͮG@T,V;[ѧfwqh4~{4-" ##F>_Q9?lp%̊&}'ZOgN MѐCDI&X:qAz6l6ױA[[-ղb-L\x۾hi>YǡcO&|1%N#\|rWUʜrew3>j=Q(ɼX*6~ߧ n8}*R+I?x/kscRUnX,&#>L-ZY7g 9mh&E#UJ:WNZ~>hTp%t@M߾ED~[}7&]$~"Շu_L,[PN}:Ū/йq+oބbAPBvik?(n&9$*Xv]fc,XT2Ϟ?wOBiϵ}Clyɜd#%Ka:)d 9Dh;PX˛ bP^^]Bw'%>lX{'VVOnJz/nkniLϞ %g{jOFGo#%[@XP,( T+SWz&bI(,XJ!vv (u0-@P,%۩P*ܾxPhYkoc:zPu 5l*wwR ]]wTbI-cg 4HOxHG$y$K+{0%=}ig-mF[@E?=S(׺b܎,-'[sСNvvJϋUb5E |I֕]]8ad@P,ŗbo^ز-ëӪw Y|YM8,oQnz(җ8ߋڄᛶZ:`@TzR/+c]T*ot0ëT_:*Tj"韎)kB@ S`ք{rQ 5rXk9n=^Lh;b56qfAn)f~ݽtiuW]\z#-N;|̜/-Zs$>bAk~i/_-R 8IU}n:zPu 5%KJ̨ v(ݻw})r)mիǏ߰?oKT]ź6)eɟae)8R:3mi)=4,w6OnRxF|Y(eį4TOGʵnXŋ5m$0GŢ#j_N~ rb:^b-[6ʊHC(_o:2=l@/R+iX-WrKŜȕgم"R@NPy/qb.4TOGʵnX0~\mĉD.=f%-E9;ggfh8y\zQ>-~4(VC!7*V.{^P֥%MdnIh45b s[֧ZoŻtw̽ܜ'U-[@  fTC%_*#̩Gs(KcjAw q 3 זPϚRX_|XP,PMXRG⳨͞7oO5!-xW`bMXP,PMXXG &Kk^şLl*Opn uzAXÇ5zaÆ}ڳ7n r[GŢF-?UmTPB%kH^( TVQբRP}U2K%†S[%rŚ2Մ͛uT,»0J2$|G$^]E奬Xh pP,(&>-jTYtƍ_t^B##5"j#||_~AkbA@5C4m*^t!ˀugӞ]c)jsID}ʷ|ՇCW P|x-73zN$'H7 ɻwh pP,(>L&w dѽ[@ٓ2(fM%E(K^x|6$ϞVtl'0Wc*\no}G]S,M:t @hXhfcǎWOF(x"];l۷oׯZi/V (*{~9 DXCX,rjfѺ)VPPPaaAL_Cͼ\ _KkޜW^XhS))VNk_3?~d'|mbKJӆr -k"3CHEi  Tyh7Xd$좵 +^ԎƐC-yUM($75 EmGVPPPNNNQYZp0%=}ig-mF3CHu9  T֮%J61! w5T}X[3;LΜ9NRՙ3gAWAs~–ul^VogjlšO&ocٚrJ"6sm=ƿΓ+X=1̮uaUE|\}SOJ53C oO;uի> ە+;G6mJ1o/zK?kjJF`XŢ r&E˘;?[8 7psd ?^zϘ8ݫG3Z4*w9yo_[ֵ>I|Ă.}^dgH[Y(V];=ԭtLP;@5?V%Pj'_ˈ_Q虂v:.^$=zkϸ~D/$[7=ptF,##5ޒ떐?$G(?ŢILL y?axQ1^f)ddؒgv haeW.9z) GT9X[X{v>ٕ/]=()kݻw /iX-WT<Ŝȕgم"R@NPy/:uiEg (KZE&_s,W#Io_G IvW$3`fޓbeeeرC_=zԀa5rN>|bŮIn]Z:]Ԙ:m~Aƣo'5}y-kXueNN\bJ~,٫}WT:z`bidu@4uocoG)Y }27>ҥKgϞ5DXJ\iccR)x"^YsW.Ңћ{n[זmılӲOWLa!՟DI t2̝F-^X虂v ֞9TlD־"ɧ햋|1槲+,B^)n< z(_"ڽ{a`Xlblٌ2W(4/0Q}&oHhvH%Y"T^) X>T&zN U,nW8 #ZP\Z@uJ3≷?b[޷P,޿bdd",XKVQBQEub_Idܦ (Cdd~s*bPj,<#oH'Jo^,ޏbܺu?8s @X,V-i- @*Mxx&@9*X,wEc<(dKӿ2TvyAx J˫˒!GLߨ}:! k:^Yj2zaO|wGR7QX@P 'lFܘQ%/YK%ݠiS$3 (%'6N7n-}ۯ;{[7 1NyK |9F]HҬYi..ԾT/3u`cm2lToJGj4dZ(=77o|RvTrۖOwHDYDTJeȂ P,łbHn.;VY6%wmӿ?N*D"3JeEG##yvWGBCC̲vep˂b(̛'~diiinnTF q\萛k۫ץ˗9zys<-ΊEՉ'b4#22,Hd@۩@J:똞mZ-N|W ڰpQΖBe޿*$zjhtP0JfYwDz*b5TTܬgEV+*iY7o&}fcgIXrM|Ōʤb"ܼ N,ohXaEh˗t,JY [ֱrxuZ!_?%ٖ=)G`1a {^[9|ӶS{D'2՟. }as#EoR},(2TIXrٱCWPPPC*=݀E:o%ܹ3Q'NW"""٣e)xڔǙY՞#owҥ |ťϭǙ^=ѢPI_Lb߲=I#v";E2Ze^\Zlܯ[s Vb$P,t>K=&ҟz|ub"ظq޽ſ9 j׼2''~.*/6N6ӂieg?Kji3|_=Qh@Б+tT,>Imq?;QC;RR5q"ZZY~Eso1I(?xg]mlKnGoJm][ǦvO>%O_1cfWT)VK t2̝F-nytJߒ](Yk &Kk^sݚ妣b @녆eF|E({[jgGQ=`chZ3b-Y@J˂_ʬX~@@CqIdzd|>bR},_.}v_/, ~*b))S 1+(bg5V,ζmۮ]S;wzAeS,ښ P,Ps^D9a~]SJN&sB( kX! ҃4( &!68t]Kk E gX 0y;T3za4yY&l'oP@XP,֒L'HM%Cz<*ZPfL~z+hN(BUQ)'޹@blɸncoZ Ջg#`r]0*Zs1ƒ-XVn''l򓷷wƫt(BP,zU>bXXB'zM8~8|hOafME5^ E_~XwP,JX4mڴv@i6䩚ЊxoW.XGf'gQhX Q,MD@(X~Pš`iۛK]]LD]AE_ߏ٩֖څ@Ţ"K@@M'/|aMQ#z->)+nII7AiB&Lw! T5ڂQΝIXɇ3*˗ɀkGu Jp [P,PU %ޞ٣(W*'H%lؐ}Dv‰ 2}:XV_ |bU&6$ӎKW9^*dB*aɜV GP,(5UAdW+=C6yM~&[{.VMg3IFJ>Hb4n=z7 n?}?9yf}8\5i-Lcb2zѶ2;ɗf+s wzX:(ԶJUUWMpRy * O}LNK2h{sAQ­'/g٧5w3Z3Kȼ#ꝭ\Wf+.<@嗨WLmtݴh|Ԅȍ^휺|/o$,qVJb쥣cەi Guq2Zrэ JG6å.K4icI-t}ooqL2ķugĕu%sZz3l6EX*W Vb%dsm4>b:o*S4/S͍KБ_eTg&^?9COvɶ3p2QbB{m' ı0e0WOl%sI[ۑx}K*e:0WLMtRy * ̘g\}м]IL՟c{ͥ p4ݒ^RoakiGZ  ue6ʃ T~jH{iXJXw#8†&ܙkD\@:wDwro] OIna7ƒO[Rzz1EOh *յs%z}2/۱FlA2G7OwMoe*VeP͒6PE)%O<6mݸm״&+ǘ7p4t*&'Lܩ -wEc CtR qLg-Gc78CyF]{~ŘƎ]mMyvGk\#|EjˈWV7ȴ#LJgKed׌2XqAtW\Tb]?v,lite%pixkxO_O/t5t^4̩7VJ_ Ljd&-n_?w78FT~,#n5i^kob9.TmOoɾC]RF/feP^,-tv+8Q⭴Jۃ@ *FMc1|ғWTΊ[2U+&f:k<S]l Y4^s,SuGa>j#JYk_*#+f41޶SĭD5mJš˚P݆V*j]7ϴuW:`:ѿ{8~S@ya2gV7^e$8AtR qLg-GQϚ)xN-s 򡕪Lw0Ȏh:a>JY_%"+f4<וe*SՐDJj ߵqVgybg:;"bTfc!/ގ5E[m-j2̍>.ibЩf~9#ul4pĤԤ nhe!:W,?toۈ5b!le/ׁJA)͢' mgv%6NrÁ34Aou^<.,JVdmr̟ݜ- ,= qIsgPcցW‡sbSLg㊩Z*b@&c"n$ǝ_9ZϱL7syt*QZ{NĨ[٠9#ӎ0+e~\WfXLM^z*zb~q˼fFlKo\ж ulwyir(LbL#gKn~[?4y,scT0tZeL3|$Wi6vlХq[U>}oRЬvV#~j^)}2grݟmY+C4ϋǽ̅lnKADژ317&%̏+0Zrی;ԫI?+=3ouQ(nO2U+&f8kr;S |'Axc+ Ɔu> stream xڽZKsFWHVnNb{r- F" #ot^(]A`_7dWwW߿qUhE/WwB_cbu>p+ygnVƱeuDmN( ҿWu%={% w>nRye[2 WOzaz\ |Wg1ó/,0f+={GU8mVxx$[MVfyM۴5lnZlM~6n%})q7Z(kxe =/+6^{U&o?F{Š<.j7#~c NO.Q4{o^Oo"@ ZNhkõO}ziOH <Ǽ7=TVYT@q=F %<,APL*yZW"sğ`A׷"!<Hݵ-[8o9`tp6 'r\@ ށށNd,Td|A;|dsmxeRYSV֐\ǵ|/soՀ )Eum?TѫR/) ,so U'"xw%1.Ob q<#oV,^ݱ*mezֻZ5hMfO'!33xj@e~{ïonݼ{^Or}Ӑ=g5=˺F^B/)ꧽF+Hu_W*NZJڧ[Z=E-8 y#d߰pT 泍Zo{e48V:3m˔yD16Acfm2֬**@#Nȡ6f6;XV(N ej\7)!L<&! „b1!Grq8g$/xPHhI -,=v3G܉ 5IXXXHҩ&F9hwj/ig6|mPVFttt`p2f N/5KxY5]l0lP:9(@V e_y=eCi wIddm#]9 eJ] 7J9 n@Y#%.d'tFѨ:x0ZZ*a~Г㚠.fzw)Gu[x̏3wj)6o漠xyCC&KY@*m8/fK W _^~A=TҾS۱ߏXѵB# Ď2:D" ~.È!1= S@aZ Ѷ.-6j+H'y1ۆY.{{)Μ?Naxl^J hYTG0+k* .wYqDrFsa۔. k_i*UBINq5݌Yr32 Tgd1aJ;.;pKpgb7`gqbd\nz-D/3Dx1+Rze1qGc8B/!k4֋\wٌbq}M젦"E1cRw_1y`@3& ̨"usI;< *3XxgB4cC%u2L6eg0)"qFѰQ%&MUCKp$ W1#+FX\8*7b`ڳbOT2j9" jY,!Jݠg /EY8P5ϒ=KWpNZk{,aWj"%UMBu:WќqAI8 Ak][_hNɞ;PFa[ ALPi4̦YoOq6N2&r'rx渮Ϯ_1}> stream xڽko"R\ˇH|v}go}I+;wp83΋#l\]^\|Vr'bqxb턜EAdpi09we.5M=>z.(I oNo?-wzАc^}qB;E,Y/>ĝ־w8y0{G@L!s} >:8I oqhyA )<)fYE5:%Џ$~pu|2HW,\e1(D+ TV+X nQ;mbWl!o‰AW2@])PvWTIyh>]t`CQZ&:G":8d4՚"ꢜŸ!Հűr3Ee$ 6[s12ZBzm~.YkiXwxo]7ʳJ^/iFxz"zM@x;x HEL%\W#8 \5w\O|@s>{TnwdRl t@R*\{MS45\Kūoo0\\njQ~03T4V~8jJYG_U hږfaB'7֭gb?>}B\)`>}`>]7z ,*ˁDˑB\ۭVmR`]4yj9^v!3-!+>ÀGXI[y9Ƶ1 g yN$ԘHuYЋ> zH JN+r<@@##E08V$,Pu^0I P&^ì##qJ]ylNlbr>bjajRpԛQZ6gnGEl0|Hi-p.$MiR'[::1hqiX|wB)< uА6=HdvS k\M Aec5"Qa3m*%@x?H9k_9q It_.ԙPc 11o/&th/#w8' RbPqy<;6nv)kzYM;2 k Qbםd笂ff"Q!`ͭh-UuE6NNB鈃[@l~<J^قGQ1*VnbL F ~n2zp,6E@5YTGJpвԿP = S].lo%xo/ws'~1>J3HDg!.sCn#x-zapnl8J~Js1[64& ?Rvl!k8(,m5!9">7xup8AkDxkci:Nmg1?`C!)69&_Ų 3Ɲ#гֶ}(Hsgâa`ړNqmӈb3x >)BZ(lIF=RF~ׄWs흘QL@%7) +fD2 j5leBնWFR0-S82[njC CCD{ަ`8r.vgENF{9,fU|mly[TCSj#2ɮ%|mZu7Q VttzIodp]>G+\=֜gsEPN2li TC:M;F9V[6v.7 ,/lHӦ Xe=1E@WT1ԝֽfܻjGs{I=fFJB_ ӵy 6`pׯa?ݼ}`ïc{!ݺ_Ŕς:vsG4?J.| q)ԥڃ`]W㶙u-)P??nM6~% endstream endobj 6972 0 obj << /Length 2315 /Filter /FlateDecode >> stream xڵYo6B(a"!t[4xsI z],7Çv%IX!9y}󜄤Q;{$"'NΜ}! )-mX,NȮ783 <' IXl~ ~r<⧉s$+'}>Хsu3{;cUJZQYaffӴ Y+ =xt#[FEf~^}QZ +=s\Xo~/[E_~({wh@o7,$2͹-&\h⺨Qu5lRЌEC’ˌaJx%h `l)oU-7ĵdmnI4f.KCps\JIz+C;;F$N1 'nt0ZQ;cX(.Du߉Vٻo^xUl:cF&.vFu9rfqn (xT݊-D%h>:l/0?tu:"!~vP= r,Z|\ 51PFRJCTN9BSDfD|\,e_[VvlY342XtؖPkQvX/l9sh@?Ǿ=*0=rpQE&VC䰬uB}uk~XIHC%W9eDԘ_}.UԮeu#J^0ZLB!Gʼn.i#gfwzx8N~ !Rz.^o.̨$Lx/g$t]57{m̺: LUpěBN]3u™\ -H B\~̭!G igu7~`Ы UQ .16:r~%3 C Vyɫ1{{>f?}PH[ MAclH|T` tq|.*n+JӧOs1@H,7eV*B{bh Sqp$!1Rh^o&gA_J`;s#K L kbˆ[gNʾYf,Ȑ]U_5}F"owO9.o铇.ۧ:R`vLP ݭE+ SAF6 ts嫋S10k_GGDX ˜$L^[=l;|+јG-"\ip|H1ohO7#QޜXf~%? g endstream endobj 6856 0 obj << /Type /ObjStm /N 100 /First 1000 /Length 3552 /Filter /FlateDecode >> stream x[?&_zȪ"<d; /$gv7XfGsK,FX^M>UHvL;$-;bIȝCFBpPgPN$w躤n;gG4^''3P{`yYYH%dłϨ?2F{#/s*tl]Rڑ(%S.Ω1d]"#Y܆uRLs6xkzcRrUk@btbhbL5Y}at ^ph* d#jC~.774~*J%X y7rG+T'%osљ D lb"1ɦMXFRFElReŜ)1LvsKN  + [L6يKV?u98w99{ K 7cBc ɀ:+H*IPHn9A;t%SBR\04^5F#Y)I2 c)hk0(Y\l<ν@eFe~b!G^<*@*̙ΒsU Ǐmv'hpbӣWT?8?76_6/x~ƄCOPo̱1=?6/ͷ}avT_#~\t-ŒHeD$t&PP?[S ރ7>Iغ#=(Eߔcn+r^q{~^|kiXk:B?rSh1n44ڸ~~~mfʒ}yؽ{,)`6@H=/n__:sov"v%qﰼ?_ |AU;̘7+>(t;Γl0w!^,_aaj6eov˱C>WmFk ̥y aWmN/bĞFJPUy!\ٹ?R>4` :ZV2V4XK,ީ^mb\S뛲#Gw _z^UƜ0¿}|L(>A=_<&Ǫy<0gb_ &_8G4x"N%Og5vDN[%甠%KQ]եQK#]iyt*`ii4-Tө;ii+rRfi+/=KfJ}*ܒr'tTDvbw=/C&O-tlpʥK]K{8t2$Y$׻7MRJITkk@ 40h3b {Œ.}y a1VGo9k Ӆuc&b$'[xO/u|gF];q 9?..2ۗgO^<~ş>ӳv=]O!#*MJozV*(#gEX6za{=0G1JW-Ж6baNPhBIa1"s?QojYxP4%/OqI\ľ,I9hu~ɐG m1"\ ~RD1mS8#^!bb} \ G;& !-xx7/v="n/vm"g1ﶇ^8{S؟# qGC9"F@?+9M^a{G0C' 2l4Fl#5cmKjSd$D!T( CY?>gm\&!=x_>ְKH޹SS+ORi=ۮqD =I{rzTi Y$$R|M8Wt+)@q{<ҔU2587 #N!d\P|t^rB @S=s8Afo!c)gEy}>nl*zՇl|C(ƪ)!< =O^l:&1IR瀚<`9GG4S1dIt;4rZ cօ!\Uۚ IfV x۬ŀI+\hս qCp#r,S5qMt\xvd !n*Ė D4N!NXinZSCEٱ̣7h;=vMTxj( 5A b;YQʯs{п)~~EՕ>kvՎ.jA;hȐOAocH|kZJQQkXDM֔ہ53 ;XB@]6)2O0 w_vc1sFmre*XzPaf]qÄ|kЧq=0BBJqx Rŗwl?6W8gzb̶_ C#*af8}/;/^kQ5QY, cq\胿!Aˆ}s EsrOUs윦!iZq֦?g$ЛhkN7Bm٭{2B1+tVήzb#JkDNei''FBʔV4s͆0|T:ڗ 端#QRϝ;Ca\ϚҘ hEﵷK"n+ibB)W%,N&!d}A$ 5~b,[woʭmm]WJAP\]}RiψȢ>`p0y>td.pzTVt妓6|"&9!ʴ`[:,{v 0YOGQ11^VlvsSܖƒc,;ѽg485R.)d]>/+9%=|>F)f߀~vȠ0ƐVӜoˡY^du瘽dm qwT=Er3*|e(Cl,;& v c_}Iܰpt=ۅ 5uw6O͚؇{e^6ɖ>G^>ȧ>{]r endstream endobj 6983 0 obj << /Length 2069 /Filter /FlateDecode >> stream xYKsFWR9UxfMecI HbX힞R8u7ȝÝג;1Ks',C'J$ \;ݐybf(2_wf3ܭ*S:+"v'=DH ή#gwYOg^;z 7p&`GpI8,Dcrs&S]^nAkUvM_jF5]П; (O/.Ép_YJ3UiF?\u"$f6yjo68wW mVfh7n~0q6@]mB箢ke6eBspm۠T 5pʼ|~d`I<*#*Xqa@Ft" jKwUUAENzbEL=8.#Jp9L]T,6ȣp;&` .orq׉͕U>lM9>\_fǫvF޹WyB?"&Y~ʌՌ<҈_4(M֦|<my^ݢ:>}Gu*pҐ$CA%| EBirCg@,#E pg#=ܬk0i _~4Λ,*b zCSf5U%Vɼlk؟0x;Acg"8/($zq"pxrVq@߀aZ0b^C/"p7 =G8#\iG%d"39gnpfJssh,X v* L5id;'Ų@f/s72w4AliZmhT{kHp]miH 9́cTB`VȺ pyK aQ4X SQ|w(1𽟄7uwor*`  I/ ۓKI-4ڙi/bCy퉬.8!WO>T:< Gk +E s_b,< ]STCEˈK&@pty[ja3ɑ -Z"-A4(@CP!Qzzb{?V9Jq9av{3. u HCos" F\+OkpUr@)&VY{6ojAstRpj,vLD+ūDY5 4G x$G6(*3n]ڬAFۉOKUVmV~Vgflk۲bSCə΀'HeVN0xޱg_]^HF6|u([S)DKT`[u^:G|:G|ba(N9[3.4iZQEAb>?r_]ihzƀ%B!f7 $52 @0e3tJcڲu5(+>VNx @I߁M,ϋ܎nk霢Ɛ@85$,BuvhO }Rr{P[]1BDc1_np5Dh[(s-%CWN*np*32ƿhFzm:I29~ܤǼ˴نz"dC٢3إlY W#dC5U̔\4lJ> stream xYs f&:f\>4m?ԍfT$+|\IU+>X,XWXazusJD*TM!oWژЈֹJmWή7*I|q7N?MTE]}ObUܷ+,]=8zHCZa c f_'CYUR`i4ϏB"u&WW1RP^|71`P 16egwCۭ7`ǵ"r7;wm}h{@xw,X-ˁm$_Ksbk^n$_2̌!hlZŧ-yl(Q8D 9{^b;1J3#]gmRe۰)ʝLr_ k-#g` emG4&Fžh @D~v쎃=vV=ѢP-}_64qlCG,uSLᓚ87x'J:wLtC%z;m~wESy3S>fǭG 9\8mmyAuv =ۗo*X Cz/ SR"7\"D5\=3Z1KqqZ(Vӽ>-c{kWfT!d̮[tL74qwM*We8O, QA ?`v 4t/(h\6qmsG#lU53W}u?Ʃt.ЙDבe{ EдBq_i-E2< cHrPv;ۢb{d֤muRؼ4)0јzgr${=gl1|:Gz㔀#W*/ϭ.NS桉d$+!Y-|iS<|h H$,;ϟи0<;8&)9Yc:x@sMno" .!sOgx=ˉ|e ,J$[IfR4{oF`[IO-lepv]a$gG䫩:aF،ؓ @,~F׆j3^%_ׇɌ.tr.Q8]hcCspܐclOoQ{mQ*\8R$FW3# (0K5h0SZ&$T ޗQ̾pWVTCmw[im^e<]Bx Hˣ-ϓ~|ݓP} 0H˩Gc2>M{g ø#%646v™&yw''D X#~a?@ i`H$lHt% \8_ CY?n(C"[2ՎE~+p}v%PƑ*1pH8gi'OiU:.얨<-&A R<|Q5Ag HBa%ݪ򗵋#dv&i)8.# M٢~RHBl\%1mlŦLY{yw{uIա'|$GCb3° Mw 2%"ֶz$j'9l|Qd ~\ ޹~5c {X]9w[jmyWEpzfƕ_6hi;qΘ$;o:3ceޝJ?CB!r!,<.KrW6[IƝ <[G[;`jŵlGMC  q[ۺ-pK@?5#Bb~B\2vL !y?h^8[W}Fp[gċW!m7B/w|P|BPwp[~\0oHeRS3,;˜w3,"R?,ϕ08cA)"ׅNu&qi5Lb ȴ>=C3"pKN&""g;2S Nτ Nd*gHf)g/uqeJgPAPG&(,66"Z%q\Pc &|ak&c_/q(#?ZH7b  [{⏀׵ѕ>S$%Q۶}Ok]~Ƿ(,+Ec endstream endobj 6999 0 obj << /Length 1067 /Filter /FlateDecode >> stream xڝVKo6WP2s#ۤYhq"mVU=C9W>73Ȏ0r?y9{w'Iiǒ,$a4cdƜ,79/DFs"lE9ڠ-؍)Mο,?$Չ;Eٯ34Pd}=adQwҠL9e%y}Q|"S6D܃2VQlW8lDz_극Б:ۢS78,jq,V͜(o?QO7c<A Xy?#~ãS`f@VGk'a X^O+2} []Ȃsi]_jpL6߼ʖf w" d }kJpf(aG.$eT8 y5rhSu49!r}kL23>W?.͜kmu`%4M ]B*ʸD]n*Pq`duuW6X|.G\'kICZHF VδO4Sό2/B(~o7$'{\QpW:w*P|S H%.K:߼CH@b;sTdbk#PN 88pr.I9+a1"ޖ/ WJM dYCk%B8ܾ Ýf @niv95h.+6Ǯ{.C%ux}x,Hb >aޛ4y4hq?OƉgru+x48 ^+kv*ﭿOD_dڗ endstream endobj 6994 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./starpu_non_linear_memset_regression_based.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7001 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 7002 0 R >>/Font << /R8 7003 0 R>> >> /Length 2566 /Filter /FlateDecode >> 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<+ܞұ> 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 xڕTKs0+tfc'Mڜ)LFf N+i8%h>U%#UK\HaIQՠXfCuXyMIeHlk,/K9FgDA(p2To{wer2ȸ;-H(@6 f,$2׍@=\!f7( D#1nUi=\͐PN;`.KJIxm{ o 'gõ!B5t!餛kpvԅ&3{S,kn(N5Hit7/Bu`|s\愺R CfX x԰=.ɘi klęC#wM;NChfO\amׁTb29 0&TvLj5׭7Z ǣh$vSkBF0 *EťMqJKikk=.z iU]9wf8 ~ .v5oZY.37(N2Xڈ+rݫ n+ oz  $Jiv8 K1O@X:9 endstream endobj 6996 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./starpu_chol_model_11_type.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7014 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 7015 0 R >>/Font << /R8 7016 0 R>> >> /Length 1931 /Filter /FlateDecode >> 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 7018 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2600 >> 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 xڕTMs0+tf, $m44!0-lM#!:{i|z [U %G0c @A!iQBPVtk*'?l8D HR> K1"Ͳ f$6xxD`c|7$قb-ր.@'\-d@B󌹀#9}7,[.)|wpžf +%1y]=8>f)Ayr'"4u#V$֝F2 7 -10\ZK7jtio4J91!xqz/xz-:(k:ObZsmM_b)Lq?D1C'W<8٩lN ]Xj@5N.ƶ_ZUeU7*:!7DNth. gx&n3m)sO<]9uQԝ_w'[~)mixtykx]r0,iA&,qR {-[ٍS&|3sGK9_ ,=> CWZV&~Dy7) 0^tI?̦~wWCJ_OBY_ +few+Q`J0 endstream endobj 7009 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./distrib_data.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7024 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 7025 0 R >>/Font << /R8 7026 0 R>> >> /Length 27803 /Filter /FlateDecode >> 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 7028 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2497 >> 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 xڕTKS0WЃ=dsP(Á2c+DcSJ}WZ%-i.X}|ʌ<F.B0RZ)If "Tq2CT8&,i4M&YjE&XU3&˅ cyzL>͒ 8Fh% ҮGF:]Fe]"E)iYH{r&,|nPQ֕Bd4Ƹ8Zirvo#f2T H{ lllG&4R3-n&6}8{N/jNj\S&Վ/򮜊t'GidonLԎѴ֌T9~j*EY?db4OLo%֣[ޠGiL͑NjN+q]f<}}R;f2^s3,%t-z7Do0ڌ16;0aP_CωWf N`9ifV3,Ar~nk?K4H_`;ˡ ;{"9{?rQThUxr%+<Pͥp\LqQyg(x0^/΄[ X(1͝{[:n 493NM: endstream endobj 7019 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./starpu_non_linear_memset_regression_based_2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7034 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 7035 0 R >>/Font << /R8 7036 0 R>> >> /Length 18099 /Filter /FlateDecode >> 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{>?< endstream endobj 7038 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2647 >> 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 7042 0 obj << /Length 1028 /Filter /FlateDecode >> stream xڝVK6 ϯl=h&Mv! c[Ry좯(D~$%1RFޮٮ6oFR $B$ d[)z+Fz0u>I4NB]ծۮWg)<ջ=8V&)LV6 =w߃0ʰ98ؠJ~=N*iРt@M;OZeݹ*&|1AY.l-Z/6"$$"p&HEȅ׫DZ'О7'] \%I6-Z\&t,[ Ґ anlJTNiCgcseyh Hv 6{lPw Y)(Nw;=E=h<Z9'䖴jd%6x]4LS憳s,r۸9TllhB?\{,a|',BvF-}KuIk QL>|e >/ܨsNt?=8֡RY?5,ȵ˭lRT R.C\엷ꪭisTͦi͐Wso^%P{PYeg邟Tfi>|~ģpρ.k@W/~[p3T UbEC)+ 7< ¹mSϚ^=Φ{k=1{,WX ;i endstream endobj 7029 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./distrib_data_histo.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7046 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 7047 0 R/F3 7048 0 R>> /ExtGState << >>/ColorSpace << /sRGB 7049 0 R >>>> /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~Ӵ7q endstream endobj 7051 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 7055 0 obj << /Length 1037 /Filter /FlateDecode >> stream xڥVKs6 xzf I[Z'is3vC١%l=z_ԝ\D@>P4X48vANd2(4$') nkѷOA,4?b~qv}BGs{Uq=р9y7`P=k!%̘$9I—&P6DKn-\Ji|&VV)2ɻt\Z$MZ'lntҺn1桚}nՆXSU~qk40|j,> Le^5ȸ֭Gx{s73cz5 zG h' @y4#5x'TU4ǀnJ4KR p\OSww9 +"BFm7_< МWc55_~T$۠=pz*=W}k2Drau(Mt]k-XN]-zqᶶ)0X?XFR3`P9Xh_4vRQw`N2T{"C΂iC 6qt%gXatR :EjGuxPzj6S_B'ؓ;**֮I=mJ6촛D͇ѠfD\ ;fȹ ZJxfeӄp×$ď{z0Qy7NP&%K.yn:w}=~?:mCݞ_`ڳ endstream endobj 7052 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./paje_draw_histogram.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7057 0 R /BBox [0 0 504 504] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 7058 0 R>> /ExtGState << >>/ColorSpace << /sRGB 7059 0 R >>>> /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 7061 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 7068 0 obj << /Length 1752 /Filter /FlateDecode >> stream xXr6}W>PSxg4Lܤ2$$Hw RDq'M`,v.Čɳ͌Њ|1 #`VFٖύyb\Ogv,JYhM1垹%}>+<ۜ7SL7uZy݈~4<=y153xAZzr ̽6DU+׆9:όoH>XkәϘYբ4񧼬QRR),C؜ 2mE{(34Hh\h50gk< yNC`ϻ X 72KeB=bAەiuEԫr)h>Xo2YK=Kfhx)[ӎ]MmfpSrcR4TV\!h2VdT&('E5vV6ȩ7 tM'Ԓ(Ԛ5i:ՠT{|dҀQKȭΔʔ90PmjʹSU`=Z\+A8zI"72OdBÎp8 G55[ &Ew9=?WydJ/S3)Y,YZh4u[QK ?08DMўtw^v{W/ghVJ(v1"䬚>4G_')!=Z%-+z=W/"Wp1=rGvo A˥O'937Ԥ3]X}{h#'VZMzbV={oG !%+GWy9sSTU)I3J}ާ*\nru l6Xٶ9rأE$۶qAC3I|{FTVdO.6ʃwB-vzPͰBʇ`@`J h]|.RPLP\0Z8!AS}R쁏sճn5uM?lCYG"jq&H. >T0mhf^]`H$yM;r e)]XK`0s Fa#EPHЅEdH M%j`nf$:j{aިg"IKgZvk,W3n#ו9H@ZbB5K%We;)=ݜ wS7g/޾cxwx`9bcw*`w/7,^~DD0v a=oٺOiQ@xW=H.qhbvXK)wUN3Qv'wb\Y=e4eKR:O ɤ_`iSj\bZO@BlGҾ^9A/7~}s.sL >_'Cud67*n]Uݘ#&8wʺW 5e#Rӿ`1ޓ}'P9OqiǢx[q;"Sz qG$)qye*^#<_a>UEd)>B </8=7u>W݀.Vh?U߲Ծš_N%'궞kgrC[7{'C_ Ufz[(k*XnNZqY endstream endobj 7080 0 obj << /Length 1073 /Filter /FlateDecode >> stream xڭV[o6~ !{=t˒֬VhȢ*qwx- t s>%"fk:f8 C !C=8q8 [#h.#lּʄ;eQ\ y柔tuB 8f>֓/%1j5rf'dsp:9I_z; qed*͖&c̅QzC˾Y*uFgh[#_x y.r r,ةlґg^9[nOaXrV ] S= ,PS P.Je84P(> CSJwYǻ튬5,G,>˺X%*. }'7Aj+#̅U-ں~ڲSz+rq MW=^eqݩ%NR |2(n#ܘJ9vrOBWV#k(ҶO7:̙N LUՎZٮDe|f,jtkI*thD'}d(F# ]E^SW%vm 6RT!܀!qcttil+EZMӑm<,phrculQ&NXL<4i1PXt ;4e !%BCJVv/ _Z5WR׸M2f eai{#^^'73ogVtPFsjmN-L? /&ۻG*!(Fӎ.ˡCO:P!\:!$tG|!u]"[Iv{ˑ&\כ΢|tR>qagmDdz]0u)1sf: W,chZ s;`UaM2vBbߟWҺo֘EeM4T>Oqs}CG_ ~c/ kޝT2 > stream xXYoF~SAֆKp8i6-#Ś"Qܠ3;)Q>E]=ߎbm>>iz<`mx6|ǘ΍+sV(o]Oݒ#8ځBlcldU(fjyY$]lrڿrssM_'z{E.9l̹lqkm6ߴu%U 0I\UT%yFߒYxOwY*f}F(fq'+NjS{Pl|rJ&%$z&ĜvUNLH_3d(nmJcCDv1pE!JK)T-"E_Fx>Ȧ::4м"ӶFal0R"x7.iTt^$ REբ|PFwA3ˑ~U)RyxODlKO)TA9JG9DY_"]6+cҏzj;2Cu)EeӅ9_N2\TQqvt@乪j7%b ڔ 'B@cSmܡP8p}HOk檾raS\\v aCKtG[$SmNOi'eI縝4aeH! U^ܭ *eC6X20XY%uJ<(܅Rl}zr~vɟߝ}u~ H0^JBTj EGl\=ڊG?Dѕ?66f[G"dVd$9z2?VUBA&h0 *!P=>خER>:뻽UҝVTa;~HK g̜qTHܒT Pckq׏~%жϲ{ 26JUL{¬Z VٶL%Iz>v_wt-kBwme^966?t6uHgsݒ[s |NoU wjO3x`80]iO9t\OB6D=PGUƷ2#ƃ"EWGҸ~OQFm)w s-GU3n'e[@ӊ"=.Z'ו@Pm7z npL@`Nиf\QurK%K5ECru.GFd)YÞ1lX00ٶgJ5S`EݕLhkK{sY?uim=~l;74CSfX?GT@ g6hmaL5>`V=(9>tae ~Ȝ+KtLjڂ 8ߐcܠ(#`BD (8E{[ER냊yT?( Kh_$Zpmoο(:L}5zLwy_zZ8mpS&/rmIV鱴lKRX endstream endobj 6975 0 obj << /Type /ObjStm /N 100 /First 1008 /Length 3444 /Filter /FlateDecode >> stream x[moH_obQ]Si͡/Av( YۺڒO{8vcNn8I)pȇ5N(3*.:Fa"626%"ҔY@5Hi IE(AhJ9Qx(RuNSPѽTCMI$0Q*4`` *[.J( Ђn`lah=᩵H -Aa H&lHrHJDR%dT$SIS4" Cx R, 36vT @H9Gqi!4Qe#m ͆ek&JPlfS4*!Ld4EO]f( @eZP`&uQ*(XLPDj8ɂmM- (Q4l*\ցPA'#:INR-`M0$AOMװ)(Ĝ $vH2f%hPXx ĄbHm` sO0BE|2`d\" :r"!$ " VJ ]`\̷*%WRȃJaGyZ`MFGKb06v<;;`~_էn |H G3;eGx8`>Ř4&oYkLaY."#"z4lٴ;<;.9{wY|3rf4X˸WN[zNaiGސ~؁W[ .b2{e9 Cwh (>{f`yW`OѨS*lWu5fq ٴZ6Ա[d#Pj4&gRڐsLFUՓi9HY.z۪Ȼ 7U.G8&:Gc~x2,2OJK!iUٕٸc._/^7f*@{xNH/Sc<bLl`$tl% (u7.jaquU6u5U)طw $y[DJS̮fǭ̐u"b`3`F${eX8i%CNVzqp|$Y\Q>"taYS{']q\β?`;R>!}5oMe!iO ~ ``"gYA-?_$VȾb!"~Xl!t҉ #Ėo/{G H& ) !B7V@?† Rǃfkxpl.!nB+A91\>,^P)b ގGuǾUB#*\ lG%@p݀lyR};tѣ_|k6"*Y ug`|]sONBըZ$?%I\ -ʈ鬇 7.+5@߶1TRr"k.B4Yʏ#F< g݈^m;q|ݽDYa;ޞsۯg?W+ln%/\M6χ`*;eM${-.P(_ʢ KG"Ǣlts.~RIbqgNἡILb1KcD{q=(aTU[.o(R+_߶-oɛlm?DA-8g6a#YϾp)@ϟѻCmVCs9;?7&[ Ғ01*,{^7]Y Y`d6dӑXl*VIXj)9Մ)Mdz5e-\bmy)jtֱUm^7}f?|S?+{:JI*&?0Y@!)9CbQ8Mq@Fof gA3ɪz)m_98Qȸ` &GnQ#d%uַˁ΅p97ަj9XK T-Ә|Et(V/A8} ts3SB<}en`.-P=R|vzHp +w'M(z*o')WfS7F|T{`y%@ _[${ crH_|vm4dИl Sh$;[18*18*r񐝰o-Qnj[WeI󗡝&3C;ďC;%jw+A;e5e?..+a[5ȭ.*m|~?&%[29}'pۼMMF7@eݨz7 v/Y= ? 4H{iU-@#Wo~ g!YȜ> Y| 7o4pqr>C6 /GG՝Cv`'SiϣM6yu!՟H|8*?7͝Db؊/|qt11<Ŗ?ӣ#z>W'[E9xlmHi6)Y9;;O@}Zx 6ٕgY><&Mcͺr\x6X+YN͊Seb{,ՌٗY5̚d:VᔟXx>޷&iX9Lbgw,ܽgXvY? kQU7 ?>^; o~Zg^~LtLMw;1oz@ $Z-$1C!\&N!'fͮm\;Vۛont73h4hc\s ԒY4B$ԋ-ҭ1+hQ_g)5\<w<t\`c_q A: ;lwk; =AT7I*[K+1$U6vzP;( # 3U."=JMw|ހgO6:W߈B/ty٦"v[ fE;Giv$"Vj  Zirl`вzQ, OR VO%}̍ץV1GJ&K6ٯž/ZĖ͎hCW.L̹ؑYbFMtٰN?AӥKMH[><"X&% 2;Y|XߗyӾ:N!&60*m?n> sꛮ JɂKEA_z-  y_ endstream endobj 7125 0 obj << /Length 2490 /Filter /FlateDecode >> stream xڽY_o8ϧ Ĵ(Y=M^w. Yc!躹O3R%M{h=Ùo:d%Q83XE,Yĝy|ugN{l2͜v4g9QM|Ͻk{׉gl"?Yp%}#μF<=(ɵ~*IeQJTc7!XEY1 _n6l%M;/{[Nz|<[/.\@ڈ 1}?zuWkYdn!4C)]>_+ Gg,hU &n %qjbR|eįRq–Af̆m`vnDS$,꼨oC{%/k+gSwے0 O7H$x)l]&+Qkah3 ExfŲq &o$1/H,6whځςidg5OFKeeDeISVpL8@qxʔ6 6V4nQi:%=~-}k- fm)֐<㿶Ӊ]fDՀcI2qGhFa, Gc7KQ٨g,y 5 Ltm4 6S%lUew%jtH_͢t Eժa?Ř ܧ>6<y%?>Z8 D, 2Y,+Y#?DSD7m=\Pk.?\9"JJVڲ7{/x~2t%5t[t-&W/WOt?q׮]qH|m1iGOҾM+;^ػNdFmeUTH(pT(ð.y<۷Wt(\"nڙtY|o'b>oαԇ=XwZ͋ɤ+K O66M &yjJ8|vl^б8i6/$3;xNv&O#E)=ȍJ7-N@}-FfAUVS@'p%=7q4JShJ'}R6WOΡ 6s#Sͦ,)qAx G p(2 CZ4-Ĭ""$.^d/*f)QށvU95JS"S>f@--( w\<=AK#Ƒ¯lCWSsnb([g5K4Wm hiТS/8"k֊]xۅt`=|RT*lR_c_}AX -SeS=.R02 8`65 &J>z:M#+,{Kh} h9:3CO)$٫ \v(mk ] cJ9$^ɋB^o׊T Cauu @y%@L Sv#˥0Vv"m˪0bӾNe\]Q z=M%3꿛ݴ?ժxp]?^x=8|0(" "LifDhj[F"q =9;1|A!BG빹3&մh~@aJnmד&CֵZؾ۶fIR43F~.5=Zv4#o(ZKVt0 >:S{GO9K10t>m3/D??.otIIb I/ =̥yHA|"WHbynif'}w &*VVbaO;ЀpaD] d#c Z׿HNzBO[`҆,=N}W/bg ?:PZ8c3Z&?>eLԇ9e@a7kax<45gW}m)䖦@-^3hx endstream endobj 7147 0 obj << /Length 1394 /Filter /FlateDecode >> stream xڝWo6_GYN+K! Z#!2IT#%=aq_l₀I-ػ?(\>~zq=ށ}IlPn TH.lũܗ#_OzL9 ס!3#.Fs>"_DcìZrV0%߬XQ\T=tCo'A/l9GǢf~;B:1 8`2}7jmݙ}t8aF1zcp*1")#QK ]{F  mGlfpϖU| Wܵʣ "ӋƁCIg!5ǞOQy<8o{p4st+C2hd씅<|@| )Z؍ҿֶx34x#F_ endstream endobj 7153 0 obj << /Length 280 /Filter /FlateDecode >> stream xڕ=O0w+CҤUU Bbb)Q"8>6F߀E;%,lg$rnwIh^ m0y䃈 ~w;a} Bf\\LL0'? Offc;KktkGRMLLLjs[uoLetΫcY"!&BOJݦu9o^"}v>0e#;Dn endstream endobj 7166 0 obj << /Length 1830 /Filter /FlateDecode >> stream xڵXYoF~6sͺ)" Gy(@D"YvҠ3;<$ʱ E\17e63kv~b'=ӗA4!"Y`g~h1?gxFTsӶC#\'G mXBy o/컶, }|泐Ehis-HFl2*iXӓ y;!m6m:'12N*N;=czm@@U9`znwF`ؑ'۪ȋFY "ADNNd\'iBpЈ2Kz~Z6UNJu&BQ `#h&Kk+)] }jv&ۑ*q 6g僠97IWGd#x"Cݦ2.q-)2(fH1̷#P ]ԞОYLg* `)w?Q uɛ"]MY0 bX+A`TӘp*F\̮AM(px-L,U܆<%94}o^|s&&V@q@<$P#GpJ&ф#8hkRݒ7·#+j8!s.:II TJ5HȅD|RH azWL=T3) L# *SA%KMᒽ@OWV6.r R+9̩ºZ, ZhP5+$IaO-]&;NZMXxTu 2b8>LG/K0ME2Su4^8TBEB>u$)U'FDZBcp[uX%Vxd رP߸Z,p992R, Hrc2ûۆݡ,]PQڏ]>4Wě8Xdꞵ-y+"t"DYƲd؊,vS9[2B 6fRtC蓮3 aFkv~T;Hq 4w#74Y*zZ05dW0ē9DAg Cif΢'R-A<Lmje}ncW^qvyV#cavTdS1|Fv?cdgK8C7WPjΎIFn !]LAtC9q-pWAnj, smgZ-Qf0JotK6dAd!&~*?ʟ@"4޼ci!#q,FL<1-e߈)*:$QMRigWT])j٠a$BwUϫ.:UM> ! v?q*(yDt"ϊGP/+wfG 3Uhk ?ҏ֎ tnB]lL_8 V> stream xkF WHɗD3A pvMP.%ukKFK忧{%ly!Sv'w)w8|5 ]$dN;a00e⻮Ё{f՛ә #rە]Ag$")ܞNR8e /&r;'|3zD&E4VFqYj+&MHI7oC4#?}oUyѬvݤ @~xyY^5C6d>c?>mZ2pHOQ|wse2P bMԟ}˴#NY~81"~GA0~J'@hfqbUVdSǽf3\*`hmwr1d@l3<IҨ;4&ٚ&Єo @L=gݲdsvM^yQh\H}Y َ)h[Ơ YM4Sa`뷡w:9A'UVjIdߔ[gSF&2az\θldGAJ;f]eIJK`| $M@q9'-޿]mnyad2ЩI$[rMA0bK8Ynj?B9,I4XAB8T}ڎ?H>վX 6 MCFسR37Iuf\ͨ#??@7]_(ϳ"L5j`>M=َ&WjIPGqNR,Z$k>dňR@E endstream endobj 7101 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 3657 /Filter /FlateDecode >> stream x[[o~ׯ!="rb`cb@vJ3hxϯWԴlHێXMVn_Dߙ.:J贑:OS2]4 RmpG[+udՖH$iuNЊQΎ0wl,uޢM@fⶀ}],XXB¸ ƅR;kc{}KaAA`ɑ-gWJ*gD ń5vbR@N9ЙI:BگDOJ3GZj[LF}ւ%Aڮh R.)|.Luxe" Ǔ>Ex*R҆.rl;ڎEߞuzl\CD}q8풓6u K*`0ŶN1 TamMf]PΎ ٫ l/OO@ow ~>7bceuM7<Wȧ[={[OY~YOV0.UP/`q{ZMuהAf`):꣊Yc0s4}-+QZRrlȱuO sl?]7xn̋Ҽ(͋ҼkѼk3?-d6j!S7}@ˌhG^M_^=|h~=+7"|<qg?{ɋ+77ֿnGOWY[CK>/'`+&g!`gM3CZoRT,G^:@YBZoDZA|^skM"BWboy;=bz^)2([api9M12P\y\w>11> -+?CJh5uG>iz.\{$-XqGVo|O7߯V7~pP/Vx9.VnTN٭0|wQŊ c>jw~s'lׇWuvsu87J m@B 1oIsގ_oX-ncRK>=Ep|B oM$FmunJݟmW=/s**rGd̝AE,<"a&IX8hSMhV}k0KVڴbA =`JaN K0C!s87y1,( 0\en!dH ̈BEASCc?d{ k J \-9=SX-5;ֆ"z5"!f-?rZCF=$go\K;=锄ޤmˑg{c#8;VFSrcF!9:6osS)pEno4 [T`zMiǫJ^p;o*3GFa#߹c[薃5 &8ffn ?0Y%^v\ey˱v.ڹkr˱n.ǺBsKhbSE`-^~bsW85:z=\XVҠIFa`H ƦkL(1G8p_J4!٩{M>rH@IigJ5BBٯDW$&BEy?̇^?[XnT,g.g"p4"d`AO%4L4rite {I!wM &)R Ĝ)qA^s=;%J>w +ɳh_H:4ْ(uAB0ɟ7fW4)~Oy25&v6gbwhK[@]U=[fe `}yI=>@ sˀН| n>}nd$яHf`$?%C^td.2C|2 \|wH qb9!Y<3}2M~ZoDzUBx?oAzBA$z$TP@q^/_.׏}j\@' I{ H{4[| Wc 09~c'M3/3+ oN/w{ul]嘌 I, H$Əӭ}7Fi޾ ~CTQLyi,N/k+z_L7/|c;];sn9xqXn> u`D \O 0#000088h,f@1!2Xpř|g_h9#4.'l&_}-,~8z, z+ ]LlDd̛ 0)^f#y0}S (mvS-tr# J8g8LlX&.'`\òkSDCw%?$J@5QeaI6$<^Mf=%0Bdd%!+ ! ׄ!+U_Iy98XS+B5)$W/_=ނS XrpJR^"P% *׳Y G&hRoҳMNNFߵ#Ɨgfhn}(~Ó endstream endobj 7221 0 obj << /Length 2573 /Filter /FlateDecode >> stream x]~'*=pq>8$W#K.)JK8-p|pFz克Cx_=w4,vEE8D$g׫;'|ʼnc>uQymj}w]T+^o\kxq}>ܙ&H`.V-0 w E0ή.q$#t&=J"ER$Tlu2yCN&ϖ %1]JK &{sY1 r 4]5z" Yà >Y-fuX2߼u-(/_wyHYɐv.ň 9wE)Jj^Ҕ+DڑRaar4bwpJ89eE\%0Cʼ-a RW wK8nޘ i#hK4r`ej7#UvoԔ& g4}> `lRf\/MlN`Vl.klWy_^m>T=Sgr%Tn+rLXFRF"ca4ſ6alR&臹ASm +#k:Ŏ5yvzwC^T,r-]BlXCk v}Qd<&WdSm#}[_ VB[?!BWKZ]xn(\_B:|ǂ~oh ]lrpղ*D44KH~lSD /}2i`>䓎y4nX)LH "iJ1B'ֳR`${NDwf8t|( תI [tCA{*h+2zy^YГ3E*dz;1, ~ #O}\K#/ j I_GNߘ>:揊Ϊ:li) #L>Ok&u"@D X-iÚbYV_C8$I8}>@$V'"Q.^NUW=9=&I~4ޗϒFW%MO5?ȗ$Q+]fWN+1'g"!:YMh݉Fg/LEſ[Dq(R}VLɸ{}lEmqpswj]P{CFN{ u-E{} .cu=&*0c*|5D*QinjL |=@G-@*K;Eq_4~CGW>+*=Vle fiE#V1Ur0Qbg&/4%m֌RGLVV*g%cUѴ+W{pTCK$0G@ oB\qFShe> w/H5i'zJ6%ּiZz$I<5z=!A [Ш 84lm4;Uf5h3w l=;v ,ݲ%܉W6zEwU :VA}niuŽi[ɓp(r4#lwjksXutRɋF';{Z-ή( aqs}j*VC^/R7ͩYMA~<VxX6}t3lt O Ec$ors \Ap‰>8u'e~pKS-Or3OcJ&4nJK4U׈!{^mjFꦫ&# : /u;aOT`|{<|WʬR h #-UjI;ξ&t04۩$>,*ل2C خ7輁Y:o *F @̉  ~ J06QսZL96ez@266SITS q#:[V9J`|H7֣O6M)<|i*R0YM7stb(2)hWawtBqاEqI|T,2D'w$.nExǟQ;CUPL3`S {o"agV(ҞRZscR?/+灧 y$3> stream xv]_&d%IMcǮ-;Gɕh E7̂8}}fe[mpٓ88\ mƎu9a4l[4ūgÑF7*/`lJx˳gٖEϚ.Ϯmk~lƑ3\/7g:FU(XZC7Ҕq}+ Or!#I8G bknOt]DO#GՄt[Ո"&W](+CxP(+M/o}."rq7A 2D$= =d3Y|X{p^lq\O$~~v3=  Gw2kb>KXﱘ jƒľ,窠>YjMo,h||?.f<54_6eRy&:=tLYC'?fOI>"I nCPJ wuЏ>QNttNB{ سmflLVz*!]QR9E ~TMQhN0&ka ?G 6i0KʄF$?$ d/or7eRz;@;~(ltNeyI"#3X'ClX4Ȕ7CHHu!_ӹ8q,(>j~ t|(Yke$K . O94/!Q@\ANоL0ϗJkd@x,̵*'5sGs0,=M.\xSK8NzPfԇ8"$۹h\ŌFH~mX2]2pC8^f'n놨g "H4W3D &;w+!tkӞ.jG>`C 1ɀzd4gKt| / jadd8HwkN@HgLnjTK=%4P^ 7GUW/Y+ X*eΕ0 ̼ ~K45hůN~ȸ&s}f)tsķuXX;/4ɪ5 ^ˮD[UMQվ1u)G2a:Pzuׯu9,~GQkg&8.t = J~ŨC5G3۷]-Έq4\Tg|nl„PN1Bc'NxB0u\)/E~P*e* Z-}ITzOה)ξL`O5> stream xڵrF]_}ɒcp}Ixm[#%`0kpT`s3wtȞ]˳gsYdA.fmEA0 c "]#_,0~6fVg} Y|qy. aгo/~9SgEVx=KaǙmq42wg>w@R>*t_oEX+Rg eɮk̠].۞lqAzʿw=M_3XΖ!0U Y `a~|*ON)ҳ(ȃ Nu}a">qMg{BߢlxgS Arpai S{QX$e\/X4nBa1{0AKwBzPùyҬZ*ežW^ =&|0ŀN6 +Q(zA%6A0Ƴ5Vʗ,p"ƽJSِ\t tJS\ip"E'7U<94eOR_3(=sXҠ1G'UQ^X] w2xɄ~5xr=N($md ACC'/n)*eVZIԇSeHTɭfOT.Ps 8@'2΋O^dZsTS@ [.>Aߎu)M6a`=2N.Jag`m-ld2 ^ $՛,5Jh%uaG+&3*rvI1òjIYxFTcBtv9ϙoє=ƹ CDY'nh4n1o٦^6Œp~qOwI{ݣ% k%tL7$B$brZW=je0!) .p眃0{c+n1,f?Zq`Df <ǎBGk5o<񈳖Ͷ8v:P"y |ܛC) :#Qo #Ef!g%{˚ Zz#\AaA}-J"O&Еrt QEӜK&WFê:æԔ4ՄѰ&,8$2!1`XmBJFI1q>15ҭRK p\,Dv7pQV_ Vx & bc޶t| p֓^gPKU 7gSm@ Xt:Z! "&LؾL]8Fyr!X>=mM{`AvT+[,vu>Ae!).g _O 8l:2@L1إi>w]f82 =T kN]}?&'YpS?R7q4YEuim Zӝgv(^↼2:LOC4A+Jw3|׵j@t5LABӐMeT۬&.f+97qk/j&.]ߊՙHo/ zGX 9U0UVۓmt2Hm]t0`tceКhNJ'qt|z౦S&\׌o$N|wl C)G2+t}Zn4ii?*?>7R{tB:`č8ۖ!e)<KXa󳠰#Uc?o/oբ{:{L'dA%Z^8xX^K7s+_Ͼ!0!|x@ ovrMr(6Z6 Bc{Z 08Ȅ:Qxhtb+TSOڿ&To&#}k3I%A| ܁?#V j__j_f Eekj*P5>bRL Kkcp(R1XNx|8gf.tbp gaG~l%=q\mE'<d^3닒5K t endstream endobj 7273 0 obj << /Length 2280 /Filter /FlateDecode >> stream xZY~_' nXClǎ\RX8%A^p)q{XNRy`>PZKKZ_]|vyK[Z|߱.V EVWܺrk˕Rx to^'vۼU8/?^('-U Cڮ5\\ƾpۋ_Hv3 xy,_D"VB4?#օ ]kmStw(?eWxK8ˊ@ 8}2Dث<ŀnM@5 wZRVqM7tL)n9ͳiϓ<*ZJM"L?7߾UIy~E߾{z9:BOjXlN2->K<LR+_tlHk;Ut+B":,A1NֲҾ6kc$lkIc\U5\U ۡ)_]oTı=OF<'-v _WIqySbMZi4OkjʤI,E@@Yy'쪴|Jg6exsԯgjfEgVJDOgތl"b*l N6IVc`OԴ*iZr%#GXt egeb<G-on|BUγtpwѓ3 "iS|:v9e{ < I3&Giyѵ,jy:&yb䩻!m( {<4r YXl KM('wc+&%X WCTӬBM-av3ڪ& G/y 7xP򊺊]Z$Lj1VE?s v%ilH4Y=pʖ磳\',OL ]kŃl*AoYc ǭ1ZbA[}MXcC<5 dΣ YiI+&34Dgo+Cl!擹xKP]܁* _%n2rH{el \ I -Cr2E"Ct Ӓi1p@4r]ifь !2hps5h| MhH;1`HL謥~ĥ8buDDvm%Y9=Sz>y6@/?s uLhZaC0H)>9P+Kޯ5|z݁]Mr0ո^k-qvgܙߑ~TM`$5礵0&oZ3N^[ ywM|=)(7t^KZ%a-!|D;T*Tub0Ӕ()Y G%myעil?MÞl-B풼A4I"Rcu.@DEI'ā:UmBo =Wu5dJa}5ˤޝ[JG> stream xڝUQS0 ~ϯӮN$=lq`m9 [rMb%m˲-}IL#ǡY0@J cԗx\u|u{;_Q8TeSlLlѽDZJk}Zw%#|/ϬkFFpvB<3`̩d`}Ψo5bp"i~= 0¤wHS!ԖqT$cV0"yD9d͓pPÑ*Ve(jkޤy<]J3YwPyin?goG`twi>j4Oߥ]FldeL#\4H #Eu&qa5.q7T\aH\Rꈒ mj3W~ʲӔW;[W> stream xڕP=O0+h5ϟ鈀B%1TRv&! {aab{NC8Š]̜P ΁H:E[H5DiŻiy ]#F!-SQ~B vPŷ5YIycFG9{bx> stream xڵM6_a`;8@n[Wt QrG9Y )~R{$p!_< /ERw@iy Lz[PVk)sXyی%"\"['sƿ'70;z(4r2g Q{c[ JԵ0?೻" )bXZoz= !1Y(h~$~QU%0:p7{Z&> iiqӚa. c0Lr@e]j2S]_"栈٭V TS)DQ,u"I qt,(J7Q@k*k_e`.%ƑC;[=Xx@)z4n5Q9/߶#-JHi.zT{ݢgd_mKDm=w񃆘igi.uo/Hv88r eN~uq7[ ga%hZNQj;.<' u8 5+10R  pՁw芛d riDv!@ \5!suZ@u+Jjo&+ D,b؞F?򐢷+asԆZ+wѶZ?dl$D<)m~HE'gKbv7J;k1Ȃr.!7X5^% -m[ŘB[{?آLh=QbC0W9 3\Ļj> jPKXwdǢfgҷZ}hh\*zѡ<+OaE&x"Y9Ap%Ǐ_2q8k氀=|t7ϩ=@M>fJFr{ReU0PTL-\̙#x}x( tHDPpqNA}5wzOV#8{uh.ajO8١^p`9ks]!aq\h-kѩ錅;Wuj8pspz7 xfзuOx ~,F endstream endobj 7316 0 obj << /Length 257 /Filter /FlateDecode >> stream xڕPR0WJEi9% b(2)cRLCE{"aCn=$㥵  Z(JɭŽ:~ -]Vg+Y8ZC?Ftޓ"A9ǝz&=B߶\ (njDx"ZqIk,*\JFl06Shs”˲C& (LfB^K#r棩3hoy:̲Kw=SH/'HC*]:b endstream endobj 7208 0 obj << /Type /ObjStm /N 100 /First 1014 /Length 3170 /Filter /FlateDecode >> stream x[n}Wc (`%$K@ Kʱ9ջC.MeY3>]S==tKT픹+2vv:u!HBsĝ:Mń% &0/ǣy :#]L dvA0؅I ܅6FA2\BnH!q2!uņԞ<-рT1P DIN:)bab0X4KN&ܑ=.. X!!}C i?6񱍁ƱMb1r}C6bX( R9;9{?)|3cA ry)U\qOW+Z];__lގjjOǫgW`:Ugq0QˆcG!)抜שnӁ#3?c aɏ2DnsDuj19FȊ;zs[yR$`)<Ԛi,i 99EDE@I" ^ qN  뀭 pE ~lqۊ3u!8$Tf^"(먙9N'q(~}fgus?59+[`٪a-rA; wK5\<<y<q{WWx;/0ڳqfG3{&W [moW=ϥC!/By!y^ՇqbϞt4 +ջPmߔswK#z,2 [fBꁱףȬK$܀BrSϸ;}m rPS =ZO^lB9Fb"ڧaPmJчυ]>>ȦǬPF0D+Bd!z=Y,R ) ԅBH鐬 9{aǻ]z.x3%3* +¢02=ELDhDӠPViRq.)~Eځwڥ|=Ev,-)~Y2 (eɨ %?(z{?\B }ܸu*:/v{8bEamO3!ƙuǼ jrMꭽi|d*Ųfܓ L]I4*rtFWMfyMNrrmט6Q4׵m2}.yk6c6٬.l6.l6.l6.l6.l6.l6.5R֝&D;oHM.iNĜ%rRIcC;W/`{mIv>s$R@L$:}r NKi$ qrǹ=b݇OOoꦿ8Y XN>+NV8-k>Ϧ~^o~];6=W=sk5u*COÔ4$1!q*# 4e lg^ Koa_rgG. :ġ&e {:<:1K)rdA+ۘݏ?~ߴl%e(ÿ#LvO,HWR48r1$;*P݆c;5`PK2)zh1(02qFx!&֮-,+"kӛӜ# qYUF Qp[ͷ *\-n6vds[YG(KQ*,UFUvDwg)7J^-H)˝FI6d. R(qkMɓvM`eA4G.1D^[0 A]lCv1(O.Nӓ6ڻZmn^m-b04QDXjk$v.ڷC ;fqF+'4Y4N㜦Cp"M`>ɖi}x;~NX2.|M[hR~]~/oS݆u> endstream endobj 7325 0 obj << /Length 2290 /Filter /FlateDecode >> stream xX[~_a*#+H]}<$9E4{P9EC[̮,f;JW{>ŤCr U 8|ps!۬D$T, 4]y\=Q{ݮ})sO? {AO W~quݙp}b4IYg ף~ ';WCv܀qD1 LX3 n28[3!.;$w)ald<7* d g~8$: 1)Q^w=-vy$+PH&3Eȕtsm ˜|K!'s"Qv R k >sS(6#ߛ$˼oaM]ͣ1GXB# CdiHs^ ~0{ScFO2ڹ-W4g'3f)1# ,ñPM]eY﫡`?R6ҹ2&XTF;nf7sOTFbIs<ǩTSvR9K3rWeW4z n]`܏hd#HH׆B=2!.TYG2/ˉC햪QU1 tle84t_ܠHGs; YxcRX7=M΅5V7C,:6 2ؐ< 0*z#8u_%UG[K&VΠj h?hlaI#I;$#UaBJdض(ͮW#u8ms!0jرI3!_>זexUfBnrbݳGy ۳wHX:OEʔGSE%ׁ\r) "'|4%Zlj'(rZ,~(*ui[^ö5&Ě%pכrՊV>׶E֎UsF]n<Ju2`Q 8ME"sa`0Mтɷd4Fij pP]?IUYFj7/AgsUl{LJ~'ծCCaNPplಌ>'?Y2{jZs endstream endobj 7342 0 obj << /Length 2789 /Filter /FlateDecode >> stream x[[w8~ϯ>{I ɲev扅<'t;ivž[*΅n!e]*U"''9y`#_Nb'ǓHؘI¨bʋo>3?_YQeQa_~SGNTC+Eޫ7r&R$۞g " 4W{ړOvq*ߟ$7]F iujaq q$9M6i_y 'zTyoy WZ/Hyn`^LgA{OjT:jŚ9MUM2D~Q:B8|AzRZ$a/YBz }шz%w4)%0kx`ƍi,QGy϶63"{-_ [>*wLN-L)/ Ԩ-Gıg{WMv=6N}ߔ~2`R(wgn: 1dZ[qS0 +d KNꋽyyW0g(X:AeY.R6) I>~)wGcWYb>:Bdպ,eܵ9q&̵(in-t?]pֆrDZ]7V``w#b{ ܃":bZH9Imގ)D"2fvfuBjHy8)tb| 2?$Ź6a $pЅTudr׆+VKR|?@$ܱn1B/>әhuا i3{ ܚwB{ { G@D9HJ^wHS+? ʖmx LҮ#Fi2lQBFtP^vycR7}-Qzui-xBIXݚ G#F[Y*1JAxRr~3-Aȶe:7=8&O_39ɝsXݞ7"\k|*.0&[d9Nz !OX)7xM0r61A5I@+t]&*ک!fXʰgU+ yc:+q*pkq9wk'Pq0T߿߮m7`6 0${ƨ,Oi?̀ &ۢO03b8J S(]nſ{W R~zKWP o`x_SB7꧟M?q7wK͍ * vOmUwϻm: nl^} &ₔ"F\G`A-z'Wom2"#F=ROr] rzNUAt^9x3mfǗP4 N꒏1G3 5ZwFoez5Y炻?P1h*캸 ф"j3ߜ8_%]ҩ4"B׿2P'YM1Dd Dh gZ,Ẽj8cɋ&?:LTӝ4)#d `ܾgdܴ㺞/Fޱpt y4I"#GM76sf3ϊy愊P_LOԽ΍)|Jq_tQ o@pkS {J)E<)+E2wxj7Q{j 6c n7<q'k*3;hk@%+|Crث =|/d}o|F̪"_]νCe5W\POq܍2~$"DƏ76&<y3٧vGOlT Fx{d{$^w.^*?~j/:iw6q} ,_}nlzg/zIm)?L}2{ ~gKg?id-B|1m s4CZcgcTnT|T!vQ ,<9siz\Gˤ%( endstream endobj 7355 0 obj << /Length 2578 /Filter /FlateDecode >> stream xZYs~ׯ`m`"p,ڛ쬤bD\tO )r~0=К,'g5 $'Ad\׆L{:[5Yg&+Sj!uV ["ŶH2VԶah'?^~"&k": mwO^&)?Q̊% u|ȢfAasY .-/D鰸0;ӷˍ,_0{*$fnLҌh^c:^ܢc'#ezP"UY$&N<.Xo@gF_=^!#wS9=>:7=^X[uy:Ծn4KDm0RB*XH{H&KRUx|YMLjB̩_SaB;>y(k=Sâ`RMN88s#buQlw/zcKղ63(g*ɳEw~Hp s,+1amj6d*t$IO6Y1( *kRZC/:.ΧoӧOpq"ߜl70+SFG1,;0Gsu̓Y_xOizXwTƁ@ ?r_PSզUqd+KZ>`!BxfuҬ9=V lDRgɒV"F߼pNC6 P=aew .h1<[V.`W;"G A)7yRG$!yaAyVg<'k^?6w˵zH_mУJR4UޓMl-w^F:upcϐ&- V+ Шi5(<@2NS1^Mlpt.cZm^< YЛ iC i(,у]ul 4NS~(̷jEBR u\T k: dkJVTOǧe%?MOtwSѳdJ^y 7*M!}1<}w;8+KXs ]yF1:FG^MZ…PkZov԰)wrSb51M7-زfKJp0IX+9QCy&%%68cB89JI@JE"? Ɐ0Ȫ_ѭE)EqsG7<8k-bnCYs@"9F7}4Wb>?JЩ0zaѷ"`Uft́$}K1F_N{I/p719B{ h `PDc!.{B"]E8Q$[8TPIkSad]m9-wQĒ#QcGt}q|DCKjKIK u/Kp,9(7PX\x,7' 2*44TqK53x ǻT'+Hxw4ub:/qb7i$JMljC[3%+,ߴ F>sY l6u.t!7Tkٖ$>-CF(KV1_jI%CRwg endstream endobj 7364 0 obj << /Length 2764 /Filter /FlateDecode >> stream xڥZmo_aV.b.I}JӽtmME،Ɩ|P/')gyUh1?OO(i("Qjt>deO#Dlj[m*/ |v`VDO#)4=ڕQ" |FW'<̟FJH6lƓHJfGYUmypS1_,$C+)b\с-LU?>\vMnMV'NlԭD6"UnĬ5ѼkǾPzb< yiR_@ȭY6[zI hHÐݎO<icpy˲24 yEEEFDO[n;>\um ȏ"c\Bz Af|w0Yp{椴`V~ Ӿwa-Wz3+8+1Mt RKEx̘vsszT"u;u8`590Z=M:B+f].R!Nd[2/j.W< YWNE7Z r*zF?U>7ö7E Y 9~y*g ~Y3Ha-^F&V F6m"_H7R8s[0l/mG];n3P<( L[wJ$- |G5|6B?Q@*cBXɪR q}% sJ=l~XQоb7 P!d{*LpUjZw $ b|אHe6VؑIY`7Q6#R:ޢ,p,kUύ꒢ `/BR$ym=N4haqfCDI抆J{zT "+XbS͛P@ώSHr j޾}G[W|(#fzH> zMibN yf0M1ktzIІM0"c}Tl3 aa#vEDQ_(t*萔O&L}Ir0pr09yz8M٘Z̬,+fh􂠄I_T|iͭ3ǡd2@ ɤ=3(ȹfncK3}Ȉp*qհΈ وqxȈIR)FK58ɈqkG7$y:t~˔LW|,0jVcڷ"@ G .//NF7L3ݮ-CX:<lpns̲z)c]>&~r'@sb{dk軱E ܦ<15)88x>=m-koZdԄ]e\n/=JPE[~_) ^+HcȍSbF0o}6H -ս))e>$ϖ% AK_I\ R-@t(r9|*v%D2E@0̔Au*z6lG2 .[}~*p/1Kŭ[@a\ EpEzk:w2#.fߡ25$I6P ĦtdBYٹNo\K`P"@O]?-x ;P]aδU$b?ъOuxoZq nL{P&VtYx|vbPe K&+@fˀ=CAĽGmdލ{ 1.> -mqפcUYH_l!}&rK^Cy~t={NsՒ}N{p;>&ٵ=En1)YLTg=h :n?^~Adž#;'d[C*9 S@RrWpX5Y4ʷbl'4>?xuGoE: 2IL!TZJS(n()/%q]QPtY4R;T1b(ή89Rr!+p/rwUR`S w2岠DD9]3L ƛn1!T{ k$Xp5*^47 ~)Ux&N, !wCRt7 ]KW?s~,cV?_ !)oV-%2fv>TBWrQw4(ʗZroRA6cܴ"rHN c:De5L>A|9H vkf-o!Fٖ cޠ6z5=|} ~ŧ 5d i6Y9rYΜޙ"}t7-pWjz,VO_Yf܀[f[~Mjm6(T;y2xQ=WuS!Gc/`rٮt@5¡_BVu;6_9` cԮp} s\mWVDH0>`$?vz1$!f-H%¾v@+Eϼ0fz~ƾ2h*RTAۏ OfЎRZ =-0bz endstream endobj 7368 0 obj << /Length 2130 /Filter /FlateDecode >> stream xZo۶B>bV0ðuK^ 7qȔ'qe[v,'M}~|Ȳǧ/b lD:ZjcA9+b_XrYL9CQB=N.:wݞCu¨{qӃ(m[tVV2>8!|ŲL[uZ'؆_9TMOeD-Dֹ)+6_"KhZ=Jߩ8~d-ZOpvgg<Jxbx˳k^^\W2+RN8Œ{Y'v/4]\i ӂbfֹLך_/L@r6]_ !~V$&\#[jc2ӒWRIٲHf9U%WQ+l!Nƀ>Y'g!Fi6_STc.\TWfQƥHVμ.psm.6OSm6}:$D\Y<ܢCB{p+ij'g$;6=p9' 5uX[jnOS#mB~܃=R%^u ƿ2.np(m3#.1)#x>3C;B!${@ߟm1?|esbt{P+w稬Y /V@ZIliaHX3YEj-}P\=ԕs.!˭Img}fm2q>J:W z?o/v1b{i; Nx4s87 ̄w[ m =m8VBⅭs#ښk9ɴr]Q8O. @sʜs]Q7mG(DQVokv##ػui>4ҹ?JKrkӅB\:d6-ZDž ffMQ.^$J:/u`v>ɴ=[*'ho:75A'Jp LeԶM;E5BP6,čkq=-L>0m渑r˦?N'g#Y@˜/=.ҁQ@.j N|myK.h2ϫʺU-5NYt}@z sgVՂ= UYEV[)RS"X h:,TaE *aapz22umlA\U7]sG\v#إ&צKQ+1Gab:s]Ũ_=l3dc8jSuhi܊ )kT``?(tlr23֤AJqGf01l7D[ s4&ICǭ%febcQX5as҃Uz|}]Fj" CV=c9=겇~I "fKn z[!LZ(RvޡP%kkD$x"R QQeZU5NeXHM$΋I\wigq pF1V1$HOc0GaXR>&^ Ou~1TGڤ3̎ *TWb࣌4g4A13Ӗī&W+3% e+/ b/dneR|4L'~v%M"Q`o(S^3<%<-g!<l>*#r/0EvQ3Gp' O&oy\"L\1'@f~l9vGnte7Vu,!Jx q\¿8 endstream endobj 7372 0 obj << /Length 257 /Filter /FlateDecode >> stream xڕP=O0+h5@)jC!%n6h=Ntb{NC8’VA"8^ڃE[JnT lhl[@[-ݰc3i];N1zYT䛈A^q'5fФ WAy](^h'3^y6YqJjFIj.JJnjo79\ _*\L(̄ =*O{&v<%:4?e#SHϗ > Nj0b endstream endobj 7378 0 obj << /Length 1742 /Filter /FlateDecode >> stream xڽXYo8~ϯCd@AMvas+KZwȡ,Q !9ΐs|338ON7/TS5|:x{`MHFv5D$J6|״IB(;1 p 8,.p%[EqlM] +ԵH^Rr̩I;~?BuZphKq<[4˘0‘M}³`@?uA2lw؆ֶ_7WrnePtɈg?#2TaPm5b(8|Ihl:qӭ$ol=@7!s_N/N.oVI]6Q ⨱'^{ikְ=>9Wv|,XG+ `X7`W T:?ӠgOHge^5wk}6è߾oee5 ux4{-J#({[PW7lman ExNJ<7F ami^^W9A16Ү)),vn|~fQ|=?Y\]_s4^N,`fjuRŒUlBOKIhYPņLWM3G>s.c{ Ƴ95j'ǟOpcȽ+n\|̏vze˱U=vPf|lVÄ˂-$,Jb\/XjL}-·YQ7nCm@EN@/~:.ٽ+orz~UP'}_4Ŋۃt$:N endstream endobj 7385 0 obj << /Length 466 /Filter /FlateDecode >> stream xڕRr +8, [d2[)C6N4!7ēKO۷ J7 ;)DyɈޢ{\F<Rf֍bzNX^ų^$:P[,CCrhk߮^y@Dd= K?+)N)l auj{S/}ftyөPCj8?r6ެ󕥯$'vFǔ t ܞ$;M(%xz>M~xՌ ܗ /}=Gk3> stream xڥr`Dؓ!3(N99.D5J*5'ݯk3mup, pTќDljVZkrzhX)? (c@pz6C7nS7(%qE][E`mj?NU%f^mnyw9Sd"t=#>G Ci$cN6$ aFs4~5TVyXCL=+^i䑇^""3θ+_o2U[EI&ю㱲놇4Ӿ>e#5!Zz˳?3EHcCeG 8eъ t VQrh퇏$tBeQqv?[ 5FUQwsib$ȷ#cqɖyz, YIݚm6Up'T S=JӀ`hءq.X2 mJ~3"j{ ̃E" Fw2-l #lԦŌWKm(Ze^Β %0a2cў}dRcy8] h;A@k ɢ͒hi%0sel,#tfo +z=8V6CGVҧ.֡^(x{_ԼxbKhgHV.6άYDC ^T` +4 qԇY !@HJJЙ91Z^6vQ&$@yqՠi(WH'O: g9;"Pu^Fz7X:˾nxAa=eeTKLJhdv)8I0cuZq̑T!p#,]nhIO5OtpHD匉xd#_J.8aP/;UuJ,v|4fW؊ʆl^ݠiBM @7+AS8: s {Ɗ9 j٧"'G<\F2 nEژ[..̙l3 Xҟrmӣ.9VUt=¼>7sa Ι*grW>J|9͈U"m4ݰENm LBe  2_Ez&7 @y+Q+ !(ooyul!/5p|f.a1-Bg1%Ryâe-@jyb\9 |*P#_Ư#.:y87k|D`ѩ#aĖ#M@aFDL3ΑÎviPi=|ƹ5<M pN;m}Q.Q39)~u-KE{WSM"eyfeC (NZ;0 L"%,7\;MgFLGڏl?5A'zV_R|AkxmR0XPi?֖ݏ,숸嫂Qkf<`u3;\<,9-'w H>]לrϼ:%Ѥ,5Nळgi;$!tvY1uA[L% g=/Rg^&?$ N{(ޔxpG5,ULU %"RYJ#;KTX׬p _cSU˘ER\ɥ~2"#U5e> stream xZYsܸ~ׯ#'k&G*)gM5b4\ϐc+RFđ-٩ʋh4naލǼ.z}{$H(w^̂$8AĽ{r'/dѫ3P7K'l+c/>\p<ޓN /޾c^s?y,Ļ5+Tadwu 6a/9~Q2Lf%iv8пZ2ҽ޵ؓ~|w]:Ub[膖eRN^] vW!?M˭vvc%-7~^%5P#TMmEmF( BP8R" #:fB?c{;:F$Kj @[͝-iKAdas(Q^Dƴ`44p&~cL,p<+cq2cgl IK!Z@Gݓw=0C}$mGTILN$?ꊞQ,06[r:R·gf?|N `zG͕ꕶK0:Ǘ o&;<: [i #;Oi1QߧKADc"q^oۏNt3KQJKGȉr <BFr"HeP;H g"; H"{Jּ'p2Ÿ,c;AWNÀ)G8eviJsܢ|ccԷ2FGݟTQƠ@pEHbeLe BX'3aft6G`MSu(~̮0X|{7fvݙc Q5f= 85L@ L"2x:1)-Yu]qj͟Q'-g:%iT3/n/KbE|9E(CA'3 M70X"Ơ5mVuk`tX3VJcx?m}VpJ𮮎  XK(ÃgL>2uczgU9mT׫HƺW(h  !n ;4ANQzO D#mVkw]bEb'Nnr'ya.46S6NGH(ו[͂CȺ}#$zԣn:~R\U%\4DA(*E8b^CQJ  M9IZ( }lͬj? RpTˆ `ƻ_B k~kRt&oi%_ tƮ { ډzᚊZ iF 3b4dGiH&:(3V2D]7aל]Bx#Y0`TaK4b[_ի{~u4Pa_eȀ(]澟N>84@@YGZtujpdLu) AۧxK캖F_F͑e%'c.<>u/9`UwȩOY>י:N d)ڹFʽJhD =Чgfg{KNlU$pCd⸲&փz;j `u#;Ɗ m4hBڢ07)yyV޶y?#l+K| jk;K~{T]K@:ݳ?d&JR]Z2ʡrn_ Lt vZ!y0=T$ymI,H{ s+EiCUQ)2ꥷFu  \r¬aaUpCrm@ lH(˶øo)=D.PJIwd<4Mz{s.7b3Ja\gb& |9UFEL̓0~| ICш, T=C${_]aa,&jLMi㦾&M1ei *p-}?Klm,6N6`MJT2N`#PuZ6Nx5\` } )6ŵg|E_@?XCv~>= i%KPpx-B@đĐ1d. l.u.Luﯫp֕V#lø/|!BaPk?[T{:_W&⾻s 2 endstream endobj 7423 0 obj << /Length 1220 /Filter /FlateDecode >> stream xڕVK6 W(*IQܚ4MSNٌGdKJrd[w=A@|\[-~] '( ։Dʏ*[8q?T;ZJKOha~{: Z<I?Q߄SgGA8G+wt4*k_ _HÈS/Zf|zXnSb/;fu;lYlotW懱6-X< ^f3kX0M3ìf_cYؔ"Ri$#D %W ,huѹ%X`L;0ۼ('9DU@T`nq(XgW%tL^$[}FnUIao8H=zŤv2NpqHOA)a6ԦnMYG|B~2j&<{Fdδ^Әϫ.L/CEw)c@F0s$k Q氫FcZ4lvW杋Md?X)ʼ.D1C_rV11WuIE4arI8rTA_re@UI5\It2T`m|0~q(XOL3rv:ŀt-eMD@M\M R <~q=vI&c= :r2tIO }gќN Ddh˷.£z ΰ&'3}xݦ]b탹IFs ?/*SY~q~,۲qGf>?BDIV*/=Mo?gc3oƆastxH endstream endobj 7318 0 obj << /Type /ObjStm /N 100 /First 992 /Length 2995 /Filter /FlateDecode >> stream xZ[o9~ϯ/3TǷ)A CD`P.КЍ:wܩt:5<@N\s U;%VFiHFy-}TAR(-^r)C9((c& )yHl$3[R'!$m藢YVdB"C?H+  ~QaU22[Œo+@,ȮelUPQbd,(2J/OV9v .*Gфg 38*3llʏ НƎ:UBUA¸Yt/[{&X\(Xwg'`ƶe1fus=tG58m%c8*%ll~|軙 ON>}VJ۱߮*g [;wlE{*͓j9kVѧX];ۗ?s$rb%Iјw]H I\[k.C}.%CLb5oF0l렄A/IaW׿ 2J}t='SĵCXe>7$s! ·򭃈 /ex(E7Ɛټ.{Y6bXK\)D$*C0kMb{dq#td:¯y7lOdoڳwegmsCx@J0oPXDCpB9&b 3[;[.o$"#7&(8:zTp>K -Nswu}C :lg׳iZ6]SZoBco{Q6oyӕ!zi0 DңtlՑjʚj,׸CroqlD WF,4`Em'RFǬN;ښRhCr4WW;$p3m`TC8C7.7.GcuB:OB=Lɑ vYN nK]ڀMG=xd6ǰmI0Q[L^=g^x #@yǻ|>An DmM _^#hm:u;I.l:zx:u0lQ7A}:ޟg^Ѿ|?j5KRPu9!")7B=~|W8g'oó1UrgH_cjn <:cCZlMzDU'$kPG$;N0 2~Ѫ^$9=5zZr!Η;;z#Vmva^tsk.ka1-7 %, uUOknq[r|h\*hȈ_W,^eIye34vx1ѡ@OdbIUrŜlޥZM}:7il/vTf} «]*b軤=YhIw}vLe EHqWoB<9!4]r;mfPFqݵKZ b8i vIֵÕ&j2*gn=TPvѕnMF6 N)l7ue[Oo;7ZRvutg%T $:PR7]]ϔ\[ل>"YJ>ƢrQ-7+vP}pIT endstream endobj 7431 0 obj << /Length 266 /Filter /FlateDecode >> stream xڕPR0WJWT06CIJ`H$0fHيivt] UM.$㥵 -ȝP[u KZZƕI7n H_| ;v! Gc=ACnkAD _k縓6\!mU{<6CE ;OS$8N-CpK%q8wM/L:-+< 3gRi$؝E}=> stream xڭYK۸WHUyh|w]c{rY$nj "! ePcק %NR$>t7`w>|ʊ]I. 0~Dr.6tl@3jN#?N"F~ zVՃx[ w_idų:wQ{N]fkQ) _5HN^rZJxC"s=0r"*Q X'mEFUxqVkumy#K^=wI̼a۞ 7ZQ%^[0!~!ཨEqirVљ(Nh-}f ZfXWXDf)YߊxKA0*k! Ԏ7vVs~+AYT-z)iVI3<&hޜ}9LqnY3}hy`q(]B@4`I4~'pYjA2k|S {_ϊ8+EV4TBt8M;qjn΁-u~pxFK^!W 1Z`01jOnau^ +L+ZR'¬l >Xe020=3$-hy(7y [b)c)݂JT IHle=v!2iP Tx6a7ڦ˃[Ol0kwTO~{''޶Xr)UAO(A,; Jc}VC]6o`J*40 mJɭV&svVY$ř{v˦c26BŸ~keG7DžԔյMV0R @S)tlv9`2CK9d}5 E3 BÍ498)jhuϢlV7 RXpj+$[r&w6CƑ`]Z|*]d)3 b?NcoB@k)RJӮɸ,J:qVM4 ?:x}sRͲ`\5E=Xd~~xJUzkki"HQ'?ɐjF)+. }ɧ  O!>NmOr>-J*#H!~M@p=wtES4!- 1Av 5AAlřϊAK/gxb`?6Am!TlA0Z7jD_.W`J`]g$7HoYc:X{$p)۫ҩR4Gһtg+nKݭC'v"$[ s*ra\k:Vh2,!D>|ǿ<<ï[xH ?*RP ͶjCcȣ~pq+qMhK05 ФDC["W`zdai.|aR q? /qf\mm=x < $>atotd-wOgc~={xq:h҇]E w1А2|qjM fW]A;*n!9[Cltr"'cQ479,<]!g?U endstream endobj 7461 0 obj << /Length 2412 /Filter /FlateDecode >> stream xks6?]܇\V.q3%N(R#N~(l7s_.31bX[Y;9?+D"CY; )0t,W,?: KideG6Np `-eE$zEQ% m@e[F+dRusEJĮ2ݼXwsО]uU*]7J5DX4obi:3 ؕ5 HE4Բ@]FJ._c.D=y)݅uE/DA=WU T \2\Pqc`T}F`b6h ֽAɮ[5B JViB忟 몯7< ~~D"&$B<izPQ`,7ٖh .Dp-pQ @؅n3,w%@eyR@l!)|ʦ ;LM&-!\`!:ÿ%gѲP_TIC eQW٪>wg5UIP:]ģ^iƅ#3Ɩ]ײe9slpv޼>b4$dMtQ#1v$ÅG(JNtE96a]X̰ "^G" $+{-qoݦ4,#scD.ڠE|aQEILj*ߘ2߃0Ug1-;@ Ia Ahg(ٺ4ɱ/Zև8ae0gK8Z)(+:Ƚ#heF8<˶ %BAޘ%NpF.m,І] N9m$$c/Ц݉ w'.BMkqCȵiwɵMF;S1N?Fa$f_ ;&~?%v!/Mv2 0N'< W.kb^*tlf{:TWdLv9{1حAݚ1krBa0b/r9Hf#")bMX=@Ա[ 5Pc\ڷ qSc͂ 5+^L *Rw۬iozhYN߳+ XHx9;9n16>+өlo8yFk5C9o^^O+ l+ u5ëW *ȂՆiD~RO8ʖh4U^4#bRZ P#k], Ǽ+-'KKV](S>Go6Ϗͧe> stream xڭZ۶~';k;3n{]v. EBk>>rdw@:3,}ٱc՟w+09vVv(zX 7nRjj>kY=eꗢkZ86eai=;.G:3[T w@`[9*JMԭI[:W$vzS)}8t P{@J#9>dMV $Ag.^5uO,zP/"p2TߋT)~ 5t% QL Ҡ>H.w%DŽ1aOvOx0K0_+5E9!vY6h']T3Vn3DX` }7Cow]!8`UsCnQNٕq]'7dhg!k9*'c9eO(`UJa"jPeVO@pӁUiS: rr\t-7 ~- åҖ!jE'TSe 4 Z0dz:~+v?tyl qqgF2UyWrXWҡ;p0ҁx ;TLoDE`C _&52k#|Xk#SNVTNpFE=%R5buC˖o#sU?9J+N)#-_H΂Eݑ+O7;0ױxGBVLX(/YRV <=%zGV2K5 =";t'un m";/A7MQ;0tO׬A0 B`"ʒIaјq6!2I?xcąN`61>waALM}x)OJOMrxM|* R{3¾daLY*f`P-ĄvקPe %I '>Wuy}0+F %_ 8B'xLr2 6"usvawFDK$2/ &U#fwuRzPO1U@mUT*#]m.$!TfxcAr$\ >)MhUŮ4p</cx dg ]ͫFz紷!,-\ \6o<eo x>(#ԃ: NcϠA' ~ηi{g Xh3t, 佤D6dƩ":Z'm@L Ei) QV?|$4^ ˅jhf3 sz]&>(BH_u M)Ot fD7 Aܲ$EؒtVkB; >01@4TyyeЪF*L=]Qf|$B)!t73?JyRvR̢K"躔dj2t# fS9Y(*)5fʮ*/T0àf+ǬiD ϱm|Û+B:~'"i?˶ȻZ5u56 5$gI 8bS"|%pa%T/# ,bw_B̍APx?S]WW&p3PXuwr".m2+]* H?w4Q..pZ|~P tK#3ZZkp0f (+U y١1~$RRvωR`J{ D_9T[pHҿ CU=yF)SE*Mb4l_q)f> stream xڕR0E{}ŖR,YN+L*ȤpbdH` l4TT{w T 9g("@In%@d| J"Zš1ՕǃLԾuLhzic;͂Q7;A޳[D2̖\e NGX'S`lj25IOCa¥TAMp^8ue10\sLP 1\XDĥhGn/um/b~[3UUml endstream endobj 7494 0 obj << /Length 141 /Filter /FlateDecode >> stream xm= 0=ɐkrUqBU\j?Kqzp @'̯HfK'Ul1M9X7)#yuy9LJ g,E]a}0"t&QôK8fF܂1^8S#owUZ- endstream endobj 7498 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 7512 0 obj << /Length 2339 /Filter /FlateDecode >> stream xڭYo8_al^dVI}ئiER4-Be[,$_3eIqDzH7M66p8|z;z>VdOh%̏b1&x7tft&Dq9F~\dL ۿ-m^*dLluzC:lD-D.wY^(?IbL\Sd͈V$2|q-m: jTk[M돟i^  YDM˕9SUEC]:6, Pfv6-65Bs\Mt&@˺Idw?_ԝdaX o[gS5o=[eo2CaЃ Bt& ,bssI(U]iqaJ'$$xה""/oiЮ}4 R("˖O|)YR0p8FSgesFaW`wt5.B>E=|T)޷i14.Av|HB@|x{PTAlT#琓S W"4//$^Nc9pd̃ƊHP 3f4j` UY.YRzF!e EI99 qdmkɌpr#$v>/yުf#9ZMNk5X AMe7 ]1!'BVt:tt0@ 0 F TJEgd,?ջc˲ O Da+1lƾAo]N5t?BEQש Kr_+ Ŕ0P Q]zld Oܪ_M Мe7/6-]>Ji4#/uEimykk^sbڋ"+o/w$τ)$+Z% et\6G*6`œcb$ڈ\St#HھQFSHD?5+JEWo[JIJ}t-t#F=̻Lƒ:/,8#z"ΏN a1DO CX1w-^QFw@cNp݁8@KѥkeOrzв?lOMQyEZo)|xXic bu/ £[ϋFhbibiOtU Sj0S?l6Kl]!L~8RhlFGIHݫ#Ub߼6o2MjW슢_iԜLB,Di`nW:e endstream endobj 7535 0 obj << /Length 3151 /Filter /FlateDecode >> stream xZKsFWBU23x*EbdfmI+Q&)@$$~̀R9쁅A<~ (F]0=G%F3>a? "er4MGXRǧJ Y?dSe W!l|}Unfs&cWXr&ˬc_X:qEV6h<=HH6[ C;T(Yi$l' Gs9r=\ڋ?D瘲uȳ9tWOʃM‘qg w,%:K?)^~NUK8ZmxzfSe1PX-$Q(%o#n#[Wyfn>qWS]~y׿ OOˇ*SڑF2]eMno>\}|{p~q6֍t<; `|/2/G:M++P0xr|WYGIVeU,rvy|ܻ#@"KjlG͕퇲);Bĩ/=?tᕺY).ҁ6p!2ݫUd({5?\2RFbPgHuŀZTuY (v@zV8[ =uFN r'_ui䃲s:de ^g+6ʠB ]݌ 祑k4^OaU/M:J/lazj\xjOyhg{j:p5$߾_{sozXdXa xVvX}7픤R)4i'7 &S"3)I rtn*چ`VfӺ\rKr|3CcW,1 r!&~E/U-xdKO?{K`6UJtWfJbGQ93Ze0%GK_`ONǞ{;y=2WCCM--5 PFh,, $Z2J[/uC 6ÂR J>~mu2tpB#Ï8MstF{ (GXFoHyB£ ʂMAEp _[R@[uu-ح#4%I-9{rEH̋$~40 >ˠuЄ<`PM Otnxb2=1_:;e~{)( E]۲z)M"l\q|Mq1;3joo |0V~^U΁ʓ, wUfJI#v螚Yk&TxtWur4 ZÝJw0|om\t+伐VuTm|OZᛪHu@@G$ȫAK1m+Qus0ʤhkgQtN}Ig 8vb!/9`5Š6uTѠ |׺2caI2qESBv z_5;HD~;cw@.:mwSLnٝQZж;FCv7D  3vE@G~wm6nE"I6:5͈ a 5)Rg} 8 I_A쾕^g)o[9}_  Ƚ={o3Yw::H-9]|rc0c,Uzڬ3%DɞX R> aN{zAfru5x~ ^ț{ٲll xm7%uV t(]aEWJ!| 3/< ; dtAc  A(B$ع 9 (o%,r [yn|ƃh$Iu〩)@N"n-.TX8YY4q1ˋw7:Y8դT;NHKqYU6tYqrP޺\ 'n ]n4å x+hz4w:( Re: )sTih@ du2ʆow~-VCh!e LԛeuvWu‰;/}1Wv_eOsŃ8=mz̊l7o0pKlE㖔oF9Ur]7p> stream x[]o}/9 sk61bަA!vPW*dH{:N6n\.5.lRFEOVy_gN'yYc D8{y(jGR!f<`! 6ـoT IeeS WǐljS6dmJ J8*"d ,Zl3ual#1~漭orԷˬ\N-`C;9+8>Y#SdXc>,/bj)vuQ+*$h۠xU0/s$VF@dvcV2Ec^TvT1B!(* I&fdH>,VH~ʢA'c#ҳB}k %$-ЂMLYES`*]&XUيE I6-l lZ7u-_Erv/AfT +Α*2kie 2" ]1\ oza&Am[btA@SB?6F NjsoVabM{OM7p]oT_=)FPǽ-k䉚<#֟=< LW59~LMN˻_ ^4georb}!n{byj&ԾJ7o^SodJά )R]0Q{!WXg ܻhA׽o-hj0'}N`{k@h?hrZBFN42O*[FTʚ;N:_,feY5Wo ahġFjvh S PY0Ck5b30t#F}:߬Eи'Q4'W}r0~V/Q7X6 ٷ `>b+>6-#IA 9L0 p"AqY軱;󩷉Cmh3ۇ@{@D;oZ s+%Osg4mXApwADiw+p>m mmw}.c;#66 C(ёeQZT 6i!n*jQWLi!?n M%$k MȾd-<#ǜw^Q4҄%QM(jBaAܗ 跜"} .,"Ю p[La;!dXo2`flҗn/ kٱїk+CAgrqm|zHC5n089B,BhU_5,7N>,?,G)tb:n*8TqtPơҍVW:!|gw AZ[Bgslh)2˦5ָ.&PRk ̏ (WpH:Y[Ӻ:o}f-;4G9dmJX廃ItY7 PǛYy1"Nڱ|`Vè]_ey>o>Nf]:Mruwi\bt,SVJ\7{/~TO3r_#kiu3W}v\\)}Wo0Fdw9xmsԿ;tv?Z'Vyk]>e2%\)|ijpC ah1 P%Kʔ0;H&;+z\@Wo.~jtWcGmƗ (!+tr4HrdBH/^T=Q m^|sA/[փ:]Ѿ,<_>?v2&PbrTXPA }=>ńF|R 5Q;#gD l !M$ʕY?u a)n),zqT.xm7=m!m7Aq[uo-وo+Pذ`u 1I|IwR4 L墁r@h\4P.CcC7979Gc3rpz0!+U bH:6ǥ9^tcy4\ćfSk %dӉ7+9sHXA9kr[lv6+Jِg K(1r+&K(rx\~ 1hJ+c/=1Q̔l-k) 5@~O i\Ўr/ *0Gy@f \t#ؖ%OM,M5*͸P& Phca;mKn$WP8 ˑ~8mA0(: rQ, : sc'bo9;%uP ^X#vg;|8G&$yE.y\'~s(/N_O^|çWX] endstream endobj 7565 0 obj << /Length 3052 /Filter /FlateDecode >> stream xZ_s8ϧC왚(_M4Ľ>d%$7}RYi;;s $AlM'h[LVbM3ϞS[0g6~0]~e^E^\6N rh:ȆVkb7 ě& 6'Źap&G>֫z6w'oWK%ۭe3n?+"یӨmwF3nM3I]U~ OۃY4V3ǚ0LXlDfzԍq̶Q-jKvZш%xWɰ\8>Oh{dn,t]g{.mz Р -@ǶT|K]E-l'$>t$e*&tjT5w RCYlHװ![Y״}tmd?tBXJVWIZ=R+-y* Hu.^#T\kʚ=>-;L,e^gZ䆊,f'\|I°3ϱ tq.adhx4I40Tk2u*(߶`}ks\fn[ϗ,@"D+Q֗?,RSCbOy^eI=_TQ+JMQM}Oiu/lܝvi݂A 4-K'Euy{CN!ouč]wgWTe{p3ZSo<6mOwjخgӥ;]](ҼN1} fa:8m: +͓45ZžKzI:BFG\cUj]첄{=˵," r?_ i/|t gkݻ^R8l$G)T[̩/GU_(7B6\K*+k]-nVE+iJ7ܒx|/>iT=,rP&'th ,/= =VRt8"FY)^@.P;S%gj+У5S^nbzrª`Ph7jT)OM2t*F" :x O>|Vf]Cz{O š=<;x<'!p!5af;tND @h ʪ+*@v ~OOqsZwدk7maW0B4W8F׊z88(!o8&ʶ눘2'l+I>`!2G">)Kfnmx:JEһ FI\Yh_^AŬy,?l#G4<#D[~R\8Jt*uz;Lev @=А.yhг3maͳ5>%P{j0},{5ܼj{7OretTG=^$_%Ey&cbD lxZ,G.qsv_cn'D,Qe}~ iC~byw}ey3^$)MFmtpo"Ϛ>_: f7jYLYñD)Oyq4+5Ww[ws?{amJyw2Yvuζ,W{Q@x ^\jwWO'wE,y\N_MNEVR8T)=ʠ`ޘ~_TknQq6"G6wzn Sh2"EM U~~/ ʌjZ3BaAuO *B*hb񨑃S#X;!D!,އ2 p0@.N{/]86[ !U}ed44DW”})h1vtQIuH>x>5A||w狟WjջFg,ws<& 1p ur'x:lW#pl^ ٨GF4a\'b< *س59 ű8_U#} J A7y۝ytM’4cLܴʰ /a@؁i{%q~q|8SQnU/8E: =xM†g\fƴ#ݷHRjn@v1xctSÙhœ<>]G_t~w%MCq.I!SV5Wg1˛wWˋc3qqTG'N`v%6h$08Ýb,}_&eAg;SbiK NN7-Z0}W$$΁{GI$ =hItLFnP6sOSnaٮbm;p@,'&Es/ںzZ#>rO  endstream endobj 7596 0 obj << /Length 3394 /Filter /FlateDecode >> stream xZYsF~ׯ[* wA)GYJ&I#1pq_= 0$(A⠧Þ'ًkaO"+w2$8y:eOg{*WmhzUڶXU'7չeaV{cFb+*zӤʒ%g?=q)E oڞ=Iljmq48w-sOrf2G8{?{~ۙ;m[ɦ?m$ 8~/ϊZ[n+K7TSXv*o 4܇e-nAɶ\AXIj^J]ӰilH~`8 @ Y\bMo8 JRObj'np~!aNNbࠌqMu֙“3(߾F<69凁 0 VeR0&U?zݭl]ˢ7e:3-QNڔ^1\<7t>B>qĆ`"  c5` *P['`Di(59x{3Hc:圑 cRu'h1h YީQaffzrc.ng #3AΘj; ;A6mq1},eEhQ/ INK3%aEw1ing+.N(;".cnY iɡ:EYZmKc+}^|GV 2fɊF®'DՂqd?oӆ5;aڔ5i9w-֤yH9$MHXeX vGyR-ۂ[ȃ[*U"g'7L'ܶ ?1Gsڨ'#!i1mT ]: f D%|ð=+0V;ѿ2QaX' g}4wnQЉf$ӓwz7K3Kmm@aۼx۠2Muc|@wrXvYp7UϣUOFRÒv~"&)!Jq/'d.Q,u6!/(uңy|/4eqh`7P3nle tqa1eqx*/C+xqGVx,dtgGX4+"K4Kod!LFBc\9\q= -0(t;[&LkPiʾ$n/^'#0ͼ/!/r+biƪ,|PTmV[sovߡcE0r>}yd_FO\x>0^VjF5<5ۚ{+Ww)+a:#<.L1@Vw}8ݕ/PIm m`($}QbR-#cU91+݂lڎ ;܆(ox {м8͛C ej* VSC剔Vɶ?iH,/}%Υܝ8]^/__7?}ug\q-86WuO+sbWe*b]k)t{`ψ&K3&ܔ$@wfuR-:/(^݋.z%EnM=;~ʶDwèystۯI}5F_.3Ieێ$-P,(E9GN|+CgzB&1kRp"SowܽEojoWVXW:@~jsywrpaX>rSo&%lc/|:9Wi}{|OgЇaXVP:_+yyZA15,y4i*wXY c Ɩ'mQu-XcIDbJU7`~:2<]C|_mq ҇uɲħ UKlEy?eyN%udc7<9q[4}mV޻T>:cЊĿX?#,j˵=K8 `mBtYFO4i=P v|*9pA=3"]ר/Ke _ Xb endstream endobj 7610 0 obj << /Length 3263 /Filter /FlateDecode >> stream xڽZ[s~ׯKg Am]7q3H `Tw҉ă={n{l73f߮/N3_\ךg;l>i;Ku0XH}B7eR/MC%jmMdxHX/~0jvA}aϢŧY } ٓG;yD 3i3q%;.rfO܁F܆a̲a_FlHWZjA\g{#wzuf g$9?M$QM1B~n{bo͙-ۂѮ?l4ɲhPسl|d˖Ҳ-۶muI<[T!xy,EЪ&bQ#ټMG%WI@5ګRWщU6ǰS]ʿx; 'Ohշo/ޞ,W+k|ҟ?_3G/b'@YLO*ixj$IFc);HpZ,2ǖ`.|LI'$%)%YtF*I50j m+w[Là=(`m%1%%U0Y.tufXܜ)ÆV6HqqB/{^xᡔ@O`r#pe)L tOJgY7I QPN PIE@ xq":sf*XFhxJt*˽m3 Ic;iC0\4ۡ'CA5uVi*PšQa@<: !Cy2yqe]&Qxe0/ ,аS=3>/RwRwѦ~ȭG/ U)?wsj^^J5 !{)飴ÄNAI6'Bcȩ{T8&b.O7Q&Q"^Mq[ -MFq%MVέ!_!`"#}Uw{@H+G6';=Ja$MY-M)of#,*ݽ r"jKڵ0>L6M]Zh qu f³Fapjy{XmV友xi9d]>Ԝ`|3sɱ)hRX%w$&cYi\`#Aw;M[[;َ=  2_Mhk6rx(Ni E 8esD]2.ٜRNZ3z(B) @ՄgɄ1 -'e#"+zdX@h&L q`X)/ջLr- ^0+rH1葏28ˆDTԪыɭ)wFWp]`ch_ 7oe%7cңq8ZO-@{' k5ՠ:c$2u $ F,A8-hP#ض3CS4xwdS9\Iz<"ɵĊHZ2 5QH}yBywi/C*m[Dh MkDn,Ɖb_.PV}X}r)_\ UhT.b,zj==]ZDW@+CGj]P>.w0w&ErӤ>[hS϶%.#@}w_-@ "a+\kz5}'3U$9g{\7]&0fMi~%6.Fԥb? E`۫-'vb9c*vNp(c]Xߐ~gbUg9aql&L!u0Dzcg}"aRQ&O[%*J**cv즅,{u0YC#W)|zv6A8 ,+1xr!PGPG@@HUH\xuk&rY%ȷܮ ^I/\#ŁZ$IHCI"ԛka2y _JTa6& q[ivJ:ʃ.}C3RMzVOg@Ѷɸiz\/V˫YCcR='pK`ɺ&ސ,S[f (k"r.(8*-mbRua `Ppw*vvwfVZXXDqunYd_&5D)˳&XSZXkzb42* ){i"`tPz)^O Aċ7S_x9K}s\.m'UWPC˦ ?h3צZXz"Rd~-/N~c)G=, endstream endobj 7549 0 obj << /Type /ObjStm /N 100 /First 976 /Length 2432 /Filter /FlateDecode >> stream xZ[o7~c(kņlY;C۴ߡ<^ot2M s8gs?#%DF  6OD#S$*x)a58-,#;X,gp)x#1 ya+(0 9_j:CB:d=F b* cy(qo9DšM+5oF(u環^1tc^|s(zy6Xf!bG>I@bszVy.avu =l`71Aslr#-p)[ x-&<1"A'Ha@@q0ĺMxK((s6K #G"F N; ۤ$(s:( X[j:d Ѽ;aN<(Xv(ZzIM=SҠ9$:7uVtdByAQy]([~a'ӷbrΜ,CYbnr휑~b5X/Y: Ne;{֒hh A) ܌"(l!1z2bmXBb^ 9bUXH:H8Bm882Z˙l2Z+?*T 35c3ĈD H69E$DQt3ʋwfbP'wA64Xk̴tQoM( 7u=@On:BX՗0G#3U10;Ʃh"A`$I"h~ [6-z}zvl0zlEAVgg>@@)7 ɯ]51hY#; Uh\Ãa]r>ԡSѵ5ds^0ɽuvrjThЫj5~_^>x|_D_QrI7!wj3yh1_'W?6PO7b3s9q]ƪ&󠓱&3MS5:BX^hX*FR f\߻l-7t|_:ħd΂: ̃B}IŽΗ^(!:(%bdn˒2zHh1 eDVjH*BbCl0gB!B9 WvIĀ[_Hk _†qKmbTȅbXZch TuccETbT.vByRw:x:l|7n#}= YP#ўﰤJ' V|nQ¦<0t:ǧ8vų5  wGsR E8"||B/::_yA ]d=j=zT@:~q6#du'꽳yP%I cY7n9?|q-sPAj&\WTU]FGK6BbDF{Pȳg樐? endstream endobj 7629 0 obj << /Length 296 /Filter /FlateDecode >> stream xڕV0yY& i`"Vz@RM W&:#Ww1 ȭ1%7Te)Q$t|f[3/> stream xڥXo6_a`5H؇\h+& Ffl!lrp(ٖ%}1iofg}dS>\{΄aqLsfd-g7ݵ^,4s/y@S)n$Ret./lW%OsoK13,M,18 mBC^մRv[[[E~[/[جVm ghhÆ@ݗۺ}\yg"5-ga_C-4=]!Y*DRI "fbsTvRwSJ"At?Iޢ \[~}Bi`pOx){Ul]ص;}%Q^iaFlvyYT^qpqǂSYGg,3ikqݕת]lyϮvX }1;;۴SpNT`4Q!\=-~&(bo!k:=h{ʁ)\}[5n Q҉Sըsu!(8]O 1hz,;eEByC3[6\:R/EDߗ^5t >ѮƵ- r^*z'WW֕9x{Hi|&f5j'Myso?_˻_oN6tRէ㋊uILTsdڤ$ǿ<ٛUl192b)0Lq*'W[\X#f'9htUvC}=HGi>!^5L<)$\g:K*@n{A-q'#kQ36X޹,CskچeΣ >5j_h._UYlmQ 2៕me)%9 dI+4x:+qK 3H2RFY`kpBEUBP9lm^7mNvC2T.=B`#_݁W^ fʩdУ#D)}=51!{jEZygqpe($at T$_ub_p'[g$SKGs0y{p#bD,1#o!Wqv!RL <^6%bh THWp#@&ˏ%@`k6PI+S9]dQF4iiD֯!5}].Y7]wы TSjZ&au:JXRe \ϰ{:NC;uHhwT- [mґ?%bN!e$&"qisT'%~.z$x$}N[UOkW8P`-qNK &x,m㘳$>}w2/o2Jܴ|̪bB4H@*RwEe=Pp4ёDJ$j܎]&LQ'{& ®4U e|I&rx\պCgw7(]ÓCTC!y?{ ]U coN$-(&Y#Mˍ+vcx̡XL|ߵJ㊗:g(Br_.?\nikB}7ƒ࠽ժ!N"t+tw)5#;~/*dLr$Dj; W|k_,z|f"2=vSb|>f}3Z2ғ*(!78nf,svɐ%uuϘH3!B"Î꿄`r@p R$1Y]|_?\l^#7w7dI endstream endobj 7656 0 obj << /Length 2973 /Filter /FlateDecode >> stream xZ[o۸~ϯ, nvOPm5*K^Knë.<")37z'/N~:y+b)$HI9b$\-'?~0={V7YYYh1mm'rrqu WBb}OzlID\fUi9_ %$E$^s"/Zk*(:߾=a:Y"=%bNgeٱᵴ^ћ,mߗf%-̝{Fb$hKn,AK/WB$eEXz宨)EI⧿*$&]UmwIk:&T?n3<-)=ZeϊzB Pq3.'Ѧ~ q04'j4 A)AX{,t^;{q2hL7zϯe8CQXa)G1 4 #Dԏ`Nġh]*uIj̳eWTucč6\`LtQ*6Jꕑ~̶  ٦_C 1dX9 6'v2bp7ۤAPM-Se`嬨Ee`"!+]}| !%fC`x=11tc9QL!\^Y0S0 oı`=w)ɞA/^9{ J6lv#|qD c+`RuPآGm~=l4DDG9ﰙ!8.-66dzLwǠ5w(pSH{!" (` s( p>3.ۧ]1 T ;Eg:d-n.D Ƀr.O1b.4Lc @{O0꨹xf{O>㚓_;Es l`N Ylɜ~+0zzW]S˙4T{g1N=۴IK[=p C01#F.]<_17;\g/QՐJ&fxFEKr:MqWm fDS-oӿv6uOkgIGf"kj0 e+,Ã.HA9{|yc[' Q%kתuZ<@jA+X)p_uϞ5o_]xsy{.`g@dV-*]D4\Y#Iy Z$;!:ޚ˃[2WֳPˆbDMՠO"]V߀?~8|v\/= kҭ^,]5[2`MctgLcW[U*/i}wMbi/|}  6zܮi3#sg|L95@c4`l~+7}O YO̬(pMNW5̶}Kw]صD@4goEC > stream xڥksHjD y:ȹ$qF;{0BvRet3::{}stPJ1Y|J)g~ȉddy=w/sͿs:8M蛲B)_﫨_gD` ݜ(Ux{_tܯ3JD\|<5ӓǐP{/$sFyI@MZ@yh@"A#Mžp!F5՛7zdNV/ԣ.qq+]l'@xkWSMfN0H|UW"UQ3Z.HyISR. MT}|iuf_O5)"빏e4L[0UnJkbgSw6^=K'k|3zVyVug629)ER$ghIx1Jr} \hu}|=rNfRb@\rqV+'I)ޅ78:rÛof=_ -rk nE1H:ᨥrvٽ%DSLF.ܯJMhPz Q W1ja\|?\Pw!y+Q@d۸9}mF@FqEg݌reus!3}6țo/\6Jp4EyOdP.mӢnKuTi([K{p?ȥn1G=P]n*͔hS&On:FgS=֛/wi :ϸhh^(Ԇ~b@hK>p*6􁱥IcyGTinE/ J૯j/eS>M@p[T;pxWc<9Q P^Gjjl563H=e?*y!l˛|֦8c މPC$F҄@cv/<╣-q&*2 RB:  JQq EU)0V,5DteH33YWcܫoC3fPi[)ٸ#/ӨZagsp{yv d#~r7G|ڞs4WE}"ڐ,ŞzҸI ^̴ ;3AC뀡\#|ijڤfFwQ !}Ҵ2HR5qT4[F] Idkl3y[Ӂ\j0TеIu.md4X>$.F8IM[ckfmp06)ʊ8'L XQYi7!_/Y5j@_VM*0$E,zZ:jnc.<7)4\]k_6mW@3l09y[q xH8rVB@Ftc PXQ2$Lg|>Pz8xK֚ܔ)R#$HNOF) ܗrP5P;, QRqKBs~U()t.n 8z{|eh\i勘Z&N pOXzCc΃e%ANR]GYJ*)_$BxaN^'*58I"ְ68L=Ud<̓Lmi.\5t 孟o/;a][ς1Hlz(#)e}LBPqw[g'X.ܢ >K  YѤ9YQd1$ 5P%_b\=g<M]Hwu콫Mdgתy?@[,( mDəmTF%;U}9]aTje__4NaqA|ِ̊v}v">{ "E/"6ݖZN{mGO΅&jL]WY2Yr#ؼ6Om F+tV[׸xUI1,28ܽ`wt t]u_p{> stream xY]O\9}_v!a)٠@V֥6}Qd @YGC}Uro^3ɨ,duE@ʦ"qHX$Iʅ"I% bpFqp"J^CU^V2 *Ǥ~`tsPQYk "YD2xFˋj SLQa.J%b82+Pˋe lNсS(o7[!/1EMaF/S^@h,,BCVU٢(tt #E\p X)I+-Q#yN٨׿tf(8[]]}4:#tT V'l*0%)V] ܨ[xa>Up:C{ջ'i[S>PIwT3~E{ }͖ eA[["{׍/:83<T7Oc~O؝T8~n 85?lcӻcFb4ǫey~;]_9̧?A ' le:EGUWpOonj9gu2=_[y87y?l[ O>}}W|<sqV U`NF^au\9gR%ؒTJp0Tc- WR%8z\{L`"}%|6}aZkIaIyJ٧!qm,znu#7f-YcخYG(bo!rFI]786lgi,W/,麭ClqP2`d 3M`r39KFS%!@%DCr *8Rr;uGmjU6TX92 ]jp Yl#z#-p$x\8|sywN:O =`+כ^7֥A)9宖6QP:[MƓaWON2&{kTr'滣M?_n1%8a*8eI.pQ]8.r:ڢM\82֏^qw-4'Rq&tF6f[tƙb_Ɠ?FYeXXlj3˂}6C}P\hqá~X.o4s;zg+ϛy_Lh&W[c> stream xڭɒ0Zf<)U9h͂g(!R-6((E"GKL)  "6un*kK]Q?$~ԔC$! h OriN.sD n ̓otrlE S}n۔ySշ1=GA;c #An}Ƹ )~.|MvFtuQT*d)`ӓJ\/t./dAgUCSt:L(|rsye Wzq涽pl6Հ") "JI*_ƪ#&L^o b6)I ^yJ /0]uek8lM8l.<8bLƣǛcHR")7=rLN/u3 % .Rg==\bsnͻ\|4rP6r-]g\X^m(csrw",V cdߦ so?B.q9/>`wT1W;lkY_:_iӯ?yk_Xw endstream endobj 7753 0 obj << /Length 1121 /Filter /FlateDecode >> stream xr6~ J.B`wm%XaDX"5$rɑI+xs@0@}GG/i@`z f(:_FowQ1`HG8a6*:ge#Վ0Ҽ"3 NqlCh9lc#8ۛh}kZ) Ec4R49Ryȯ[OYLb`Ә_UpmeaD ̛OɌqg mX. ' ;am8#z0:]lDU*FT}e?ȈF'ykST**f*U%@x)nyM2/UA,(y (QF|մU01ƞ]C0!qKՒ[`6ϔsԕ3a%W =% l$2f<,WBϪÖDJ" Nq ;pI)[%qK#y`nTB0kn`olGD…(2< W4:rif-.5jފYn*$AJҫ[:NW6b>?.h29uD43.e^.,7|R<ЏDlhėX4d+z/R Z7e4XΥﭒ8I|&cqZۯJRryyđm 3~k*izVnE] Jp3lNvٕeOW*ՔH#pyfPŻ5/:!w\)IU01!(HVI1у OR̍TE^[hZtlh*OmCoBJ8w3@;XƼ@vtk7-5GeUɏU uw 0/ޏ,N g17{Ĵ_-^Sicm1B~ /vVWfG#{aozngTvh=ijJ1'5o?vQ32jٓ9K޻|^|ε% OG. endstream endobj 7757 0 obj << /Length 259 /Filter /FlateDecode >> stream xڕP=O0+h5NG*!PuHہ6 {w&WwZro-Jr+Bh*˕pX?ul&mLz&Dd5{Hߖ\UQhV x-8ŵ\: 5Re%qmS %[j 2e\ŏB(LaB̅KUHS7 ۔˴eoSHϗ= *:ccz endstream endobj 7766 0 obj << /Length 999 /Filter /FlateDecode >> stream xWrF+*UakDKRHɥB[H} Pl^{=PH(yӡ'psviaӌ ?CjM '1KzeLۄP8A-(ti#x=ɫzʬ,UAV-e}{*mޜ^S91ZT2`iQJ XB;cE,A&zH%U#>.9#f55+==vat8'%,m`Іoϯo)K>wxjI q(jsJ~9rz/dwsݨr=yq:ˎ}N9 S ,y/4̗^M\*ZJ%:c 7WQ*]5$86{ٿehGہfUX\e>ɳ*FCi¹8߸/ pY1DZ\ѲXi A .v^]<>֍]U5dK ;wXMe)%M;w)+%_).&dg:3 =+Q&: FS::k[!hh0c1C\b-ʉObzV˷^ U d z՗<ͧb;SpXLQ R|M$€u5W;F<GJ# [빁xlξ3C(s'd` )l3PH{Hb*ҾkT3/*So$nT\8Ygcr% ȧ endstream endobj 7800 0 obj << /Length 1818 /Filter /FlateDecode >> stream xڽZw6~_9* IeMҵ,qևLJI8uÐ.w6&> ܟ߽t[^O~O^SlI XH aEXd"3a*?ӰXF˕iQy&/}C>Zsrfevr63![dNJ$)ɧ/ [ #Ǔ{qqҺ5(W`r=P %`7I2IOS&(}U߮XkPZ5s0bj~kWyVyE4stZ:@t-xy.ײ>SZf {gA"ݚP_7L!7S0^pJlX0m5KbI Ec+I56n 4[Ie7SѠp<˘ C`U0q6I@;: <;Cym k?3:[yqN'a9L%Ǝ}_.xRl/pHSt%'G?*tL^%wݙ?[+0GAuh8ͅVID AԚ F` f ޺[0@FGu BG.j,C C "<7nC^$hu]D`yAAdC~oj{|B0ƴ9{*a\+r断]{X}_mm%i27@xZ&RB1R-OM:d1/b2p̡݂4cC\ *N9f(A9jU׹LJKD{пwXHn 5HF PVhd 0ŝˎ!+6i8}ocw k6]qGwa+c;$Q@"a;8e8(2?/_`>N*Zjp}FK^RZ?VC:BX}㭢j5.Wjt endstream endobj 7712 0 obj << /Type /ObjStm /N 100 /First 986 /Length 2739 /Filter /FlateDecode >> stream x[Y~_!VO@0J $a c;+rvlYVbcED8$gB,dHIORÅ&g%ꠘdSA2EM̌A lȱQD tx. 8&L @aWg0&o0Ü=+g GU.pK2!]3!눌HI:b#A I@IJ0R|wHsE U8@ $Zxg|<*=A[^}Wto^W_4WӏtOwο|=tw[ߦq}vѼV<jSB-b&0oN)v*;@c~N|o|v8ӱeT-Df .qbz Op1?^ t߿ۿ[pN\cMDbFM(=j|[q.MC˴H ͬg߈Fvd =G#uH{,r%1|..~cNSʣ5c B6Hm8s,48K,48K,4ξqo}g87ξqspKF+y zdM-3+%ZΏPۀ: M³PP|qV ŗ5$M INyV(i$]$L H{FBiV&z<[PFYERY P(ۜ/ edBPp|BJPВ` * RYIF'H!PրQ|b BY! rR7v+ axE7d", ((MӬ2Aab D;7o'+A]B&`^;qy$Dj7q(AIX IO2aTE,5ģ8CA+yV*BDa&>>-'F8+Y}IpRκ4+Y!%3 .3yuHIʬP0/e5|u韡cYPz*i9eV(+PisCB9[Y~eI)E+Wt+ A]/v}O(K$SIh;v?x!CK+LjK##t#߼ˈ{P4ӿc;Wy qDs:7=\u+7ûӯn>`77]XdĹ01y[,=/@}!9CX2觰vVO}&E^YBGCq w0-xBb6#QaD%JzPni;39؉ Tο s.`s.`>@F7G p*^#(8 KJjՑ$&:+\G +aQb5!I߉d:+Q2;~,ell]>sKܮr۵\nr]v->HJ\8G㛶D WmrE:Ԗt)H۪],Q{|ݎ0wwx0L:Ų~d/G8ZPxsۼGjZ^D,+ /Nq?w<[vhoDwgZnnA$,T *v6lMWCOO㈂82)i`:pgVeͬz{_?y'9)!:?]· qP#-o;y[.-sƓv4ߕ\h$ߤ"F끙zq r6?6QE71%44nJDeB͔:x6慣a=%6gb게FgC9t`~Us}dB91 >9'SX=zSm@ MxsŐiHC;exlQMy_d,aC/t}qW،P/j)"y> stream xڵ\[o~#T^y Ї4IIO maPmIWꤿ3{W(d\-3{Ydr?!W?\}#$LOn&1 () #:YN~ hI,"[duQ.+p3HoR旉I(tiI477W]Q%4&I01Y<\,/4<!y(zr}+bFіѐEX؉j!$iHI hMTJ#B%m%e "AY2=)A~[ .&ʫmޡ($qƉT 0Sr]{`BuiL2XsʟѳU$~Y!ØBa);d~pז3kFdXfi OCqP`zw^nakTo[e_a/SI#cOJ>AloE,=F}~ѬQ@}<׵NRr)/N Xl"p".aEV7O|wM<ŝS~zdԼڕx% *y* 籽UtںcMIc75+sЪÚl"lPOT͍X?Jv`Uwtw×-l"='eG rX EdX2L!DB&O^6 28jCQTJРMa-fPTHSYź*ٙ=(Ȟc8Xm!1׍}iڀe!ذ>ϥ†g5) =Q,ך7F2VŢHck #hP3ةcv#;eX1 WFu>kuGuVm&AcSPxa2*YeX]1(Xuv;r'^|ؤzK6߃dh|S 2%bp;ߣT?? ݯi1x9LK.7jhUCS7X>;*iePʪvLQ 3;Ps*^4S$vTŏEURGUݦ0rYO\?sنJ? ?UPqW%ȧ3Q׼(cGmcbvb^ؔWuN>/cE(B90i8 "ÿw͆~=ͣ~Z^Xry^r>W:R.&*?McPX !<>sG۝&c:#hk $P>v T$KA e.J-LJ`dp(lvCG75э9yM4 ą.Ia(A&bIPMJ?&5i~Z]|k_І"{MW2LTb3x;9L4?[NCnn0XBlCooP̅&9菟o_|O/oތ\l-HvGKD'Qb}`, ؉Lvm^LQ̟BaJ]/׿p* [HP9+Jo}3ZGs aM!F endstream endobj 7877 0 obj << /Length 3410 /Filter /FlateDecode >> stream x[Ks8WT՚Tg;rmBݠIHsh|_7 @ .y r ЃۇA((a@nǃ)᱊ xFY9ZLӢN,*q od~_@8՜\_# Ël"7R`4=1C/8<{GMXHWU)7FUKtE(vޤBh%kuus B+dVԫK AXv%yv?J$u:R+|uny/ZN=*,EBj.v7dCOYSkQSORjN9GiReZӜG}զ(1.t,>M6-ک[5%XO@KEJ:s,[0oæİNfB7Kn%͊EpmMX,zLU:~=|,UJw&:G~EP(εߍðmsI!o2xG<,`3p'Xty<_y9:d1?nS:Y"oeoS`-ȳp~EY(E )Քưt})@skGIAz57ɫ:Dj28*SSVOD 8=J8߳yY S%-2$G0e(hrs{',M`sGB~4U\Ի  ?(AG,7"EqH>Vm wH<*Y[Jou|=m=ᄉ6lX [YB0iN577ZpgHA4޳B La5@ Ԑ#ƴjj4KXd *sƌĀc5K]ZfO׿P aC6¥2B`hbTF7Cj .գв7H5q Qՙd@l6"qUTub 㖔vjpgI(&:r' wNmvSuI)HZihG<<+챦0N;[NNJKg5H AD΅@N~)gjh e ϥYHk?sClTPeJ/.cdgMQf<}l!a.1 d@vô\N%K>^\ߝ~OsyM:rh_f!u遼݋|-ľx۳N?TR+ 2wFg~Ob4,պ`64w-b;U%\MEn2d \` d1hU`g|TVsMfVqڻ:_8X Vy0&M*WBx&/Tꞕw=`}6cLwZ6_=>Xpz\̹g5bQ33ZEJm-y+t*D%)QTr)~a!Tu}*J<ĨLQAqr ^< ;&SxQ̋X8rv%e( -1b.( }Qexebo׀l$F0ٱw>TZ<Jg@ ᷛgZupeƲa#)A]*#QG(lCer(0\P幱R^:]Ƀd& >Ȩۣ%D@|# nba_0AXŞ1PXXLB,IXP "eP`GlOOץ?QAL9pF5˩ av5qk*h6[ STg+¶O((rEy>(X(QLce; 6A}16t؈9iM̈͛7O0#Cm/6Y~ZˏXo%JNR`KM lcDސ=y !ȓ# iQOxR"+sӁ~~QTcA=Զ>Mì_<#'CLjg~&)AGy x>, yyZhoE/ 'yA JIs lpj8[Қ5sL/(tlIɜATT˃Ǻ58=gcZyE/4G2(]\ݤU劣5t@Me`:MXp `0ԪNsYW?Sfk-#Vk * 7[@V<}[ܵ=)MO31ܑc-#~j3+**B~:oI6ǯ=IX:tvzoj3/@H(52wb~#Zk큌e@v箋֨ ܹ>^4d"t(tԯ>Ggh~2Jf<3U?!=#4E읶ĩ%EA bO/<"dţ0@vS~^iP0+JϗV u9l;01b6 Ս0٘ z nR `4Ϊz1_ո9jg]Ehtp6c` c7_cϔj!_`kG݁lmNWUawg3 n_E:OX PaʛtF?BT*MO hpT9)tS]G\7|a(.q endstream endobj 7822 0 obj << /Type /ObjStm /N 100 /First 1000 /Length 2757 /Filter /FlateDecode >> stream xZmo_8`e9؂$7M 㰷 ') Dmusw3ML.ID# >"$:A$!7D ?r%@bDtc<  + B6$TtN= .`:z RR2&)9d9rWr(:yl9觀 aHlŰT}1Bᜰ[2d:Hp؃HTEe#Yte&881J兓 QlBı@R9!&$6b 1*.nu^ϼDu 8gM%=%ɺY[AT DVڪ 5-Iz%2XH'GG7 *iͪ UƧĉ1Mb` pȜ)kS]OC% bo`\bB{d2*QKfy.T}\H 'j (*e*;1{QDgI`XW:KPiIrb1('Ofg.{3_7{ӛujf7};;opkT!l3%'Oٜ̾mvss9o?۫x׫j~~P˾䖹\_ iKX, .60P:=E/!|ު, u9?HX qPAKK-vA8B`fYdAtg)C08͞5LېxGX^my~j};s|mWy^u ̼Xl?~jC޿xIm$됑Cʈ4<8Jeh08Hp$ ,]j*P< ,!M;}K.%+HH"Vh,G|\&duOj24 ?r"B#ՁjxlDVjLG7{Y_U^{<0 [R 9̎=7kwܜ{֯I(F?wٶ-کsݪy԰d-AFO'&V-Rh= jJ$% d XGd6ZLL-XkT?!EAYeAo:V~?Ym7lWlgӱNH]RC<ǾXρ7z{^J l:tdp=me[`OEהcս´)KT}v n}+>wa1(0g#, s X< tǯ'(`Mn":API~j_?۟P%[Az_lU<1﯎_2ET)Ś (N iRнe*T)4e/S ٲdxBR uÓ9hL5}s6#PYlɓVĥ_[.qlyLRebc"iQK po BI<ꢐa %r_@i CpU9Lx]= YE-,Yz b=cZ'+ #J K!v2,!0m;yx+ hc)6]pIٷ ])Kn$@A1E)>u.Ԑ6ʝ#zш(u3$ ⧈ tE˒}#Ηܖɾo)j0!ikGOOfGDp뇚S$oa!C@ށ Zy ;CA&B1 ^lDb3yh`d4P L4F'⻉ӣ߼8gwh`B X(VSST* gGO!/=yW?LY-$q}PϗwͻՕUsnBvsnz(u{*M 4Տ$(x_Ma!Rqb?Nճ=~NG*S+&F9_1L7]3uih Ѱ~_n ? n/d^m=|'?fRyb E"Qx ,lsٯۋ/qY?%~QȋRʇge;{[?=@!D1(u`y5C}:f<:jORfMݾ ;KTB]e~;=p>+|xeҾIM(v)c3~1 endstream endobj 7900 0 obj << /Length 2407 /Filter /FlateDecode >> stream xZIsW*UN/XilvliRA@D,Q_z -Eh-Ms3Cxx5Na(WyD ysU6ⱈŒG&e NUX2e~['n澐$b,3tzRy}3X $۹3:RKꄌ}8zyق\zMԻţHI6{ |*X-h@K?AK[;>'4miIre2^DRa7wi4;&!JFr %}"/OB@b)'G0!O?IWYߪvSe?KĽMn59ylx9"ILdnT}_C ޻,;wUB 7;+w `$BE@=$"428q 35H@7ݨ+rm"Opzhy6V4cRi}7MV7v ('QV. +VZ-mr}УHQSmP|v zLϬ|b([tLJ__^39MiV]aj+<mUWTjA%ҮS/$> TFN蹼x/&eIn֌<Wz.^b%ȓE)MuLjd6pUebByFtqO͞a(Ix|S &,` ZJ>fs6gPڜr6;|nѡ-I%vjlj=:8d67.,8J>ޡx4sM&xu= cNAQ$ۛR0n[o0 Ky]6s#M.> t𧷳4fP5y7=3>22ZUEfhpdV7&Id~pXɧϼ7l̏;/A2#ݟ?}yu~OWL4ڍj0P4u)h PG;v0LcaEH 01U uTd 5 5RZH\:{88.N<ʥ<ˋw9F4fa?.fwW-a=}BET$4ͪc]y\MC;}G0Lu<<kq6/]gƅnnqsۭq.kօ]p% ?p=3lm޴yjMI!tR_6!շj;Llҭ&%ilja{l/[m+ۼp@Λޢ`N38 *UM,8q@'3Rba=G]vh,323~0W1|6TM+y1 KnH8b"ZҞ<tnI/iVrۃ}E'pnI:[Gf`,f)1litȘW93 o }WhêΞxs 2+ sToeŪ/a4' !20&tJJXъ-2[9>r6ߪd6B5tjrT5 vl_k2OWjLwT&I| Z||a}g%v{?)^pk{~+F=HªGRґdOC{Hdຏ42]DަFm bA"B8$>2pig/g!ؘm7oDi^qi fm|p&3Y&^mj4{pުV#vk<HU({53:+{v=G.DsrveH,-cL#OO-P8!C!<ؑODpyAJψ`cg$C@97bH%c VOQ#WS3) BzHLR)JAD!]ݧ@o]^L琾'd! D(t7jR~MVG={ok\Bq38,ń@raL# 7Ҧ GJ Gпj?'ɵ͘ƴ _ kv΃koKgR}] ~f 7*e|u3Sߙ`{ΟLz(+FߪRI.tnڙϸp0MVWT0~]rk*G+D endstream endobj 7933 0 obj << /Length 2178 /Filter /FlateDecode >> stream xZ[s۶~L5S Nꎝ4Cp"H5MY ER ә>xL~{R؛{{}W{!RB0o4$FT ⍦P<RfNm:,uGy&v)BQd/]~>ntx . QH7Y^}{SxSعxP\/wWND % |4((_> @MGiCzfd@aO|@h<[k=^Ix6^Y?(T!boH(Qק뇇͛@߼}fDF40kTHJ @2ސqĄL$QY-(H8ɏ72Z,Mh)>9SW{ xrDEoX;bwX{/Y~/#c MTJxZ]iO><٧]3l˘|pR=B ,t&!tPH]y9R!JqJ Yd‘0vP$!o^ks2_sf,8E%tߣKT!Lķ&9S/14d(Y H@TyG}Z$h=b$TO<둩 CF"ꪳ~H=/fߐ9ND @x,)T:UQ6RG1 iI(2c>vGBJ3cVblXhmDH !ECtFjC ICB!+D2F)C(DV4P)4(K/G? TuBgJʀB(ID,umV 7黷z֓(c4yt&e˪$OO-MM|8Gb/!SW,@|O˜۴gRh8ۻt'2CKb5: >F3^Jc_ìڀ&L(W ̽O °T >I3)DD!K~uvӾ߸˿/igط󪎘ɁmRYtBΥa͉Έjv[})f#6nʻm{8s'Gn`q2MLk}A9XµYt)ݔ\ S# JJ2 UQ(D.+C y_][Uvw{حԮ[)u+%a.p+%qXͭM 2[.i9AJ*xt"&RgÅNdiS9,Av˾1;??ޏ7o@2Cz:~{lgOv a:ۧ773eQGo l~LOuc>vtLK ?=p^(i%_}RLZ 2g6?+!do{0a 1$w>{yj@ᲈ:uwEU .Lv(Lѡ;RlDi<ʼo((CUU!jl#KjeR ڔ%OT;>Kq 2+? %Xf)k!ŠX'h4a @?Ϭcv49 ѠC-5L0Ş&[p7!Ofe}()RD>G\UHy-v 7A6F}ŧAt̃o \_g&_fer\UrT$M2Ș @:ے`'#U/m3u;<]?S^q,%0d}d LQ*ĩh@\q j)$̘)A[} z{!H(m܀nVc&n=JÃ+zaCG Ngz\p~aixdU +WHtfjZV;@txWvQ2j&OYz ]WIJnVJJO{=.3,rcY َmr~HS~U@ ZY . .0G2؉P,Z'zmKzm@RNu0 !?#e3zL_럡[xNϻM :7i\} endstream endobj 7960 0 obj << /Length 2488 /Filter /FlateDecode >> stream xZs_3>C\QijGN'1 Y{  ȐM2+B?*zi0eieYAGc& ?E+A]vow9-m9\~|dBϻ+.*tn3x 5tj<ʊU *4!(ZcɣM }Ӭ n]b:ʢ\ר#(`5ced@K=X_rZ7%t,̅"[o\Z bX ͠wk/5˶ϑgUbWO~?3BTxb45Z{h-O d(')P y*X*d $a wr8~Ȅ%\ G(F@]|:yFVC=X<A[|ț6"+嘣-GBP Ur4L|&eV}hp8c6pښs6%d+ 8(dJ7DJ\]UeA*R =Ú'I91v@z#7~ߦDap9{VbFh,n:{&QYz8D="g80߁*6= <Q08\>{R{A:r usp[5pCQ~|z:uu{%`џ 26pKNz Z:H@ )q}h5V?c&ÌJ;cIA2!}Mx!{%U8# %%^E/+v/2 9< 8{6x |ŊOGZ<0-I\C[%2eJNW+8eL~h*z_9˙MۂN C6zェ)F9XӾ&[ tHc{ Cel(CVD~tcsnq@ ;9YAHv2 uY em7 9!8hK4Fw8-zb8[xZ뗗'\MGIHOM$D|[p[3-ִ~F3\2YPA勠Za +V?"WPtE(cXs-Xz- -؝3(l+Dzn&S'(bj {2 xc*^'M%igxᴠ1{6ŀjC pcij׾<)쯘0%bxhp#2H u~vN'C*rE{H3fpu^ǖMzm`8s.wٴY%x0|nG6cpÒd+ ~,Axq3 }sD7OEV+Ȭdcj&t/iU֡(W~>ѹ _8@Ͳ +@.=mY~|SC&|;x] endstream endobj 7890 0 obj << /Type /ObjStm /N 100 /First 981 /Length 2825 /Filter /FlateDecode >> stream xZ[[~_p7vƨR5\x!dȻ_ol|cKz8;FC9o Iq&%1"&L[)A)MHQ 6)w0&10c~L{WnEI9q7pv9BLJſ4IKz`1d9s(Lr@@|jpN@:vblN3Ɩaۃ=@WJ `D10Aj[*Wd43E^rCe 9?E;ɺ#86r1AsDfgT?#oV$~+uP9q:Jr^XFu,*^t& ɭ['Sxso?6?8h6ϟ|w{o93n=0`=f=M !O(LR'vQ?An=gYhwADD;K,gͯ']_wϋwAu=d=bof-E`\8Ool=Z>Z߬vZ5~Z݋f?IC# Cεz1G!82NlԈCѪ]rI>)TڝJqn\엻ֻNnݴՓG?>#ZHd6 +GѤZIR)e`40"Hxxfͭ}3RpNGTGy#&[2t۳p*Oΰf?/?Vv׀xT]q]kϽ ob:8iC|S1gWقP~xY\9p'sKޟffrC÷YCBW-dLXpU#"H^7KTDsblUՍ+ufFhWtx^g-@<)o's™ϴ< ֕m4FbYIus>!7һXa>¾Z1- 6itAĉ*OD MMI2MiLd$I$I$I$$OSi ?}ŗSLc")q (M0kUnc8Cs#IHP /i ZnC "?L ߴu]tCB:I.C]U k EPk۶1F?ԥҠR;G "J#ʈ^35T:L6Mh(8n+Qۤ)~H5:j ȶdE \"ڱ mlO52ĜR ~gU{gbaJ>MmuE1.A U`A:\jpCJ!9qY9]. s#5l]9@>ŸPa4}p ZN@{Epm+qEhbmbO)Ɩ]z׶נV%T ss>̢8864mj"3<>Q wcr\.(DJрuYߔҔ m>ts)5hdQPP*5v0 ɣkS+%C犀ŭ^~`)TivY83J+7"M%l,(>G>]횳I;G0ydRPDcKS"ߐ\-_nsz|Kߔ䚑~z BY s@Yo @٥[1&TUO@*!m_)uzxoxk.HirfMGB!ox:)LO!Go7d 5GQW?2 >2.XC5>T{bQNHBM) =!lq5yZ8!YDdE(^_/ +_z]rL4|s"D>`\-‚GՒh{[.myMݷez -[nk C5\>xdڷ@=>%[zG}< G#է$6eh~Wwh8dr!^8$ C,Y58=@ endstream endobj 7988 0 obj << /Length 1529 /Filter /FlateDecode >> stream xYQs8~Wxzgf*ɶlP7%B\x 894[Y2,KO߮ve7μƫ+Z11SL"Fo|R 1ej?LK}N0)"J&j.znwp B6, YTWƧ/X #ͶrR X5>4mlm234dj/)5J4S0,1MBc[+wzM:;æo ڤ+-BqH40 ,msgf9yS[һqީ۽eTү@wѸ p:u;G4Gr i&a?zi?xSI{aN^XHڣ֮Ϸc@V%BX.]W5G=W!wN-xc {cg1eMW\^yCN ~kjSퟝ|W?_sHwM[!x" 4YvLy~ ; s5l< S>q%sѽ YvPT-j ש\ Qa )V)CjLx㒰\ĠjEP{\;t9hA"\ImTȁ0q~FmHet2' ל4&Q鯑,jn[s2ZQߖ!}\(eX4LEMu{Sp aP b%<u>wl(C)2]:tW:,FL82 ,]]F^Yc޽wcm#ja-FO@ `i&-Q.di)Ek/:,\ς]?P6#y?2 KCsN!.IG_gRq4Wg0k̤c&e҉qf(EOy>~&:2|= !6- a1 ZT /c:gSɨ/$cѐl*[݄njs~f'X.VrvZ<%ҧ{99uđ P|>;ll!+1Cǹ߄s'Ty>QX(B q6=QJ(q94)SBKPKsO:vSuU6A!H(Bߗ ^D,1?s Ʌv:FL[d[;_'_> stream xYoH~_t/t]n.UlVgȥfa bb |3.Y89z/RhJ﫣0R:ʥHǛ;D!>R@~D7ɀÙFBkPW ޟ=wC6JFrv;sxyG..9=l ň #5[{̖]Lc0$/34`.T'Dr 򘭠$"\Um:ū7z L4)H0Z~vyy:G-} '; 'H<{̀}xQyBմ^K\Q݅i!-uR2Bs;>,[CE?,Ȃ3~% +fXaK=28q+,Q'&I*֜&73Υ_[wqK{ ck!:!D`#]04)fPwPĦgRsHݍxF8T,쮫d6YӲ.CkI`jXA៿ ( ;-pP}&Yy$[ɿ8$ 2XuiZ""x=,d2{;lf{Q1'ZQL2ỲeMb*6\$v֗)37(~5G~ULÎu0lI\3[L tUY4Q8ST"%eMB]Nfi':khQ}?9?XVQwc[J=܆}䕫-A. %7H5rKn 2-XInx$w N=1͠F!c t#5D&d[a)| EPOr%5U?,#O"ⴋ>j4Qm漺xڠk.0j,LktGJLqiiDHqyjּ8k MϏr恤v2kx.<]}Q"$PPs.O<~00ޜBM4!/ IYٚ%onB~S|(6 endstream endobj 8041 0 obj << /Length 1710 /Filter /FlateDecode >> stream xZYsH~WjVTܒFlZכJR.dP$V{~{a;bD|_3p_Q(9aKxE8a `*ì?pn֛㴈$Kͣ] E^؝'͓vG kc|;qF,-9v`HpӭQVPCu y$Ax8TiF{윜%2@,/3]D<YnP)# YKp@~ʩ*,He5sadu 7l, +fwZ ѳct,:L'ΰ{[`y|_gYnţ,78v$ cJ<-&CM3 3"ᄕGӋAm<-B>O/-jVT H^EUKʶb$h>7'/@A cf{8dU k^)%@+e%" 9dvj7sQn# aL^qpXs {QZ\gҺg_ަaɿzK+ } Fdi`2i3kݽYڳ.]n5|h55$-Sh'5[!@,0Lc%[UӁqWpy5p,IR;Wq}gzP%ܴEB,ڭ0bHll]9RhZkꯔ ^Z }*~rjB3MV[` 0%+  `ݶ@7 &74Sd}B fpQzK`hϭu=vQbƺiz()#H0:VJos:7Y7Is 'XF<OFr.1WL0 &s@%@#& OUTM%fs䛡j*ӧXFaXĹsgYߎ5N˸fe>Y_h'3爍uv2 ]ȦgCOnM";u&R*4NgJw@'NY' awX+7QQDs6(weJ I離N'+GpƑ SJV7}۳HzO]eSʠܖr~ZrLgn+잴v{'q +?9Sa1%7]m5ZM1}sk:olSnhwc`{!c9Egeͪ?j> stream xZ[H~_GxU]i,Z@ .*jeL¯+B`9$ev_]MnJ& SLS&\D>5O7Oq#SI\9Iڝ0%!DM حRə'`RtEY%(*aBr!9eb9?at~"NޝHr.O$|\ }^#$|~B'V );HA`8ItyJ0D[cnAHbǔ4dПd'u +$2sgHy&< $e 8%G< A[tx"ޙtLY$[y έI2{6aMt1AE`O7bLSp BX1B`MlezU\% e!MVsFEnVO"24[P%[V ٞ$-l;4GIljOUfj$IP& X6c!Lplו1pm 1q[ bU ; Q>6E#~3OyݜB¬dUj*^dz 4P8C3] #4K0']2 vivغOy>l$?=ePީO<➮&}pv}/7ێ @<=sgBYw[D1s\|N+WĘN??A3B^H667oln6E4Ms4Ms4Ms4M)bnn_\_'Vn~/zal(j >2}zg7 N}Wx~9}> 0jI: 2| h[CᤀU"*kMmĚS keZxipTdGxFڲr+&_$  8Cɒ' =fFXR(zmBJZc?3q"]LR띖Pʱ,.-% 0bcNW, ؈x#uNrqE9-7Kh&T, D-챳Ӹ/S㢝\E+!s` w:Gc瞪QѥXZ~W%Q jc*9 C:#-cFYB#R0ېX)6'ܕz2ik1{Z :%93YJ yFsC R:EN PuVRptf Vf`o{\PіQ "p7KK#OEրio3lA4/1nBA V(xv`^pXiW?s,ȭQ+M@N5'l%pIk1>mv`5>_t}qۻtu?>}Y(#AiEva~ǵ'gfk8 E@+USDF{ij{2:Nu}^TkZ-\R,ehLyՈ/ $ӌ("_`eFz*zWn&]lNoo@•ϺtQ `J.:>M5R+\@mm6{52N5zi0e^y7^i T.ԼTƦO&MDD 6!nBڄ- BަM3oy̛fififi/s{n΂sa|秿9ǻo_qz?~,~7z_.Z܈<,훇d/>VyS81f 5UПziQ\ʳ8P! H]bҴ)r[S >'n07z.%~fgd ^'pBځy\Ԗ4um旴df䵢19rX^אl2@x5̨fĺ]>sYR~fV;0ײ,jEPl,TY&]kvf O!;YZPsfooX,rA ξ{5e>#5V_4ܪAk;+EC}50&1]5a:7Buq}${Rhmb5/<#xvHY4 \ahƋsPI-T# ~3k@Ev1Υ r7*+bAxfDD+rJV a@ƀWugR+/0kZ7A蝙{aoRA[4(4Ȣs\Of0s9֑;l(#BPI\͞D')jv:{KZsߎD˰3t; %T8xi&.3pZl8t\=\o\5R raNIh;]1X@MsOgWr;r+>v=<'&dÏ(Fr@l=U.!CrhDu%*NH`[@vg2 6=PLIn,NiŗD,5Dwސ+ endstream endobj 8099 0 obj << /Length 2078 /Filter /FlateDecode >> stream xڽZ_s6L_ }sk'uMr2%f#:o THDY RrqpOPhIɂɗ@a TD$d| Bb4Jijɯg D}}v998 kbZ#My0]}3#\\0$8<9. AIMP,P \IRT˂Oc!d|ƘʖߗB^iv{7o?L~<۫wW g,]1ab(1-`:i0Da\> ~t_?N.N^^7?w-`!* FJDҚȘH L VțtZ$YjΆU(C4ڽ$-& WE p|]ΓNoa)οmcƒn$HQ"YpiR>%W`9Pj cukZͩ9aZs}h[ZQ#scaLk)"Qz<{,X۴wlEP#s+;Rf}N>}8H0SީV-%+KMzvzת ʑb uípDy ,q$t`YW&Ep:-,-mHacfVE``^Upu 3S}%x_UEnvGnP % .'0h)#G^j-niF`QtKA#T2=l#Q.7L۬]E'a-5H?$9[h3=hEgMG_O D‚>q/6#͠Wdsg@px=;: 96Roٙ<F#E?Y.\gIg}VnG& N׽;foY&?>,JʄDBޱܼXګ BnBL[(nu*}^´Z!`wٖiyCLľ0YG a-Nx;tJmb]Nb8;bZ&9Z kNUr f/⭹+C쾶J:˵|k"r,|v?* RivQ$uӝkkHc =%%7']lf?|9_%X7 \'-lBDSh~j}VYCbc xa9k-F+oU|["$5`C/IM\7fIٴMȏHY ;\7˲ rm<;0& ]~ endstream endobj 8147 0 obj << /Length 1303 /Filter /FlateDecode >> stream x͚[S8)<lԣ7W61vh Kra3oGn Vd%;j62 ^@RQ ޹OjXL&0_l^|=U=rCzi'6wiq{5(ʃGrÄ5ο7s= <0}r)8^O!a!V HQi" #٢1î{R%H us;%4QB}: u{˲ 8Ԕe~:  [pǟo 9D-6`D$+GM,Tj~/iKGIH"ļ!ɰr-;BU-& &m: Ym33ٸ>S6sΓf;NbԤ鈰:3,Bo<к`(~u%g.NLx-{;@VFRrPZw¢:ʫ$,a`PV°t`fk&`Ũ出AہLA(F*ByGw f 8x`/E p<& `j;1l$|$nN T3/1.7a`HU3q}/%(R/Ai9_WhQL-# Aq2Mb?$kU[JޟMF^XGEknv I+]9 Th?_oQOAX6>UqZ}?Q=t"AW{)n;잴3TD'1DlBG;{[EmԿH Z2 N)cIM6&ߊ,WAݣDTlYivn«WeB AxQ V96UU^T(b}Z*h}YBηé)O&G(؞rZpZu,%l#z69")XAPtZ"oUҬl$yA8@6=ܜb$^ b; \oR^(@iEuMX, x~82lqk%=>\dڬQ*Ehڋ۱&~^ٍn@eZ-oϦΈFidrLJK?,~4~: Gӎ endstream endobj 8156 0 obj << /Length 1320 /Filter /FlateDecode >> stream x͚[sF鋘)*oRNAu2 GȵO߳dH}"^~gY!l[:owg[9R2f)r(rG֍MUv7-4ZUvml-05Ҕ[i+F죅sלZ\0$8hᴃQavW9%ݕ|E:M0/# 4aTyD:ouYtODثN}r?O'+q`ĝW닫JT9GTDyr:pW}wg-2e7d6lSlH+D*$H28]ݡ\t@L餑}yѣU;X.f2!a gh=aę }} 7 b_C$yIZ?5oa?x0:<1xO)*D4&|{{7;&tŠONc?lKl˟c8l!jCk7 )r<ݑyaJx̃%DUk.nfn|^wm}L{evÛJ 0c"u3 n@7Ż[=imFv~^\6O^K2~ú: Cjp'd!&d5EUYN*A@Rs?C/GŽ`қ!)IA! o86 na|,.`q7H~OLYY( endstream endobj 8066 0 obj << /Type /ObjStm /N 100 /First 997 /Length 2888 /Filter /FlateDecode >> stream xZ[޶}_˙r-j.z1Chh_3OFY)/ؗ?jtH g!}O%tT2M$ѮDhbN֐&NI"y >]l!(ӤѠ CZJRւP fٓuXy" Mp m2w$h@ȑ%;@g.;+'VD120w`2;2O!C. SHiX$Ly<Ӡ!k+hðhSd?,`kCXXO\"X3pAbCLIƣBR S6yxI=nDq[294?Y fᑅŬ26<ƬBągD h,B,.ʸb30L!m0x0-<[vA/xf$ ?l7bB#vf[0hF܎V3pif44iQx0k5d +ÌD0Xd~1ɓϦٞ/˿xr~W}S"g˝HX6I>T! ~3 X1e1]c$z!!y2YCta~%,S.!gwWgmGxz}u;=y2]>Z =E|"BbddYٞ ~CZGqg\>nr|Evz~q)7/7qO}y=rhQǨ9+3J(6Ϙo1ڃ:zs+VCXӜ.Vgıx$RWFٍ9K]fb{A@Z/xDuȈ >R&'`=-I%, -p21ຣ'G1&cJ0E^ܖ\IZb<fo ΋3P[׮v2+mŠk1[ u(͈:? M1uπ9#,שwjtdC K e g^beyY2 h (=2JD,3EkF[ȊK#0A\a,<ә  wsoU}_s[ P͔ h4-<@#.x^si51r:F_ y`f&/0:5Os!@U3U<0 3WHr+\ֹ4s ":V ]s(l% 2[Lgʼ t̐ҨY3$gK*H$ͽIQ ͏P`6#}[ SibÌ9z#si(oIdHA߹u]<,Z?4. Ȇa6ժvGk]\^23wa Ju)1C9BA[3BfYv"(Ydc ?BDIQKfE Hg  =HT$ *-%fH+i;o3Czvg;II"5ߑ  i@ AM 08:ϯ߾~^|7_׷N!š ǩާtW*X}ɸN,(l$院36˝d6q1 \G{1'gF;s~8euIQJZD5DwٷP\ > stream x[Kϯ-RᜒrYdוHz%rLQt EP,CWD F7uRnAK/taZ,. %VqhxYdܮ\/6mw.և]^6YSTe(˷MV/+MP7W?~bOX.Տ?} gn! J .^&1n#EakF)]ei܃S阤X9@[T&<4umF`Avgf@5 U&*VU8.^. Ɠ,aaP67L.T ?Q*bxRDhV ꥠHzb i,!0΄̤Y#+s :MȬ^l 12KV\.b3 <í(yžj%h҇Kᮺ MRio ЎHPIT42ARE< }6(K \FELlP"yK3"λkCv|$F6|06f l3FnH'{\&M5n# n'A0Ms2oHvZY6a% b0,*;E X FW#*I3)2 /}n*Ju/K(_[밬 6Q'g1tB9:F;AUJk/,xKrNE9QT2hߚPxFcZvִ1 {6c M6TO+Wtr KOKpݦ$L(ڳ#2ITqbqbJ`K !p l fbX$; 85[~Aw  K/Bh0F́ Z]df)'ص]8!3>6a1zn +flRZ:<> '*|Qu} gu18q.xzatLѨ$|#bZjLآwo3?hQε cֱᑏw_L yX9NfF<9~s- Sj[Qq>g.?g@.?A̴RJ3TxZV 3y =p}-,Ҵ3 wpc#LKHO]ga($"iuՏ/|_u|p m&W[LS ⑌q Z>5hK^r5δsg^oq¨ߘCD~7[;f@e Lmwf̬ 38/2.F1Il#lj>Yl"> wl 'ԃ]8U;Y >5) &_WIo5:/Kb 7/xgAOs5!U^q=ߕP˶m.xL+ƾb+.OeX89\ vSU3g;)Y^Vt endstream endobj 8175 0 obj << /Length 3351 /Filter /FlateDecode >> stream x\[s~#=!_d:ǙN'ɜ%t$ E1X b  t񸠋o;N8aa(Z/Dzs QKnlvzwݏ ),QB5w}o7 r*X.盟5qApvK>/DIŇШ %\aM}} .4+65e&(}-\R:kä!:/ڄX#lP-Sپ)n~P9*7lo6{{Wŧ`_.J\&gPJCq+;[C3u(#.8 F` h4(\8(CAIR"iNCTh¸݊Hn*l'1@ ^rˈ heWwrĹa_f&G*+br]TMʟBFSGhc?Ykw4{#tLhd*BUD 1g]ZVu|u5Fc ݲlࡖ.tSTp Y,C Oy^Qnmx'O-m(}; \PqY!jp. !Fg?T`P{F*ب7omf̀TBN\˼)ײلTH-6z3ef$ PJ:cb:&m)fDŽI꘮@'oS.m bXbW֦HDRWA.-1R'ZMT35*1 R$B ^T[=o; YҴUȬ.׾Ca!ݱA8 +k+3b%ҩv.vISD'CiP0}v@&A(TW/IHWtLL2?U5@>|` hRB]So j^A- F?-Xoas 08n Y 6IŞ PrOIzj']O%DuAO"H<79:=wIO¹A me'&\xVD v=§uC.k!߃&&J1"W Xmvn}jןEӾ"1+Xg&YƊb|\[Xy9A.PMP!2LYk˂mnUe_]UH%!ԒSK"z J4)`PqgqAVΟzĞˌ~ sW>VSpɉ<_Nc)f800hͳaP"qqȺI-iI&"&oMǴ2C+}^ojTCv1ՄTClCU5= 1zpNѬ8x .//EWb!\V[;X-/)2& &cv+Ga$?? 6G,X2-f}`H7M|~0$:!3aꄮ@i't28|wOdFxZ%9טE(ea2.*2F TkTq*䞦3Tq aN5rF[Έ{'V̠FN4?.aM3XѥW0g*(0FF$ZĂ9v1bg #gC-BUi݉KEK⣁}0JNs`ȅ_'db=>)qݯ6 ֌Zì!<3\vB3y~1q7U2e TUS1 Ghi@hOh! V}a;'8Vx^;Ļ|LΑg:]]c+r_> stream xZ[o6~@NoYvݚ4KdC[Fb)ACJ,GA=$$|ptMAk#)Y4)J($1aCLe|P\),˫ IGs{gmW<-HSfp4gFDGuYC3h_F'{ؙi~A*0Ho-RH (E0 A٫}LTܪv_ $" okqUM,wJXX)Ӭ ;*.L"V(g $G, \O@X핢\!ũrV)0HYD#EWb^ #; cӥك`7W I6@0d5Q 5L&E>b) 7yj.ӦS%gO}c)xnKe܎&mټX̉Vw6=椸#HRNâm bzvr r 59|~!%B9vzGԏ.N{Rwn4D6-\ (RLxңLB𣑤 [e12N0:2Xd'524L#HNHIC@'zh: GZ`^< Zӹ CafMH8! 3'RѩœV@d'!ADuP!ǰ4Q.jޒEq[z!Ί7wptL\OѤ ~[/ٽ{Mr6_G!o,xij;#I^aWo^Z+ޞ ֘9Av+Դ<5γ ܸȫ.͚>=< 4m4&?Z>}bַKB|G|)͛Jnw$>I:o,)g8g}&Ive`"l4^npmEqalZ7ZksF7d endstream endobj 8159 0 obj << /Type /ObjStm /N 100 /First 990 /Length 2484 /Filter /FlateDecode >> stream xZmo_9᐀ /pEEa_GgNH_gVE*:ng J+QeD< '<Xmb*'WB1$)HHbs #%)f÷O0 F2e*TM(Enó(6Rl&u#!Ш_ :uc0+۷xbsXR ]@mvbΎf"Da b9bЗ EGΘK#Y\ѬGl̔(s6ٜxxbrMmdjE`T2H<LFJdsQ6R6WӬ;6UTm3vVu%VV8U l$Ys$$Nݠ"aEE! NF2v\rdg j [Iv8e'5؜a"Gv9[ N2eʳy$1`vZQD yDNB&^Eֻg- Qp(T 9[,de! xDĊ.=ؽv^_Niǫ.vc; W_/m8W䫩W1g瀂sJX{^/n7˯[7zmpԷsM#\}s !ؑUoyfJChh29<)$z~-RP\^J|B ']ËTv_vtcPyK7nX<6^u~ts^FE"q"^vGܭS I9ASR1e D>ދU_ԕ _~xyWj8wCSwoS|lg\>n)q h.R&G4NHEbpwS wvh$ 8_pvbkvcx)Օ@V%c X6F*~RZcSH$u|}T?$*&&^INFB&:Iֈ"AQ&d/G5ntB3%iM2 y裝Khhd}fyDETqiZKC))67-euiE6JITI2~.ԝ0/vKHn*Bp\cuԟ1>n̉; gǽpL?F{`W* v߶oNtsoopx;^xG$"R3m#~N؝33j`{42J߄yE4FikcNS/jSPkRĦF@Vc'>Į&HglC~$ t 2 ZVԦ1ġs^> "H~ʇPP)C>*kS81'U_ 9o!̱Z cK U.SЇ!k'PBPRpy6>ԁЬqH} t> +I!PRdoXdW<Ɂ{1EEwiÏΓQӘc*"-uF(2. C endstream endobj 8267 0 obj << /Length 1864 /Filter /FlateDecode >> stream xZYF~_[h<׾98+l¬D ۛ_ J^O >iM/8̚Z.FXOCil}9 uчGY~'1G/z]>0 D7g=i2鋗Ӌ/bly(؊7Fj6C6g0^X\`nBjx ,!W|VRT۬vFHfoR|fdRE V [H":&* NBLAӲLmeLQ0&5ؚP%N6%"/LNjȞJ"SAy}TX/Ѽj"vԑcƮSLj##՚9oSeH]Lڶ(:Waql1,~6H4;mhRN ` ǩ>9 p9DXhDw&q]MZЬa vDGQ3> F w.2Ӌ4{f£~8䥸wIo[Z`g{rV?DmA>^Cȵ} qAc֫0ƣ "M=x+SX>f{[6L}=v G>¶|8u }MgL݃뼩^,|Yfc9^LCZr5%Xu3Py ˭kN cbX\ZUs^LW3DkĨ9u* @;Sv^=u:[ӚwT2xQL'qe=+ exVRU7ngOxٝaT~i3:)z۫^^y=JIтD{jd:{G8CA RB4Oed:?u\v"J_қ]d1VxqǼ+^XV5SVd{b<0K/)>DQ&zG7Yv[ȔgG !` endstream endobj 8292 0 obj << /Length 1488 /Filter /FlateDecode >> stream xڵY[o6}I@N*oYvbj1GdiQVP.!sRhKɂu0R*H`Bht@cLex+a>YܛLi[ Cʤ898;Gx%HSL> gX g0쏀vhTq I^H!("OFc$b};TܴA0X>)CDDw@`{@V ȓ|63KaF*LVUFHaPn$M='3p̌Uz^ ^9GJ[vi}+ <)w`AYsN0 hT @+@עBfLj|V^&UBV謢WsQ1:.%evjf鼽okէ] WlnՒװ8A; 4b0kB\ $iVvj E -PY:$b{ ؊qNMp^0vK\ Ui>X!NwiWof=mWpCkT[$ScXCIᄯ6 Z7c(v6ܺVa~z}{bw79$U1魲$]Lu.fbxԟRch|tq~U!rVu6c&mϏg_6X/}rOOB+W1Ȓ:1|d"C\`ޖ`=-po 6Z$O<#ǯwu`r+_~rEEU\eyj l$Ou>Qφg? \pcr|ЖԠ’Fl~uyz9:n: vU>[`o&Sۣh]^-$r{zBΏO"$_uȍm 9DLL֑6*)xbmi=nky{ |9x5Vh-F9 + ۹~X£ӿ\L!wx{&MWFH{at5!Ŗ$86URxv>L+NW= 2\~^2Mu0~g2imzA_oW7F~HU$KzFU5xc}zԊ endstream endobj 8223 0 obj << /Type /ObjStm /N 100 /First 1028 /Length 2916 /Filter /FlateDecode >> stream x[kb>&_v=J ېKOO",fwESlktu=Neܔ(MI=MI=SvlBx< %D^դF|̆Os2Ih̫4 6~ sCeO(lq&tHy)!4OgXLdoN"9|2)+ )M98c6 [s2@)9C8 1T!FO$.G P{pJ&1q&hXA X"%<M GLLʄe7ā,~C)=1׆ f ٌl(483pmb,Pia c-, !BhSl0|ix PϞ]m:|7﾿8|quy½:˗4~\ivzfGas^Ȍf8=}>={6j:|5./?_o7/~h׷oZz˩%i+Z$jKbNQӚsNw.yxUuNBZ)L=oAmIK s9ܭг=f,ui\]( lL;a9ږ0gdbDLɶ6,aE D"WumJMg]ĘQ <[ 2g*ތ"EQmR յJ$aa~Qi=|aFm9 (/:RM3 [\LFW7y?x+֨-p9[]0OܡU 3h癏V-~n8՚pq5P-:%k 4Ya{tciKtϯݎ|h kaPՇD/Alʭ4/h= r `:tx;iryQ^×F0Cn_v97勫v|XZ\CɔPK> 5&>667a,&M6! iMnuӬf4Y7ͺiM4M4M4M4M4Ms4Ms4Msվ ȟ#GBc>>u c ų+VP@OmQG`F7JotіsS[XA1.ݻ$N'ꏀ_P!FluD4Ѻ.QZkCZ 7/m1um;R=~ <ym'rgu2(lsr:5!,Zg瀌hLzOwfHʝ CIADKKhg8>?d7} 16rs:ռ%vt\T[#mh":yVFGÔ7B:朚6Z;019kp=fhi|q2/ى`S&֦sXб.KeeЉGh-}`g%ZJJJ*e)$/a6Np@gqP,eJ#./%PԲ0{Πg 7J('L^;*؉32$*nƷH :򖺖ka-F$k,RqY(}2i%ƒ#7e.53XoG('GS#cЃ5[7x3@1z-Wwl̂e:pq;fI):fpz)Ⱦ rrm HeAPX5(Rx!9onۛr[ݎ|#ӲzM(vDSVm.W{ƭ<t91OT_:[>/z>ۗ = lAF^pj.Z :LїwL|c]I9ν /ۈ4O#khE^Z 7溠o){6*|FzρgB7h컩(z\d>팶5 5I:%+><.3W0>2Y7l5yO iihpI^b g}Ws>#(Y#WBUO.NCOpZ[αYyϔ*=zesv OBH+CmGAo>"M\i߅/>qŀ`AG ͂OG9?`MC|`q-2ms7A>ZC dpXv5p(T;wШڣ$CfvMܣk_8_(?I >^w_~>ǃd1>Z1fpЄ> stream xZs8_ᷓg\~JTrm^.%nf;VM+ɛeIS܋ES$(:ɻO~~D4duPxl2_ND,!t:iTzT~;F[/)4QZ#KF>9q NؖDs9Yܟ|N %"Փ3~" J h&W'>n Z`rČPOׯ?9?.P hu(0S%KSj`[|*hg{Bif،IBs$(Uu^>p4dPTœA9|D11Ji$#vz!6כch׋jmQ:?5ie>e@ f6viWlZ10͢e{Ôf7X$؉gQܯW}^5GIXJ(0YEuVVٷ iBlQsRI7c_tמ5+CyrY,vy ꜁trc̩ƩᅎO($R:q`F; OE8k㪐cEƢ1 `pCe7zlpC{ 7 <_.1_7'm)?@}dbY4z;ǿ>1d]"&Ll14" bAPhX2)sb̆0IN!ˣe'b FEcSD/אS< T u@@U@O[֮H>$` IH$vhå,xz\!TRW$j j(5$| )CVIF`9*d} G+J|G-'Ę և-ƽMZ) \. sϪ.ja6!EQqo%@S|g#pv~ l]e[,1 Ct1,8AAbm`;dk,?CuE1 ?UYTҼQd-:ϖU1 DA(kE|=c#bRm܂-!5{b#mQ~aQ =@^G_޶\6l&.s$w6oXH?2Zd O.m{p9[<Ƅ'|"K+W7yme%,HMr #YMU}sߔ?2㭍ʾ endstream endobj 8333 0 obj << /Length 3074 /Filter /FlateDecode >> stream xڵZYs8~RU17l2l<$S.Z-V$R#RA$c@>nFgo.yu8e$Z̮ng)%ֳ4Dr9aB/yNN~iu OinMYwEW5*WRǮؽIkg{vՏ_]~=]bs7:[»g<L*A0^>^:( JBkM旌RTu",iAPJ&)7`P&aBϙJrAT3A4|7̒Su$Z *-5l~ekm[cB_J~L@*³ xb\9'u]p3f bĠ ^X@dΌĎodlCPD52O't.3.]rIruqϓ]w`9n[vP-/rf8)/}|EݪhULra,c~{8ڡPA:_C߇` llp]YG|儧9(8!jz M(p8z G0ca8ј$?,F,2?=ͱ\'*e,蕉pPP>7xAldpz |u㔾133aխm{9(2>kݢ.5zQ 8rln64o 'y0ǃ$J𙆈*)\-M)wWJ" 8l]XwPJlBDZ61J4& T)^rHdm"XDUBWUẖ}bniHiu^|{G]PxZś{݋{6H\]C{d ?IZ[0qЛӼ ΍LBYۈPopB4z (݉MYa(qy ;@wc~vnv(oAKH#irPV9C @'̋u9T!,CKU/GIn[֯~+<"eQrKQNd!w1 B.딣աDՊJJ&FiA3 Ys ;\o]lWCLu \iݧ BVm&Gi*F*bSBвStiC͐7=ߎ&6]#j(zr 5Hk''9}cg쭀%3fq>)~GkWۦnP{rS~|ƆyE*1ȏݼb}bJT:`#nPKl5GRM!u?3A8눨?3@l]"]͸.sإə/qHTG_wm&#.W׮ ؒaVu>\C 4fg`d2=,ʦt9' zS~D}}W3F:ޓsFjD,&}%|*^#͸qB{>)…Eٮ}AjHWVbR/% u-"%bcRbȐ}:T~ *GpbXnfa ?K%v+=Ȑ_.,m#mDb#r |:z5*Թ!ԍxgyŠĿWJcs]tf\Mŝei޸CUWe5p4<դ%уF8oK;j;w%]!> stream xn۸=_!@I]&nHBP$jI$98~f8#ru Ŧp3ɱc=?zvuܱB;}a]Xco}f]e `:A89MڄFIL3Og+ Y\^r*<>::p`ֱ0CZiq_`O˱EZda=Wxi]}h{8?DY̱/\v g4 Y'm^kP0XG̷0fܳm<ϟű.Y5 ִI= gZ M$MeE!b]CqkƘy>vyu|ugL'ӥw^,>?Gx tV?svଙ_SX]}7@ W/z< hr!&l&`k4!oh>JI3IK3z"/fK9/8D.ƒ/G^~J5zU.dM@"`6y9ׇhjd-iMQuC3iU|]5S{sȺ28(W]4EnCˤm$(͢lR`˯eFsLMKשi =DydI*c{h` cuX-e*QF E\B)__v2LD5_W T5ي R[vB]wS,dQQ,uXg2>Z(vؐt5e$05ZY&!I^t Vpa^.mͶ> Ќ'V/;wtKRF̨̲܏*PDujUW+fr!fÙs<]T=Znseo64!eEσi%FnׂE.L0hr^2/!4(KEZX ujp3jcaopLpsrrμ*EA =ox(uWD#88  W8F!Ƞ1alj4 h>ڎ:VR^+Ǽk IBʼnNf蚨JN*Rػ#:7uU P뺦*6yeގ*rgBPvxZ.EPHJ1d4SWQZ-􁓄̥Mb9B=w4%M"dPfG`VFef304FUV)f#FL=LYg'eDBCUw"66vDgz4jœvT"GũuIVY:1g:Amp Hdp# C3gLa9R48Wc@5މ9V٦@ܭt[0f P978(z PV2nBJC $HmִO/k·YZZn!80f;(4nE$؅I-xӟ\ T񟠐ΉPm4hetmE\T`bܖ^1* mU~%CVӞ/9n\OXbX4Z~X˦VIRsVmrAkzUUO+H)1#0ۖ&f([f=EឨgtsA],&+=ټc =f,'rC{!Pc8iXU>i9`I2"\luq!E5hT=`?A=&[{"lE*s.M#6ɣ6C}[ d01vPvѥ/eśW6_Ơk0HVe>+_3}/.g0Z+R(䞤y }"Ê/ 1jzUO|䷃C;k!ֆ^}_| pxU"D|Ov_bR-~W)/D.#jIc_z "Uow;x.K>Ք)&3L^ sG#ƞ2)M>Z|7!ppy ׹oN+V[P:f endstream endobj 8302 0 obj << /Type /ObjStm /N 100 /First 984 /Length 2816 /Filter /FlateDecode >> stream xZ[o~ׯcڙ `p A.20J$7$Zp\ggf͒L229x??fʰrǂg(ft/g"6R3Ad8PFiTֹeC*!nϞ<9;>D$Yx5ΔQo~O>Mb1mb T:孬SH ?-̋y#1{W;,":a#1ʈmľ8MJpVXF[rFz-7Ó' `S/$ ^Y]5su^_>1~K| 7k7זοjחov}׹/~zԢ-cs+01rKL_ޖ>k|w݀nzGoƛW?zy5U2_?; Sf^!թ+0)jK#tOW=;.߼>~˫þnW7:I$Pk2RK2.b(HQ) I}𧟰ׯ./LOM30.umBY%E$b "#q<)__g#<,y0O!4neBж,P 6,X1fD Ze$Zj>. ew2WX(đzPxwBޏRM0U|S^^Dž^9wσ߈Z`Γ 9DrcXnLVwx6EkRGF 5 +w UkH%ĈR iCH3dޑ#*b2ʕb +xN2X |k(BKM'Wp}3`.԰C\!+Aťq-Wnbv"RnUOɁNʱ@ķ`mH$Rk> M> `4I;RǎԱc8:r7`',x4y46_S 11q-8-L˾0A[E*L Q/( 039Rmi%gVI5KZf^\uZLKamȺ9 05ᄬ%m.g.o@=J}{>*@y1Gp*:uHc2sfDiPj!fǖ!ER}@4䈙 >ȎAȀOu2iᾰ7.cl 4F(jnMCXfJ@$M=>CZЈ^hW`>{pw /.lz/TXTTDŽ* |c%KͧH#UdKb" KEF>9{35FhOfpr$m{X~L-bakF HzƓ.`!sr f4mll#JǾ߆޿oc{G׷+<]s?~VTs6wfC)oK%E/*}QJ_T9k笝v9k笝v9k;99vαssc;99uΩsNsS:99uιsΝsGTֳ&<"Q2 GAhoާ42,92'I3L.B$4".ى)n @6J/ikfSg@hkLLL,Q\ )'02)TkmIi.L,<l`G(S$>"/|hz?<7Woz0_ۇ=mSQu%5C¿}$"kVHV˞,]CnskP,ke;T^XS sh^L^qE쬹=Pr<>@gw5n[GI}\!Gz|&"D)Yb#\Dۘţ{ ?#gl(ڙgՅΔhIɇq7$r<8 endstream endobj 8419 0 obj << /Length 2996 /Filter /FlateDecode >> stream xڭZ[o~pT^%7Nmr0hreD"jM~囡a.~xRE'Jz1?Vj%W|q/>y\J$L(*?l5Ew]e.۴-RRMwTk?_z<[\l $^|33w ~Hho7]0EM|Xdr:"?rc޵nbs8t0ut@N| 'XW1w)@$^3G{P ^ FMkFYz)fŶh l_WK"ǃbR0V|[XB,F#k+<4hڢ|s'aH,ek{Rmp"ëuD*cXꡠahKnRV{][YZ M` 䢦&t=z(jtM "Ԋb Xp@r1Q^ԄB!zJdʉ&7A3 +8u->a3 X"_Sdt}y{9C\14h^^dH>Uѫ?!g/P#TѼMZ89CVq|gD3'n zrdj?a2 )ҝqrD-WqݛPv4NSWڜ1z iC̘]vZg}K4MNaF]wZl`vhwG>9_>!Ili^ yvHoc_= v` %,CsݒM Vu^b'p8D̼Ec䦹ځ{Akiӝ|"f[ ,hb“\fAod$ t]) 5senB׈ˍXxt{՚M4K=@52](J%HldR(re"˶6ذ| :]<]vv6͗~)UjWJ8p:e{{SGsYCH(AYBsvLxמJ+|zq Rd%"D^ӯFw9a7* }/}3cMN2Գ!8դ{W]|7n, (u~9Ƹ6Mi;^ g2l3'9'RoMwj%yLB! 5C¾M]:{FNyMmpL8Ԃoxn=@!P1̬xl4mVYwA"E(`B;]=t⩽CaLMTg| 3"g7w; sN QI%ޢ\:bދ{b~؊c ~>d'rτ7o߼8'(NoNf)|\H?G'ttj櫪>mgiŁ^n h':A4fߟcz` .&7ާ: O_Aa;N8Jܚ[8)EDE\,@=(\`+qOQڹTFЅT$A70āJ]Х1[uUU&dQڀ D(t%H0` pƠ8N\%AdP%2Cj@AjP/HyW>4{@c6)(,e˦' Oat@-T6i*d!sɻׇ-mح14g4Ĭq<,`X9 Yel]kMW2I^7ϽC]=A (S^o8F\&WPfY9!s޾Z8L*~Ř<'x5e Bq&4y1%TAiu:N͒iE3>̫aπlk2QvC\ FD{ mJO"*o>\&64aM2.').ljm`nM PNy[Lwé*P{uVMl%NuW~.S2uhl4]<٦`kzaOL:kZIy0{$Θ}ga0!_*561}i铤oa%e3:K-8|i plSU/#1&<(q >A9U,5 ; L}Q|{mք'+,2C)tOm D ={ Dz-AǬGAu x,GKcWפ4) { vA8\Ĉ]fyʏ%>d팺K㌢1$]G7s2  t;U䧺iGuI6uf1h}+2^E}08ef9 @G1: 9t3~%ia1Tڹ?eWe|X7 Lm2}:JXPu8R{j`<y\HRER&lj}_U_$N%r*lEQ endstream endobj 8427 0 obj << /Length 3020 /Filter /FlateDecode >> stream xZK6Q=\; nfmalɫG:﷊U%[q<6.U"C WpooFTdqVVI(8^%qYDHַ2IyS_y0x\¯۪[ەV0i iJ|7ADTUpoWPYzr#+m0ZA{ppv4v뽱mр~&(nk) toPw `omio톧Uywygix-yl|`=˪v **`3Yydfv9 }7tWZOpL'FȌr*+#'-BX}q}M20QP{{WKC'{cb!#KV6z$ >#ݎZy+|{fnW%v_xʎ,'yn8ɦ"ai;ӕ{GN`GuT q 6ނZfUھRky1-ܪ,HbclЊZ--2 v,Ym'$A 6 hkW$w3acî<9gxkyhƢ+O nAӫH&$m>qZ;(`EޯaR4wM#c"wIVe  L}| 5ȼjt!C_]Y!_ 4G(Cn~acp4/G%Gv "^xd#6"F!ѵ!nXNCT" ,zթcpi; u4'?qlx:$U[>"pU<~"g( r+ G0* =A+Dy3שN̉1܉agX897L+E-=54 >R0fFpχ_v~Lo+6 T3JjZ5ۂκҽe[PaUG}S灤C-ERdZ7QӢ1'A:&֑r{?/Xi&XJ\,I ri9 ؓz pTpcD ^S0wf;3ſDG#n{3]j bh\/ZB&K@._"Jo.%[)|8)v+Fo>YtDn{"<*P$ŜFJ$ِf_s>q.Xv||Pc}uQ죵0J_s䜻)H ?>M6d/G蜄aHBqnS著S8tNv'hxֱ,}ώ^Q mC1s`v mdW\ 0v.:;ɑ@'jɳPa {h,zi@ u%8eg]$Uԇ5'ӡP0|qԅC>/POzE vAiT : V]hC3E Uٕ0~]]C?rrfTz־aFg sof1]~סLֈĜ}5*# ns\oe7kCY}E 4 ꎆU3츫?l@p_XNd;>✫Qx-1tFG3+%xܑ+-Hj `x:7Wy 6I<rJ.r@ d49?g%i. Y0I: ȹr%E)i8<|E /@d\a&\s@ <{F&^CGfAuS[v;;^H=z/V:(  v5N:S_4M.|+1' s `8 %%PKPE{ԙn=ox|5/@T&RXڶkjڍ1#aW+gΧvCSe?|<7W؉Om? %W]!H%N)KB M)"L _jRI9qPiJ(iaWba3z{8`%L䆳pکO!rf5H^TF;\H|8Rd1sgn\?L^$^4}t~6{\-)u}33MqS+/uzե2@p7o K.BRO\ X ɺ//%i*S,оp]qj\? uváq!1^vol^y=6K\EaB 6fL˜l i$Φ2D+, 2#{8*˼YU8$_JALL0 -QˈD_9'SP;;3Gg*z6q18 @Ŷm nu@pT Fyew.o:Ncv[;WdM [ ƈp(:xQgkk,1_R}<aGXx# )N> * iUE޴aOBDjBՄ/}'tO%<{>Ǯ4ZQyM'nYPgqZF7C 82a9|%$\c,~(}W2>bc8 =К5裺*86ojFt` #Ç}ydQў|hMW(=}`3ճIO|?юLb=Y|g6ǔE?,&~jH~V}/_0+h龮?#޺g:Ik endstream endobj 8446 0 obj << /Length 3739 /Filter /FlateDecode >> stream xr]_U&27~d7sz-q %|}0 HQ]tO=-x\77_Y8U/n R$eLjr\0^%:z[]QuYW֕Oqf?,Z;˟nv ɂ贎5|wOdo[z-o!3JIOQ')Y(!$*t®mR!bəԹm~ǻ"cvYT,IrJR%!}S<,r8 $V ad$a12ZOua?D>|b*$5ӭ mj-:ކU~B}egK-b=TnL'@@_|;Q9)m4:phi+U߶v52ciE ̷ <,ʾ1O]=G ^dT-^im?!~mg4/G+JTѹ08s*#ek%#P좢)쪁_8ZOdJo|SSpF9 r>`9~>k ٮfaG|ȳ>}.]wr;l>X,Ukee]1ۓcr7e!a7ض8u'/ r+% l5΀,ݰdcO>;lju=I!C=3˰fn‰%*99X ~{Sg$@/VLa$Ճ=7fUࢁWZQ쒠 H] i UMeXu1`qJ(TA 9J򋕔 CF{~=MCEstZn5yM-}ҠGNy y;"탱g4=t7`i=B$!>}( JpJ8A9~k #Dݡ>yz5I^yw DflN)cOa.\vY>zm6[ ~I+ ) uz`dCm1j^%1eSV ™W#fPwHպG|*OXMq=# b~Ns\ +T>f)z|kIgLM~;,i"ØJЪ$A%AA ,=Q`j̠'L§P Q4 )y:$pmGCk.ҡvrFR)2V%s8픎&K{bIO캮 RH|qX4TdsCuhHsRSBzn n+ ui|( s񒈜=# w$:l?1w>u8TdawJ́_% Wa,J5q*ڡ[\l7E0w&yeIQ1 7cvEc X5 ct@b5L`-n+~]e}:CS{!7XətدzzxmL1'CtHH ۃl8a;9,lbtB;+z=kUio4¹ ōx O >%xT |p+y4yg̤Ss&^Y0Y[ GJk AYޡF1 ȁdg6U@U>*FP6a#w_-@R_53~wM8BXZU^v -ζ_$ɧyx Ӝb It>9jڝ2ke4eY=k6,v_j5ff])ʞѡ!y^* cN9G\T{J3?,8?ʦ'ڶem?@ !ܼm@S$ Oѳ_i7#P3of0=E Qq[g*c& bXhΖxcl:#QL>n ^GRLBlame.&v. 4wo߽y 8Lm]Wۃ1+_˛/94#\Hc1WKS>q)ym|/-I\%^$@kt_5<ƚ[.&h =ϹAϹAO.&4}i6wl^V\)HZX<(;M C; c|L;#]t~dlf{i05Y:l\L_^  foF6+gm~rҋgjzA.)HU$ RH*fgCf{MU.)B)VC̭UۏH]|"sfԜđsh4S"URw]G3{WYݪӂI*WÎ6eR;w眹IO!}eL1]39m㴾hlycsA8zz悖:)vmqI9)J7c&wAwˉc&%d#)§J氍RB4%DRBɔV<[]~2̖)%O0F)o$s]K7ʞmX17) ΏVu:J"fd<ѵv_ݧ7 ۆЎs)MAS,QF]6UUd}KE}~_S5u ߿Q_Mxfuj̆ ]l endstream endobj 8398 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2836 /Filter /FlateDecode >> stream x[[\ ~_E#R. 6@\t 鮱 ݳ&iwx XxLqd6ŋlnxݿv_]\]@w}/gtqf#"5W3âJBK۽q\pO./n>_f9\_? (a̬%ɬ2QuR_c$XXa.%kf% *QvYv >)G`^>e=`6 4LcZiCÇk) qL"SDξQhRn#3in2Ntc[>`i$1X~=bMc#d`Et iZmL6/GBs<'4|HXUK@^"s[!hjsLQ%GJ2d 46 C'2W\3 nLDoY=5(ށ礞Ož[3Je%d '1Z#jy|&x@cb)UTW TPOǀEY&Z 5-qbMeC'(^WQ,/Tm%Wؿۏpf.?ӭƖvfj@ATQYBrqe{2KrTR䱎2"L XoiZiy [=G!|ƣbjFbICnKfQyL(}-9 #=v]S?]dFԩ1{)i#,%S$X/fu'y2H eUI!@\w2=qԩi+ol cEz<'trpaʽx:S-I/\m{&9r}'B̠ uJ,t2p| O@)ҽ+v ;?A$Su7?*ЕQ x;:H98Aʔ,zCW&88> pnĢ@ wHBٽ4^|voO| `+;oiyOo_]LkEnBG%:S1rs8Տ] y*; x3PH\C#7J]}/.nC)< $٧Jϛ1qt>Z(In#cྒLkEwc;kovCQ,ϼā|tQ~"rǗaEt25ie# 2٩cCTP~xȋ0}e̝ yU58%i*VQA-)#Ա6i݀r?2q@9PYY93!J>ӦcD*C#}b߫>ODS 솚)[uU>bfѬw_+GhKmY]smuzju-ҴҴҼVμ,[DZܸX[2hҤʟ\a?_|ܰcW)%،ftZ auE4pF^h)Ӱ$;d{+<|.(C yZdcn3չo]~p#Y Nx3YEAi}E!Ī3!L.7[.!΁} :;-$I-OaNv]Kt^,T )f@3#+18aOC*>}k%[ҁ4I5%rLYhUú m+[h+GJ!=fj0(V:kWT:Ʈa&:xB+)LXMGh} F<$-ί/) p[B#r26\w㺻W#@\O\O\O\Oʇd}ܷ? endstream endobj 8496 0 obj << /Length 1907 /Filter /FlateDecode >> stream xZYs6~ׯ#58I"oNTV$ -Ҷ&Prst߻(d˶<±Xo8 pdAd`x%QĒ,%'QLI̫t//$dLG$(<z> FL&W=rp ާYbDzU{,H ; >a9`4 ˴_wu%#.$mS$k= F2bw(AdLOZkV4OG,RS U _ui<xeB5:tv*w,аZ7˧MCV'-:oX7D#P$  $ЦG|.]BFN.P S#x%lY]U[C"8^1bfwR6 FD7W}Xs7هF訜NGU\}4˗Wev&l?;ajNR}jSxVyzeYR;qmmtx HX=>9/~vbOr[} &f:.qx=+ܙE`M}=)$d-j?&0NφF޼|sxmV $>NzAO^>}iaڪpe+ݴk-lpM3MK w889|)j jӓ/ݫɳ^RCqzzw)xuStDk1/lH%v>:A~9Y'ťI\ɳ`KJc\ +sҩn6ՙ´,K3jXI1g&3|\V8);Yqj[}fi^!&׽}j=rxe⪖4-_ׁN]B%T&U7zj#Js}>oU$-Ef^<go7ze-no܌QXs]iVtkƍ M5C`#H`*}1wUtT;V2V)mL%$vE{1-F[WXGu\yf~]|T7rU)/\L~`Q}of&5La:x"g;H0o 1hw(I HbNFDT"!uP|n/|,J66 =5!г<$ X$ÆMޕfgf&Dۻnbhb/XP۬Yo'$A&J.G$y;ADeI̢gtjV |P @b`y ᓬ HN}Ş{{I(t0ЬKPKn0wɒ&5X`)PD4(̱rTQPTV<9 UwiYwwۏ˾.#=urO“;]+#VϪ ]ٵBJŠD洐sjSMg6MB&ũn ]}5\@ Dt6vn2v$$OD?sG1H5g/ttTA6GE >hy54P z' :!.f7`P#fOr܇C?ᐞDzy^r{7n+e򹽥Ly#1)3.TlW7zcUPT5>5 endstream endobj 8588 0 obj << /Length 1416 /Filter /FlateDecode >> stream xZS8~_{8{-}K@@ˑv<ilb$6! Ȳo*26. lu ;ov)6EÑqf[]cl4 xr=s'fHTw usPӣ_-\O <y6s#xqF&0 ccK,A\f \aBg]w:fwReEe؜̂(˂QXT\y!MWdMu76|@EDE)CJ˜ 6=Rb'rg,T,U F"|D2jDzS5.]B8z956E@e/\dZحfaWD)IHo\W6:-|ftG5^L1Z$j \a\0 #bsua86'E׷Yz:ȾU֕Q6KUAL]DKn6 Cj /Sˆ4-T&=%`PWE!XՃa$8.08Op-lxf`##o}9hvwJ&31 ' S.e/UkUY'hO7??A>#S颦ߊd\PSvl o&T+ YzқwnZX^?,vK&a1oJ$>HꊵH=HۣdjNsSoM7`o[ϸIw[3yymugmD)EuV}}9ݠ&no).XU_z{yeHB)H_j?< endstream endobj 8450 0 obj << /Type /ObjStm /N 100 /First 1030 /Length 3504 /Filter /FlateDecode >> stream x\ao_s_Z"E@&lO-l}^ gCnl@=b]ܐC$g4B4%b 4X+w-H"Y+ P/et 70=0dj-8&Q 1Ьޓ))O,v/;g)Z={SrRNgvORc G@u4)e][4dL=(` |>ŽprG`Y$*|lv/rRb(1]DL,\{+1f\u(Cu:GjKWu8h!y :|M81eCiL'`cLI:stGBw+}h7sjp\H@$Bܲ`Ydl7oHBZfNZyY*BܓȍF}\"v3#| ̡l3]O rėёFWV9l,j320z_n=r0n9&Р4z vP1ytɹDЇB)& [86@ed+#>S/; i`FD^@*3w,*+/w4ȁX=JtD$hˁ~  :ZB˝z!A.{#EK;hF<@(Giȟa)eH:`_v)GI4 S>SF44h lz'_<%24 { u/%> n4U,w DƸ|uw[_7Ջͧ rh[|xW.k]۟5k6ūr!ʮ1zZbÒ]ծ!>zCz#AN7.9vq/NGwQ{}>RkJwX>vu}ԇHsS%.9uɩKN]rNrX(\( 41u|!Odb!E/:a-=cSuup>?3`'3[Ng97_o?}{ؑ20٥"W;S]]o]AE܉`yY1y+L{!oTI"_:/(D#"2JЧֿzbNG=Ox2zfOA ٰC8O}v؈GTwɰoo;;- `Q-wA=ɮyѺ-X$Hj)Tw1rc, Ԛ8ON2sp)8٨Ⱥϩӗ >)Rb[ҔC*rN#ݟEH.:oUs"F\߈ G+ HvкW#s*7)/XsRIE)pWֺ0r4j5m"Vy2#հ-DLgQk{7zvk#S?vKg焽C+Q=Om׿@sw(gԮ9~Cd P_&c2mE8<2v6mBJ@TΧ.3gtcL֞Xh.Ye Ma5fn>똣y\ʕ#zGcK8x1IŎsiM O\e5ezb#r)  XR ;qN9$^76|L08"zF=D{A+1oɎx$#5 -mi {ޚzL $ϩ_*6)1ũږLo/Pl۴ n/~=>V-ƵObuJ)yΔ].^Je_Ŷ5:S)c(V$oOY)ײpR.j]'m39qS~~-JIǂN~ { OeY ?=0D@SM190m"ro>/! 9} "du\-FOb6Q 2=M/ty$xɧ--4Ͼi}>վ@ f$Kz=iM T_'>f/m)8?VUb^U?iHi$.cŖZܑ,}})M7X?=xcj_9 3Zދ %ם*W'STJѕ2`_T%B NVԿ흮X|xc <'ՁXʠA)Yu1Qubkdgo/o (]'倒s`˽ 9Ͻq(F^Sodo4^(QB%.9tɡK.W.J\^(rQzE镋+W.J\^(rQ`QzE9,:EuP'J/O^(iۜҍf=vשּׁ@\;%:R}!4z݈xbj e Μ[ے^ԆE3H&0v޾c+ gJ ػ9W Js> stream xZR0+4Ӎ.iӄ&k<&1)c {;ibB[!"$չG[ AueU6j ґ{le!aآcژk%fs~VkDi`slr1JU~*Z Ȝc ԻRO ýψ`v2Luo LQEv%6kE1/"pխ0iT/<#VϘy 4mn# #l̹d¢ )H9+cҮ[y[F/^znQ=!&ct^hTXJu)*ͪڵZ>, Z뻌Du$6+RլIWYm-o(:ҿC~`iMť7R/+G"~Q? XBeVxVkz&. cN'?iB7f vxq/6 W I7xWMEiubWHk(w^":/7Q/E`fUث $I&*7L2o]w:*Ib%4h}sJgi&_3U?|7vF Lac1d0lBCOqAذqR.oYfVtLϮ78; {Y}> stream x\]$q}_QK݌Ȉ X,>^!?<#fgA>Q֬`.w0ܛݷ;dTd91%sV2FżꍴeMsF CC6t|M7Jt|lCm$JFL[ rbV"3ox+z+o$#˖B>n)sRÊm)F[ڒC>I@A&Cʖ #]V6tV4n%F PE*aF~(EmӔ}%ˇw mQ:> tG+WH8 oa6'+p ZQxhf4;_@ ;4[E0a㾕tT"ό"%[aI-j-X.̣ .ZQMI.R9х6ǣ nc݌qSAD{d'&|W_m/^w?_○Ikӈ摹VLjYΠWb=ab"|0qϿ>|VG`}; U+6Rv^0O)`j߄Y~+f6"h-aHZ߇x̘!hFw^q g]xW.2klWoڵi馨{1#Z GV>ǣiFv9H<{Kfy[uTGagniؕxtm`n &b-}IiR׭=@@1(TE/_еVc>B:QG;MݝW) %!I#̽mB*kueװaڝɱǾɥlSJHR'-KNncp;WLO /FO6;!$G#=΋NxqY $ZF`ZK 쎞qW0|B(HmǜvVJH1] GReUȐqIi%Р@!"t0a뜦%ZEV)PI*Me7+˪u~kHK5Ź = 2E C RŅH#)GL$8$<?YKJfjzb6V.-IR'Pҝ#SAWAӚTgf ESɪ;u>Pc垨48P  Sʛ?=檯$>xxsjڸJ+ˤ:[c #YR IA$RBdžjР j: @Y`0Ń`֒\XV^^GeP5i ~̾ɗB1.122mEzlD !|bb_ĵp <Qo.zaڪ?XÀEFNļełP4$p4;Q/Mع$$j*#)]F_OP_LwaJC sQ{$sxy9y t'r}<<aP/)(a%9sI- )&?c_tWW_&^6(x3/~8񤶗of{n?>ow/Eox?Igǟ>!=z}s߷#,\j+xO0nq歑_~歑/g {kp6li9i9i9iO|Z2̧e>-iO|ZΧ|ZΧ|ZΧ|ZΧ|ZΧ|ZӲ,e9-iYNrZӲe=-iYOzZӲrZ.hJlG6ܼj(zIB hW4DV@_ǸAP.Vvε4Ĩ}B:"y,c(NJ/7X* \,?bH brlc,UÈVP`Ba- /3x1t |QgTaF$m1+p(~ОD⚮rj'W͔V`y\v?I&""Vu53t]G0BS-0 &(e_ݺEڍ._WĘ&8Gb}ܢ&W({ko!&{dgv+D)d fxx@hu/-KdD|: ]@ɾpuU&{*s6!t}O'vw@StM$b,ǚo\$7A (?c1Qur |<4KC* "pZpJףV41^oMv 5Է@ } ˔z>gBp~@a-iH9e=r)]!T|n,ӆDfhHIm`'w c} Hpq2sEҪ#,?.2KIB<;J%[MiǕtF+=ؓ7PN~od61ڥ5JdԠUyI+-JNc|wʍ9\C,"Y^ⓘl\i-t :vO/,*GbG}`{$tk:4Bi/kWH|J?-"];Ex:0P9pDY i`wC c3٠f>lr#g{L@}uKԒ .=Pt-{.RB~M|#gg `~LO$r Qe5Аya#=`Ő> stream xZ[sF~ׯ`f^X.ysk9qƱHN&b"=˂XHƲI 9߷gek7^~^PY6 MeiSdmkD!15o#9peZ[.DYꖋ W Ǚ\^:0p?Uw.O'ozIkz:B5ok><{alK\h:g sm TX&28L \bD)ϭ(}rnA1d3iZrS.%!j0d/xi܈1M POo?a[W%; XT@R!aۻYru:e"\ Ώ̓I uiYNQ OД?CX#bQxfr9Aȕ2m`dr;_!1iڐqD,]qpy"M6\\1V0ԅi5 ߆?:(CĴ/d0 vǓwWzG]=7d,~h(0xy}t~|6:<]|UMP:h.NNƣԪ:<:>@սGgxu$x[eUʫimd:Nud2/]ՑLQ{+y;ԃ3'h=*>u 1*X AXdn0CE%A 횖hĨU?Β-QȮK1HJ4סHb Qn)2iq~:\pqSI2)znPjj?R"uAi~K0{"۬9m,lljVvrd4W#lS4 v!Y2T6y cO1쩲`EMCq@[% Xj@L/)SWSy.%կ5wE_յv[~9Ȇ/& &E endstream endobj 8828 0 obj << /Length 2021 /Filter /FlateDecode >> stream xZM6Wh1ߤ6Mڞd6B^!XrlQb$[瑜3qpn-őF,{FZHI-)QHT雤J_U{Li9tkęFBkYܞt7:!pG`Yk)'-ٯF,7&!^G&O-zMZ I"% M?R*l/f\9M=3]ۭ\۷* O6>dv3 ȖV'\p4' iƯ1M{ڴ-Cacgv]e bIqctcK~8ؖ^n3* ψ-p#Ɩ6r;x(#vΌcZ!xlVǓ>;01`EMN'G;Sf`|9q]"#h,fO"2M} |>j3W?3r{UG}^f<]b~x7 E{d jz.⌽؋bo]>S)* %n/D鹹9Tq꜁0SIZy c<}k3. AoҼJpO)bwmO 'iJK|l p֒1P!@%YH4kҨ31CqX"bUV)4Ҩ0J!3m ½F9wt힔r^ #ffdjvqnY}Yc@jl$N$CJFh(\KX LP'W2pkxV2z],*=/tp"Ri#MYP 3 42Eik# 4qKGe|TOEUf4HtucCb(ey%. mx\'6.='Sj)B2e~2AfrН21"Lb!{eJbloz;bjґiP(P + 13(4SګB=XE2}>^:8eʵIbY^'0,f#l$%~4_]/vE^&Ot^r򨪭%xX6}Kb1c`ă ۠$H܆$n C<5󱡰8̘F!\KDt\-<_WHii\N_w4wfSg Tlw.ujqx= 9Tj]2T|mx\'6PxW: 4 1fjG3י/4{wCAYez|t`=6uF[,lMִ j Lg@㘋!L2=nt]NJ.Ў"091ZoO秤T6*jRmdžV=pfHō%F@µA 7 R6٥/ڏa/#88S썏U@@>Dl,AoLǜ6f/qiZ,rNlzroֽKruv?bL쁁Pr:-aٓqD@Ds*T:2I}dˡ|h)bI'zVl uDfXĭiY|;;IfF!Bh8XL !RPG$t#7D}"+; J|a6Euڎq]eh۪GEA: BKEP9&uK姞WX=rݵ:w/9*[Gap.]jN5Gԥ]0/Bn q??C~(>מݹžwy^], KKJ endstream endobj 8731 0 obj << /Type /ObjStm /N 100 /First 1036 /Length 3610 /Filter /FlateDecode >> stream x[]o%Gn}ׯUdUN&1I COg4$=:}#@x[S,yśEtqKj->exLKфh&ąȓIMAZ(MC^H4_AR(͂k-ݛia#!4,,>!%ӢpZ!Qܛ2)9<#4 15-xlWdy ^;t 1uKHRKP{n qD|I蝳ki e3Kbw@h"-G lwDx"gDYSLK˰f.2 ~цJPٴ†D+ǀg@iIXTEٽpMj37f@jY .A.m(K [ V9mD٦E Jܰa 5QvdՐho4Xͦ+Od>cq@bi w"jv?wPpsWP>`Ds ،$D5@ƌxޮڬ54@U6Qݙllt6 D8]#&m<'ci!ڎnۃɐnSW_|quގ7__;x᾿/m8x0&D &]E=ƽXbfo?ۛ_ysܗ/oǻYxCR%Q5雫UG~  ?'eeTvx|Mե:~8T[kϢ_ζQ8^{Zg*mfs+b OnGZmoeZ)Žy ^j󰄖G s`9]{L%9_ɫ]!rsHtNrԤئ̘נvA\Fŧ 9L|v+eLZRJ< Ae*gV^IƸneR4󊍅Ϻ"_ ގy$!<kxňɯ,3 Vk!BAEzKR r>xf&Z3:VCyud_t"hN`^43+![xTL,5ڭ56=Q9h%yЙ`opHOU-?7gG\1T>HSet=+1Y=q^s"It[Iδzvt:? a\drs AYj]n?8L@:}a͏{, m^? `J^1Spף j~w׾rWϗkxުl۪^|ٮ}5mƕ f~]AɒDo*cBم yAЏs*!Bڅ [- ..]5]s5]s5]e,f5ˮYvͲk]eלviלviלviלviלv EɊb1?LєĢ&w_mHn1SZ'"QE}׌i؟1< ;aUjaw51OdJ^=[GPi`w]䟈AthV?CvqNW~ZEI[ kZ\zټIПy+=D&@ׯ<] =Ύ2BwQCgBAP)q13B/*?EZ͇}Q*U+$>/upBq I`'b'l \VGQEVl9f:‰tzkK WЛVm< tfĄJ`2]R[2C Fb΀QwZFMCZe$y@8DN &#djTף~btg k dfQOmO嘯o_d>M4xf{ JqUjES!HfTQ<"ZK#;`XOÏc֖94FH9PCuak.P*+c QjKq:rcwe{lI"FmxkIU\\ؑwmILS8vP\X{v$62QEy*z ;OVp\<GvPF 9m->Z"5!YEL) gR/TEz<" ҔQ^ }C_޽psӷy3뮿?@ZEc/!z#>f#TwM2b?6쩔7Vi!&!\wrQ&Pӵ:s=38$'?c׼Zᓠ? \D|AٺNRkIj5U;9:"!3"%[瓰?1@{sB١['Cr36R 5hF~CImlC l-Vq`rkv6d̿Ǿ%,yoe kx.]7Ƭ<2aʿ0;Iqj,n|A 9?ȝ E-.7vɵfBsC\ [rE3cJ:W҈ %_[Bys[며H֖zR8Bȥ4fO겞TÒQ $*> stream x[KsW{9YǮMJîK Y `AL)Ƽ+3˫tsPPST+X(| LSg`Pt> R!lA)b`|;ݜ44^P΃jЖsDy `•|{\UvSu~2stV曵GIIK?b]5ʴÂ2/{橑z:mҨJ} 1XE|WX B8"cN9`ᥫ۷߸*+]yTˢ^%%/*Wk#;,M4uw]"| Muqd(w,^YnNpVio̩! mVElv`R8Vj߶ ;˓ ,[mǶp0|B~0r\å=]Pq$J8UIPv N ԳhG,zF;-">|t2<.^.žGwy'Q(_o^곖q7Qh NG`0@>cA5Ir 4GB9T@$Di8PEa+԰7!@0#jKrJ IA4!2LPenRVGbzTv0@[P`iLǛt.oPc̮x!@y〷6&n b_ )GA kf vѰAUhҠadKHw\y6<llX5"L ]sPၝ C>ɟPUBBy7y'a}I=TF 66Hx,8$8|-ǞˣalpP?K<)r2 }Zl<%qxpВ$ c <$[OCULυ#&B)]{+̏z+ԙqd Х./;b1(}H)gcPDfqdyQH f)nmNr}&'9y%p9UwKe.w]>ZAl߸fj]|[n 2pH)U su9X98z`!w} d{l qЀ*k6^ٿ|~Ya^L5"PAm=v*W`T|M,}RczgW y[=D`3NoȘKX d 3&"Ӆ6d+2>]pCƻdo {dLht+ܹ{2M! {7עÛ lMNc{9Psj w`{.ahUĒ` ջKV9uvF acyCÍm M/V9Ȁ\;G\nhKa97,ˡp()@yLvn_?睋-Tc窾~[o endstream endobj 8894 0 obj << /Length 1825 /Filter /FlateDecode >> stream x[o6+ti dzuM׵ع)vk+̶2^")b1H $->/I8p䛋8SeY2 $.ٻ ɑ\MgIZor6/g .>yqq R.RHQW'l^gBe'W ޜrmk1B'Ŷ=/z. ~?`'fVnH8AR>cSt;l Y;Ԕa*hJryu;%drף :IxOwUnEsvVVڔQ$$MWڛG\ 7.RPīsJr)0:/ǘ)dr]M|;ai/jezM;#u AT랪jas~kLsf3,B.ki6N@FG瞿=fRmO~-7 ksPcjD̑U >@$b0^xaG_8;D1^2n\=>R(R"+ z!cX@Բ"fEaˊ@cEg{2@PqÔaÎsCv߂B&iTބ+0&z\=hO0>aE?.(d$$D@!4$tW!@B"Da @8$cH i!߾p-bqT@9: kF@bcˈ"|+F:89:*D P#uB@Բ"fEa @4:859';t$sx3HFmZgD!u@8ƫ;gԏ9CI HS@9C"g5PLQx?   g!{-:o@]K_?\7@Hk[7x=oܤ gD4؆v_벞uw/oS-|SޚLIrFet7`Zۼ`?T՟r^J[~?_V endstream endobj 8913 0 obj << /Length 2489 /Filter /FlateDecode >> stream x[]۶}_J3o~sMnz>8D8HU)R'!{.{.5%\M&o(ۛ?ĐXk1]M"J֓(DryʤyL~(M o+mWIJo$qOUfNKW㏳_o?7 5pd+,'Ufh{n'R f73!;(f63!cٜQ ށC3&tl p}3XqHw=Y&U2%aLԚ*b7cl:=V4#eu9, ,ʜ1+ف֐~WW"WF3n/f{eb]a]s/8|nhdbU+oIJ$~UU=3"/NЊ|8.9̮:gILV7AmG\t]EuH6g״(Mj}kfpXyq( B4=|j›z$Mbz_O\,콮Uٸb?vKa]6|%H 7M *-u{z`-A^}I;imKPʴhZR\e@u@.fu5;Ac"n"#0(k V)! ]a+ZsAzT4eVBh ڽAD0hгWAu-+Xk5xC_.j:VOf 1E EyQ4u9ۆDE5E8 Q4Eo5}Q0h.񠵨A/>4ᬨE yvD!&"hSD1MۜqE 6nС:almmÞ7zPx^L\SmpYжԶ4jmRK۰7m]k[t)Ȱچh[PmЯk[`mFےwy ;<wчo 1p ۫B(%qQ|aK(.۝`Kܡ0 .X}Zt?v(i@P0 ;%ӈͥuVS;m`]0:"^~_ψ|1$tw^_?mtsjaZq:[xl1Z;\6!SؙA.)K;)(R~vm8n<4?вM!myYވzju+A(1֮ h vCD'/|ݎC;HM?%Tb7/-+X9vQ8&4Ǵ8DIqw[2/,Btky]wCsĶ3ErqlƅcA";|Ezvb8щE&ls`Āj@:jaQUp(e;ce,ӥaվ8(G}(L̩F 9g5E 9@:wP^P|}v m8(b8b ]Stwk8n( 8Q;UôeЄ|3Ҋf|oyZ.7{uժL3| \m؋+"ia ƝԂWvsd?K5RmHwSL}vYvBy# y&4W8ʆ碊! 崀펮rk./;T@oH94uWZ d@6glO$?//;3/ӼLO/i;t$UWUc. DDa5T$ZiOp/W~Jwߘc7Lᢞ(?N/W E[/)8OHi.rV3 endstream endobj 8925 0 obj << /Length 2673 /Filter /FlateDecode >> stream x͜Ms8R`|ױMRIVJrA$dLZ~%3 AẼt7H}ho9rbCf(ɵΌDn1CnٛbW4[v桘_~ʤȉs|B?]v4c<'94[2Jͳ/T()`{^zoW•t/~ FcЖ&3Z#9gojQ{ݷ{ޣRp&I.M;(dP2# *G3b&Xt엂?h_Vî?L܃&6< }U5qU.(1쪮b^:ܛ7ul6 2Lt7|HMreK*q{4cځX{Q^ :çZhq;rE 07>/`BQ\ D(6]LrE0i.^y,뇇m ApҲ(Mv`0$lx%֚xfa`8m<|, @V,]=P Rft?Sv[Cޞo6:yD}yI6580RF"r`1R\|}9#ncW_i>I΄24F#jx(0ls0j=FecGy 1]3ьIXo$ f;,+j6kw }~}`[Kܗ7e4>v|'wWzlGz }'SW&rvym5.j퓫bXVֱ-&Җi6)92VkXV|2E<\S880pu!ȷױ>>>ڹڽƹRY 1w>‰B!Vlw|\8xaL1Z5xöuS0Fv=6q# F2:;K8Q]KsSp'ZQlU[xӼ.j߻+5 pOTjI[hB()`V]B=XP :th0҂h Ϙ0&,f C;0kb8vāqrkfylx8^<*vE<`b>^dh :Lb 9JI1Hp"ʠ-X? :Ƀ&hb1͆rX(&2n3C:KbLCG39yP}IlChn@Ϥ|,(ҞɎt4Ǯe<~qz,9"ufhrX.ey#t1^-$j d:N~+٫e<wɾ1.e ϝVpN[HGcW0 Rb@*{0i6mI U[?9_?>m6mM鎃ˠ-da\:lKF(EIKl4ZHAI߅İ;j(WP AzbP&|oZnO.ѐbx ;S'BB&6:GxU;CnH`{ԶT^f6Lp0 e24C J+PpN([(X5Lm A%݋jޗP3ݝ> `:͆'։.D*Uja]l?e2sQpV/Bý]|ZVgbEO-[aחaثN -'B:r4 zrkJ){Ҏ{~Av򨟐xߌۀ]wgpfiv 8,˓GYP,-OQv90r$v|1C9P+&4..gu>M {Zf6;'XvՋ$i]7~7]+/ckWtɧO,X4mfSq)btE:pKeXL _ ai6TqoR۸ 2n%_#\X f9qV4O2,b+V ڠ#5ٱܬSji>[YeECΒ+ςG6Wb \."O:wkԙrs|_G+9_z_h <}Gc|5{4A3|2NSAZlŦmt)lLA@Ӝ4ɂ&qX#)w$P20р u~Su@LYg0eO(pa.ha'Gwu\y(5fCH"#]w}tsCwmC[]Ϋ^-Ǎ#)H 6 A,Tn_\6 latwWP|E83 a#ٚZm%B{~|Bc!.qcd4*I˔ jK8}YOj͠(&tIeFKd3}#h?߻I݁wΟuwΡ0 .Q#OCen=X!9❦>zi.]$hIﲢ['9;}1k3mFXhԵi8;wEko86vI;"Rr ԞJ2gj;fOi"CteiA`iR3mp\"iυNekCJO#%%sԆb]fsquuZצئ|[:«,a yJm'y߬F< N﫤wI$GOOA~0O endstream endobj 8964 0 obj << /Length 2208 /Filter /FlateDecode >> stream x[Ys6~`>T!ALjf5URD۪)GG_ xDvK5_h8zpɏ/)bd>RRFJS$I4F#1Of™)z}E=]'JKA$\33_OW ַݱ~˸hNqD{> B(x BB7?.)LF2&H(Ê1$r3Yh y11L:dU]S"`W,-2F$ BBIg}:HpgWWZ jMUENuVj0ZL`VyN \&[^VH'{q%0/@a8DiI4R(HP|r}gh\7Y7Ojw cg +-!d/=6DLcd/hJbR2~e Suq2tФ#;oσ@{f-U5kt.̪J^FˬQH* ^d%ÑQJXH2^ ړ " \| !_5"'L0 {2'd:c e~-y>V4v4hDٯO"Pǰ -E7@{.nk'/;6׼INPLx?.HBR7Q`H\+S2Y.l/<5&mo-3wT1qZb܎Oo?59\E3[EV/7NxBi,401It1ns#=8`Cxz|cv\wʊ! ިYkL)F XJXASMޘ"e9E͏mq )=i=d'ضCbdLv :@wOڝ1e q4b& 鑴7 @ݴi_Ƽxÿ/vq do + ~֟Pވpg/ ~#Ȭsdo\O n'C:W /@B Cxm?NgcQ٠Dw9Sy_Ijl:w5tWwy_.}p)ʨ8\،hf!nxWivٓ]B(_kՏ]:/U5%ߥ'_2ζEmSleEpkDž9RFr pg "HpfO :u y>:im~)\ %d?K‰R9SIz: =H"ń/g㫛Xm^a`)&W`)%C`bQdԊ><}u\j~sFjquj5sM|gppN+\6*}>?_Aa<0o4*9,0ܴ+NgBhQbER7y)6OzJluL\8'&u'Vw0އ˨.ҹpe6Q-{@Daj25'BW%|wk"ZL %'sIsȬvE[Y+ۨv1+ռ ZIV F3`GthܝΫ{8/%C-d%e{~ׂXBZ#UP()Q]*Ui.v!6}`"!?e;_aw\/?^ҬnP endstream endobj 8978 0 obj << /Length 1732 /Filter /FlateDecode >> stream xݚKs6E9G84mlѶ&2HrlwA2 ERLN$A .#<vRidd"Ri)#e($O]݃b^%xv1:/g N73vu,kiʣΧ/8ýF.{:!Oň {jve. y o34TwO{'h+d+tYID*$*a?<>Yjl$- ?`c -Vg,U}zH\h 2 -T8RL'>"/=ݧB Ąpoċ|qM.bw^3w^c$qa=aG z  Pt%Kɍ_ >UM,׾{oJWxbS9Sd4jb ո/{?{Ácd1GaH!CLfE1E(IWr`lkoz~kg &\Y&N}nGSoAn5g~5uw?!8$~xcWNe(ej#bkUyՍx KEann[! tW{m Up_Ӝ[Vo~ EF)J!iAĹ(jX¢gd(; tUsizn_شI4-Y뚞m%t(YzOKn%uZi#S^lACnٴT`g`!nϗ v)-*`kg}> stream xݚKw83UKv3ǂ$MO?W lJoBҕޥgޓ=̛\xFJJ/IM'P_'<@:Wj٣}Ea<]K/'Go_L 'o=#9;})Èiݦ9=.Aza[0Is IFR!1F1'G޾h,aEexzcCH@Pvz6z=Z!NkRLq_ '((A•|srr:|0@ ',@BI(3;W"ٹ )Kri`:fHL1%^4CǑDEˎ9`Cp)"X&쯯ϢEQv摙)D~v7fKNpJ SGVƠ4A;c PZRbHQs/ m``@Y1%ܪj@ڋf8thq4+a6|[>Ǐ_Qux@I^QP`GArt\:{P%2{H$كq e(aX7-,ZݚQd,HOsRa1OŗT6e _&\+amĶ) (v@y/^E[ﰰ. nt_ր陸7ФSR@jM^E3<J>;P|:ًRzKBUcTZh /RZr帙qT,"5|f9RD!Ǽ\i-P%S`9ᐙa = Pm{=`R[ݲ>cn/Lb!|o<)^4ޑE 9 _8,C'=P"%-g?̠J֟;kN)vyJY Q-+ZBqtI֨R>k' da=>|Ѳd:\A!`HXHz ,"h dWÔDE{ќh557\5?JLNޠRggJ8&IS-4?i.jáqKNT3:lj+u@QԬddFQ2Ec(ӈrXK? IXoB]ɗGQRjK>(a\C/;Nq=MU2.f>.xIg3)A[a2PFc ?M'i1xfN8lX473Nu l}.DK64a7[?NaEJZ1waEoFǥhC *Aw/ey2__];8X,uݶþv,&Pڴ>Rfv)*Ŷf954^0Y?5G%4K(}_=KN?Ҏ4DQ { endstream endobj 8961 0 obj << /Type /ObjStm /N 100 /First 974 /Length 1421 /Filter /FlateDecode >> stream xڭXݎ7 dđV\h*!E[b+X$=Y\6qcvƧpiŧHQZ&dRk+=XQF,HX̢m|j\)k\LCY eұfaK_YCc$-.Y`xNJV BqD92 8&8%aX% h!gef!k܁b1lزс7f(r]2xpMҽp2!0Q ƙz|0yV\,v Lv2$nyBZiX { _@k:ʣ1@9 1" g*Ά+XL4؋\iamr>CPѠ=d(XigQy;"X2AR_0< -BVHƘKdWgq9r݃AFk+LRphe .BD2|z$!EiDd]K0c}4sɰca!A ;|p|Z^"!y9ycgEÓ'V6jڣUGNvklt*bS*zV[q4gkaEf[ū$v8'IR6j=OER6q2ʣFI)K5*arUŲ'̵]OVE[6k2jn_m:5[ d#)¸쓓) ʀfZ$8sĆYm ""j[6EPc)T?Tyw[S,[StvO`߼t[^㳧[x?'|3~A`9x8>?}`~9n>aҦ5)U`{@1ݟ*bT5s*ys}NA2 K*k{nAYsV*}KVDYls)bjLd M&#cGN#mCd"|j$sd8#p8Yhqe=$&}t9< =Bd ߳l{v^P<^k{v]3ql,!y*dD/* x{ޔ*KY 1Kܾ o7@R]Tumeڇ,36_[hssTr*}dn@yi cvǼ!:rІ=d^*e6hIdtLkPzV1-K7' c͓A{^z2*xdހfK];Bl9hr m7Hm:R}rݥ|_ԺaY!Zk]}NպKZw%~AZѴdEL(ߕ⇻$t7#o endstream endobj 8987 0 obj << /Length 1732 /Filter /FlateDecode >> stream xIo8"c&"$rpb91&:Hڢ#%#zEIKQ|^.".#=<S)dx%))DS$I4Fb 5DŇĦ^dt1\ˈ3R>!∬#+'M#U&!?J&i쉮($ bx8"icTg7-,ancQTX'.2mӳ MM-|P$%qt#’PW/N+T9EJT"BãFAɐҡWGF1L#c"2?pJJwp !>unвE G,!I6v陹/ WW."qA}=gflj߼r~MVԞ)w$Pp$SZ!dM/ uEHR}l;Lۛ43ƛFLPF54"yz_]M6<ۥy g8NyKُ8ևƦH$t(CIw(I6ՃfCuU<}]n!>% l=ECy\\[qpd Qa2O䚌2B5j/1 JL莘PU|0HXVtEA鬹iImٚ\@>JhSjzC +<!K]]ItsbaWd u* El*LVV0E]@NޖvN^<ͽHhe"qD{]ӻWG8C`{-Bfh ^hos8~Lg? Amr]E̒XEII$µ#] +uԐ%2($$<H׺/T*Wš~Ce"agL1⊇La $4)6k6:<9y_GRR{#_NR Px{s~is96]@#eItOCe"X}`m(k6cYsEYFʵcG;b_[r_3+|9Lbՠ6J '* Ц 34*f#*5=*jYaŢ][V=X!&Yi~g:4y Ɏt`IXr1am(k6YsMGYBP0OAIHZ"#C-J5uhc`brI[̍Ńa_i70B09e0wΝ:Z@07OYl&;-$R়cgNfM-n/j7'1S40-MdfuNgo pAF,om뿡}`HX=쎨wHTDXMEEwMEu#XOXt)M* 5l)G=z- 5{$o︋KKD)iΤʊY[TYG0h*j% IH"yi$`Kty/!Y> stream xZ[s8~>3C.dօmR]!m6CIJ_XcqcD}4 h|ND04%R6(&IsC _/&7t>[\'x=]m՘|"c[?{+[qjo0o< X$Qp~# &pU@0qp")gp=@ X?7 m*4 4c|qd>?9>Y U]gaLӻ}b-Jz:<5&Pő|0 ɩ"Lb'VP@r95lcW5 ]%R}NHݛ8!StF:݇ډ ;H-IL13~xU ?$ꬋ呀L4[?`)˜ _dfip'[,(Je-'2f f-pG%ƞ e,~qj/@*O칯V.a2/OHO endstream endobj 8997 0 obj << /Length 2165 /Filter /FlateDecode >> stream xZ[SF~Wj_쪸˼18a`L2$E [ [r,99nɒ{j֥u}GGߟRhdd.Pi)e($OzD!P{Žg!8ֈpZٖY@Mhq8C1{#80GX!6؟g :؛g:_0ooÇiCKI<=><7c%><>>^p"#.{搿9"etg dyp qe j! Uau`XJ-q ? ó᧫"C & 4 -4>L"/LL:/J €M!HSH6I_Aa 2sH dem6] 6rl&O(DXU_dy\nT'($FSP! w}{ g3w'xw"@pNL'%Q6ۙe16 Y ]kjNYqΡxE )ȹws}/7dx3lDP1I-D$5%էB7+^܀n}E ܩAz?8i5TprK5P1K'vyK~ǵ ?O;/lW7uF4oj@E|&^{'h'9 cWos:@Ǘg dn#z0>*y1T}!-6Dt/8]l<: " w>Y󢵘awż$]`yCɣHOӽv;5/e>dsXXF;IJ:]%uyxPT!{` Wu4LЃ3 M NZ=&pJWBttqsP[x;HCt,AEi8F5uVd:nrZGcx1ȫ:7̺:AkRG )C&R^Z &!ՠQ?@dnMRz2Sϲts;(Bc9'[:FOKJa){N&4iQG2GLgsP0bXAjX> R_]e/͠&V#OnG\qi#] z-쇱'4*eo|z*b1'G 3Z㬡jj12̙"Ͳx]S_ƧE4K3MV>F¶".i|W_a]Bt'-&Y8:& [_>R0@%Zhp\/ >5CZֺ(Lw #lsS!<%&U|8e'_F (hH-km ݃ p$ u p3y9Z4 M 쒲"!7,U4YAZ@|)"G˦y Bn k۩@:, -TC1EBFGW5adJn]MW c2P (,z%Lʰ.呣f\W$Gy}Lqؗ!(;KY<<8>Ec{^@u ܆nݛ88$EF񮺯!h25M5Kh7Ey4GUa rW s4wWZF^ 5NVׯ ko_DIN~Uҫ1J ^!H;Z L"(+ensmi׆VZa0i[# endstream endobj 9008 0 obj << /Length 2816 /Filter /FlateDecode >> stream x[[۶~_VXCZ7N3m43]Qk)U_ EBEJbN]Q>|mWW~{'R,Qi)R$Ivb*GXN)=zEeNe#2[ߏ%mܙ~o?Wi4ջ8µoX{}C38^$oy ix G6?;DTņ \y>[,]IOM$ƣO >' : jaه.mcZv)OX^J?UDB"X6lE*J /*қg_<̟,ffxݯ*P+[kl7y=X`-n |CpYIܳ{j胦HN9!~ YXg++~(=͡B^0vJb>ZW4K4eS+( u6Ļ^WJTV;I](F(2|y9am[;9b.(Xd`X >ϲ=)T C:j`S2ZG`)T0)\ԓ!QlLVL_ЍAhO\İK4-0JJ1pbe_ @){'-wg܍ 'L!ch0#IBDvcn1- ?@k̠*Mܐ1`^c9XRRAFKcjqӧ@ՄiX5 3v:"*l&S[˹#, 6jK__})efCx( B/Cd8l1Qd f}Vdj==N ԓ-{嬸ɖ C-}E&dTdKqe1zA [2rFd0+0Ek6awn#Xꦻ(50 )Ntbh j1; "hS]v1]r1`3ÕS YdVEpu5FA'׆`;T` ݞ{5VaW2IJB2PnX<@xMYci"y #Ro6.U~3&rx u{ms [>Iys߇i6&@T;){q@ :72f#n6;sl'?eG$r~=|PY9P $r!e/W @g&/pŏ5=tg~vB4 05LK_P*<с 0J3)sf&{V"[}FM5/; p: *Y; B&Lɝ$JzLv>F*1MC-@@N*T/#`J3qzA` oQj/@঳_7{q(o=0dco}V ZywF< {x0^0(ŲN :IB`9j=+{@԰lABJة_%0vTOhmZOweX&K^\a>~xe)Җ&`nr5@YǛ9MoED#6ki:FK[XڎA 7B[FjQd5{b״=a6/"&-Om/˦{8+0tnQGЄj4Hn|er߳,ٸ(uz&捕޻oݴ5^עs#s֧㪥om=1s݇tpifř"3>JDYy:;?b?W e!PJrsKIXʋ|~TcK?&_?0/ 2_"[GȂc)n[qn*3K5 endstream endobj 8984 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1593 /Filter /FlateDecode >> stream xXn7 }߯cI#@.p$mX h HZonFN/6 Erx9TsH$!k s$8PeG40G,p $A))eGrȩ-@PuD:5h6G,(\ªIqsP\ ,ǔkZ47Ux8/,#2c 7`McH0jv <0X)_x:UF>UlJzC^DHlQ`ܳ a8{= =+rK +*_K`a_XᅩXࣦmUϐbEm12Ç !y $x#* ހiFh7HD"n )uqU8 Gazzq⯷+XZ-euqιln}}yz=Y^>XG6P3S_F\9sb'4g.hyFItF-2h:zfEQQIl13~Ǣ,k *hhhpGS ^ez/z?5}jlkH~kt ~kt 4y_Sݎs]s]͹\r&FH͜ "M6hL!c8 Ou "[yr½Sʘft0W# Ke\e@djʄ0rSmQ OʦQꨲAe\;ѪGSehjczHFh)ciq4)Ҿ [.-!ӟ70*_\ah󛛇rsv#V [!o'|_\_^_/V=ryz<=<_u|QBQ iŦV/к߫|p͖.WqO2nŜSH5c|"3ZVѳV'+|iS:vס7Y7ަ=7= endstream endobj 9016 0 obj << /Length 3816 /Filter /FlateDecode >> stream x\YsF~ׯےUGfJwmIhP@m˿~gp 9 @9^$tv7^?9Yw3Czf'ޭfο]p}QfM[(kaRx~bpX3r9yz fgg3QRzWU]3B0Jӂ&_wr?fIM #q}UВk%o9I0[ItwxY?/v]R Vb:1 Vfм(*&а) 籆D1V3LLV~ Қ 00cF P3S/'b뀚D,*1┪l7,8%W68\30;MH )%Jk-nnowY4cc'hŗ `q.`B3xZ^Sv铂sF H9pGR|M16nyumNwkW֛J57x%}(:6C/Zkgp]RکjB{y,r­UpsS;yfkyb)U7f`h ~WG!= NZoe ,KMcshµ |S⣫шԵ6,*w-Y0Oa4ՊN ֗~jnA;FGּD_?fū_ZŦ\zծ:_?}r eךSj~}F:{ȊrH pYV ׍B\zMa45` "xy<)̚XJw*iT)A'0"'t!d*D XyKa;ca:&W|P7l VC`g15r@i[3" a fHiE!!$u<$"dXWr5CU*K8^j9 +Ihy]Q\jLjג x"Ulj3Ȧ43#_)py"DwPǨ & abi Pޘf 搰3i`Zj~!;vy"X.@T5KoQ%n7hcM 8wLb!4@)!X)fDJ$]72":&ԕghʆ?I)exs[ĜjDLoY5T滫{= xk0Tc)DQG,U/AU9^|M_b9¯,qv総zM‡ 5,M8:>,J/(T7eyD PS_D $ypaeo3&W)SYT] S:~- -UvJ#%-}% . j(f;}N%$| 0/e]7|LQBR - ?y^/;/ɯ,yJ!:8B.(i`Mjjk1$bZWl7ٲp2r> @΋MȲa׼,gvrpk4f7>ЕLIDaCQ=Z̗l[[)ؕzkM[JM"5002d?6(YlfL]SDX<ڕrlc([R|ZĵT1O BwyEnqq-ӮPn\Ah56gk&4B *d"gJ2g/I2QS%=(,LBRe:_bf bLrt>ԟpi9\}U!'uh}'*Fԟ̘xzOhQa"X~2>)QV"p$\xpY54/jqL 1MV~'z,$;ƞkWp׳-_. ,yT btDhp ".gAs nU%յ7 !qujnLu*2:U 9.})^zdv9ySR ^udGHcۤP&B431>T L@Ԃ%v; \GJcGk*/'|,8OV3giqHU;Z -52 &_þ8ھH Ҿbw9)" f719hs)0p b TN E Kb…80LrwxI1WLU vzrNlq&XZoo9˥D/!eȦ'L,N =w!c0k +[wBݰv35iD ;/DmT_'O}c4oKfs'P/^~.ҺQ5Pcgf^ܝ]ۣU-Suu 4zjl`c7$V\Uo+]]Yl@qP6R{DݜŇ^~KuTv*'4V݈}D W^J]V0rbZ7D-fa6sBux2d4jy+v/_VbG{TLL x""yvoXlL7Ϙzo2ڟ(oea3Ip!˘dHPxUGH}sNH1w )>6kWCW ֳva %zK|^ OrBZq-nsWG s_[݈wAg.6-iZDs VĴx) JT;;P17_xӋIVδKW[/&ʩrN)2w"JN4!|/Ҧ*B9X]Vǭ+J2\4*]"w(05P[סx"=p;5t8xg\M1LjlǾqP΂ [(:߅;No6ٮ j1I:/k,`eD{u=c՜voT{g{T<>ۓjJzg5qj& v[%3?)HG$d+,EZbg.rST`,$ z:kn/2c@CBJ^ՁV##6mQm@)6٠ߒ%WxdȪp+ů_Zomu+X'4UV,|0B4&P x̄ }QWtIqʉqI ozPucRNABtO6B=:ɔoKx2lv_ve})ٶul-nI9<;De11E( E? oLriErD\NhC4:)-fNO`h15 mU)``%Rꧾ9?UTN*@]Vd ͷc?@ܳo:mbl??>n6v0T=nYXj endstream endobj 9021 0 obj << /Length 2502 /Filter /FlateDecode >> stream x[Mϯ-ToIelvmq$KL~}P"(kɩVrEFCGȒTk1J#rv6z0Rv7cC^TY, +#I/Vwkl?n<r9>ܼf%"'a$ J ^ㆆ)P^GI;&b"̌'R, mQ?nɤ$JpgS1IC8pfYu`jN1`jE61c63|*#hWS ]8`|^$u/|[G)I?L,#xIJ.| nX17xz ,'F "Rx6JBU\I51-تÒȔ7\C(߹lZnkQ%aM)fW,DkT籠I>V7N0.t9M>.R>1WDЦouh2hjϗ|,2e q+>XDqypz77cq< CL&3bM#RvDVi}p>eTAZ̭~whd{ݽUB^"@Hn#¾o҃[E{Zzjwd Ѩl)KoK0cnJC iaGFfv.zZV~`wns@@ 0Mi^4EaY}t`kn~w?Mk,bMiQnWtHEsRqo-< lriWَ_j"4X[ӣb9]OG"P[AaUմ x"O9IսcuV9 :g0[m0,fKdO,Oɵ _phe[|,JlTOpkU JM,쵢N+9UZZ_ . ;!1 cC_鎊+a,uB֡J; B"<,Y/qk C}gf \#m-_VߥHz_]dV /Ɨ$[ qǂs~a(V4p,-7uA ts^Y qRL8ڌ4ji:l|Vxb-UXyJo% 4 K*lZj6[M〮gNw&uy_NWNCyۡ ,eDD'[o [oe@%[֧Lp skz:]R `V蟐 2d5{ C "szu)ZSA1nvK~z -Du {4Y[Ah_ 8O7H M_C SX\*i-q`{qAOߔd)U+b%4ڝDG59!P+p$;]>fIm=ǶkT@܈o4?$)߿#tYD(|߷p>(gSuo<-=o[o1͖_ҳؐX8:CAdp>N\ܠ?f86h=5Z4QϜ GMƉAA6?~@Z:HBВ7y?B%ͷ2oxҽd[!N+ˏ eL2w/Z˥ endstream endobj 9025 0 obj << /Length 1950 /Filter /FlateDecode >> stream x[˒6^BUP~2dLLMq_+KmH6X6垣+6wWo8HɒDaLHj|lN~(sVbf~I8Hh }BǓ&O< 5Ҕ''_cUsp ʛ bD-ڋ]%Ai<x[zP0Us*O1{^A <Q=ݕ\D .`EY:P5F\!Z]v4i-Ot+VB>f/y!n65"`خ[^`Āj`P2BXtoH~Oˇ c]ySߴ.Hrv+wʼDL!JtezFٍ3`9xŎSKD0G0B&3>8gU! юc: H Sd@JFXΔIAO,)J@ B뙚n򥍀/])!,oc`Az I2C`I.0Vٌ@o"dsHixZ@EW"pr6#yF ;@FKΑ3`tt}#{Fཌ[3:pXVagZ9tJV?XMZ@jQ%$,VG@Ї:gu54%Lb-~cF-CFӡ_Ø?!z4x&@>ƮX=05(%ǃR%җu!&*@H:-m4Ε܆cz+M1-M15D~|,Yz3c`svQlP0jq8қdN`/߾JRRb6PŸP 1ۓmΑ^a: Y+dqk% p{,uՓiP v92&|)xd~amwfNW/rYdi \cGM-W2$dɆ1+- FJ˚C|I& n _ZZv_]ba%F|䜏3Xcbq$b`K >%1SQl#x\Rǔ vM T jY=Jl63teZ=t7._Kuy!4D@.j,ĠWn֋}TE8dՆ <ь4+515Y݄'rb38W!yG:|A ; 9d3~ 3!4R# A'ݭ8ƆI/D]W ԐP`-hlM_$/qȻȻ⽄ C 0$~DtSW . =2SyfiqU˟3?@J#eƺ$?_py%J^)i/@)# endstream endobj 9030 0 obj << /Length 1865 /Filter /FlateDecode >> stream x՛[o6)6Y/}۰[ۚamQ8u̗^w(QȲ]mICRxsEM.z~CP"lq}aQ 9NrOw`H<5w"̓.^[YjX@3U~V`| /x6|U9)%sR9B]V{lc0FSAh=T:EX7,:#q怐#-g{A*E(4hEuRټN*NN104%P#^ǹ#Oi kxؒT>b:V[ 1{<Ѣ!T9+,-! TsxыٻH R, r:Ż ԃw#V& ލ4y7lHuJnb쑬p톱D7[Ʊ)W Tfcc-Q8&06r֞f굱ۍ]6Acw V}M){[/վ-~KZGV#^edsT]ձ@Ii8ٶJ k#?r7Fz\x7Bjƒvcj !RC2p3Rkݢ_o$L}u[EF˜D$*ab&DSGF)4Fs"]3(jQMۣ G#d˥8meAbwnqp21 h#l34ܑgX{sSt{80ZebY4J)#̪Xw/jY UUvZ; B`\Qc|`18F裎_—\$ωs铠>Q[@3'w21HKϲ9ϯ' غ$<^$hhBw`~ pe?b戱C_G,oUH@5C:@{S.wMohˢx5]>_{ n3O endstream endobj 9010 0 obj << /Type /ObjStm /N 100 /First 991 /Length 1840 /Filter /FlateDecode >> stream xY[o\7~_$"iaw`p خ'G.fq݇ E:R!R " (CS Ys9L .S<|5W%B.X rC j!uSVgX7XF,͍un%;OC~#ºB)5 &ABaQ(- YH*X!UP]M Yga m堠 >`AÚRsgP߹(%PMZגA5)(x []WAa]Zo oT8Suo #8c52(9y[ؽsXerĐ\챴]΃n8' V# 0ĜbdqSO].z>֐n&I^sr x(v.D5AM!U[@>[xB)w1xXGF-1=2` gxxGk(>ՓT e 9^xH"Jy hbO|qu?.on~ǫ.]߾bi9wE$,_|8o>V/.^V/Z:fw05M e];պLt7$ 7L4jRNk KV'i o}N1Y}u[6m65umkeZ@-: V[8,oVcz(Nl9e]%..Fvڜœ_Op[*,؀ W7?AaM].5c +E[ Wޟ.LYo "ɠьِ0 xL8Q$`ׅI|R1?"`T=WcϽW1 8Пz.,bە^[~,^-O/~5/_/~M] oa st7d|L~zadE˜5Tt``~ܬ>9iJcfy+DŽn6ttZm폷WCv* '::'Z/jIg]Y`+\ 3/kVS]; S)©>Z`ИnL ~L:!6q<ڛFi!KyPuͩf ' R&[7(64tsfgݔyP53[K12sˊT =ݐNiAO?YGx?=#ɗ9 u)|9wџ*,T1 F{1ariИoDFUVA *ȃRˌ9i!R15۠;Zu:)~Zn endstream endobj 9056 0 obj << /Length 3105 /Filter /FlateDecode >> stream x[KϯQZx?|[]n*ۥHU4BQ4 pFT."Hu7 <>|-3ln0RΔH9Q,TY֏ Y7x^omY,~30R曏7!HKAk)o~6FgqC3hfnzQadP&!$w֐%Ϗۢ9{qq_Sy=Аiy;00&15hΪ1A\r$& -"&v:A@'J' jR'" QƮH@bQnr_%r~,"X^ Eb7:҈WӢ)~ Jj;lXy~!#1>0Jfo q 8 D#d&8 tzwAKʑnV ر Dy)*vN%S̚(\F1֐b)|2U^ bb{o3/wnw <0z^?MܓwwK@ #gQBn*aΖ?.OLJ",9wk00_]1lXP_7eZCWwUϊYW=\@pEgKFO& iAnq3 N]=w)m IbRA& <]p1&1ĔM8fM.1s A1':bB# `%a>u{WEOx=%]~[(@6BEMypذ,a_ PI%+_BFBjX>ږh_~]KwÇ5",Y&Ubk3Z1L.]Rzdv%Ò$*L'yp6}{L IH*65%$DHW=ǃ]"pU$6~Z*4mlu\7|Vh҂.}U1>m7 @K|\[W^TEU}vp2Pm cgipB%Fco߿ty씳R*5*g1Wiávi嶸c9"2tġˆvUm)S|rHF$g8> mH뙠ov> Ĩʏ Bk! b!ATH9Q-+׌@CJ")x,&hL6Y$.$1ɢ_0\!DJm?M}/YML2̒q]LO*L)xwRޝקL#Ȑݱv 8Phow)hw'? yUibAVBd\luUYc1$ M}w=(;f$< @hbiAz^VSRqOH*.P|D Djgm5'9wGJnxSް՞h:ߔ>sV= ' r$xr<4茈_ihAΫ)7Q=rz>?(8#X &Xե~U08>;>hx2sm훅~u-~9mXCt$FOyZKs?]0:|<3R{v<-`Fш[-Df{LHQ`2&h2'1pr=O"҇66 R%2# nDINez6賠@&`VJ7&` d ƽ? ,o>vHDBDϤ}gbWbtTa:@FmNYI³N"CH(4 U O@#9w\x~=w^:a$RLA9)߻bPdAﯧK 41]XK a"zatRj% D)Pġ ϬWNg˜܅j"oaZWiF[ rh/buJvhƄU۠ `"B M?nBi&*<TadCL=Ө긶f"fn6[x2_#Sl1WY:5Զ*.pLbRI>'<*sTҞb9&c|?tF*\0wwlI|§ r2P ( z7,b_Mh3$*쩗ECDTI3e!xyu _0H7h@[|I5Q%=E@?ͷ-3.r}튾 endstream endobj 9106 0 obj << /Length 1864 /Filter /FlateDecode >> stream xZo6_@TZV`@fC[B)~;-)$'{IIǻUדs")Ypq(($H!x:2HjJ?Mqm5m]Tpc[^u 8 ;qZ#My޽ 0bT_\0$8*x7}pk(1,P \Ң-x?BTEwF+3 j:c8ΓSķU7ݮOG2ΓU:/u.56dWyZWBDv?8$9>?Z{jd|mJpפּ05IEHH8͈DJ` rhzNH2rXyfpm0kmha@V23ˇp.BUV#u̚@~D+F _Y.S[moZv=YY~e/w!T"n Ld,|5]Jֺ/ 3_.}n7Nc E"^;q;}k&M; 會ٝEaFP5^YldV,*,Gt=;Hh4 KUYjA> @Q?jr"4(WFU?M)W󎑆4LgCЋhEy#a٨\ǛEw} |2]!.D/3]~dQQ$I~JDX`9dSiD]1:@ ~(eO\^ͮr*M"u]]ťP n}CM_ Tڞj t`/Ou ^t}{;k{m{5{ѧ=^1l7UU‘ԌΛ[>;6slUl'>mSƿމ-O=):g8TJa*ഝ!*'yJ(qT qύNQ\Gn^Nl:W/pwzSYL9p4`W*[YkLJX*um IQ<(yӵ)h#'6=1:V߆h+hy # endstream endobj 9032 0 obj << /Type /ObjStm /N 100 /First 991 /Length 2910 /Filter /FlateDecode >> stream x[[o\~ׯ8 EgH`p AF \dr~]ncxW'۵!g>s;Tɔ?i(ʠϙ[0du)~XObrQƁ*(ŒA[ )!zҐ) A2X CJ)zT   t8$km&Vlcch, @K/XpD5GߨZ)_&,Cf!f!jj3 8 !j t|!ab}`)RG+GKZJx]3H {](!IvĤ3\om&R$C#%u`nC R*)xA>="`ov]zv۫ÖeaGI =lʐlnFB%6IfDd- ZƒS/6ĖrU ~yi =`P1L6?`'&4R!*h] xÁ4 .pDmɐY g(P2 fnsH\<:{WS)D92D(Gv RÑHҤ#'P.A#);iHgq81Llq=AKtȐG8B  A#ME]Cgބ  q [o%Hx5;XR#j-Q~xd|<E=9L6܏ .j"Rv~x1\~p^\..d/.]ܾǻ?-uᅱGf9?_y7-yn!z#F 7kl{ߠ蔹SN;eSNY:eQ%\\~vo嗷wrפח_7A y¬B=l %`Ӷ vWWOYWW_c[֊]zYs]«z]ZFsڦ| }H3?Q]hY?z3-~?~ϖ?/Rt}*v~B։}\A7/m5'zHk}"L:YԾ|[2@9yeq-Nh" Pvb TxINb2ED(6d<'ˆDs\G_uZxZN(lX!>n~ak79}Jm_\@'H2mXU.y\UiE)q$5yL9X^dIA;CYU824R]uA2qY#4YֱóKp[(XY‹S/ľ sxS|Q:Nn!l^VZFs:M[Fw9Ľ/FFx;w.dK t wJ4Ăc7"q2![%kZO5:!KJ!bAQAМ1ɜǖ(qVH4T = ]EKĽ9d,ȫnjNbL +"A3Da-v ?BKLwM+ؿ%nq-od]*aCVvʨrGΊJ}~.rKnnaT ޅdR*{H:'et݆m~.qgٍ̟+- v{lCPqvg %z~ĽޥO3t풘}rŠâNsIj #|rKCwވ: C(p+mJz=cdwYʖ˲.P:Hi^LS1%\*ce endstream endobj 9148 0 obj << /Length 2182 /Filter /FlateDecode >> stream xڽZK۸WHUY0H8ٓ3l#r$J"R;>PX{"F`קB%1J"A<cdypMٔj b Is둂oO‴%4 Vٗo8X]qxĠ ga5F˦|5i@0y*E]c_1U4 Pnhڧj%S+ͭHq,A)4 5X) [iH-mY7$l6.ZwjW?~ 6o߳ݜUj _KS] R.AϝDv,t6+ZVƎrk?>͂/Hm&@PEH[wƼiC6?iUK=;񶸢)>Ub5"bɎRvT-E." QoR;Xp.B}02I`8ϫTE`'*.J>슒|?1 IJή[z҄oԞdeY6}UHma$!0y~ڔi tkΞ{"X3J4JOU]u {6D԰g." Ig\:Y~dBq^fh>S gc~,\W`*򲀼0D턚dRKν_vEdo̮pRWV~dh:A\2! (q"FnQ!`ci˃,q2 ̢fX5m9|&SzBaκ$MŚI>qD-%}QRC?`f"C4KK*gIn =Ԑ2(і¡ka7&\ 퇲>uFB3/o}O1b"(OFa:kH3t`@HSf(P)jPvptB'cyd2pJ8$*r +ecQaFȺ(FQ:0 .ef%hC_J856YoeӷȲ*e-l(!0:To˹PߴNw-7bP0U2!F")a"6d]qFn0z.q8c]ĩ] T5-sUb3V\"FXwN_A 8|SbP*P 1 $ꂂ3=Xj-r1#\TelO,¢˨/]FzU{^ ˬdq>t$ΦMyx)kt&z $ӰV&NlC cui:Wș@ G#qxM*)ԝJtݳ%"K98Lv!{y@=b/C *lQ  =o8xOMo Hi0hWy5Fix, T}9 t}{#X,ԭl<N*`lYMNt ƶ`Gݸw ABUyڿv19~wxzI#ē)«Cn\#m Xoa:D&ȕu IOq:7t t_YnaD܈\ǶǢ>mq7sYb#"VzςRi^Uq{xg d:nPt!H2kUz#߳*tx󗡽4k+8V endstream endobj 9179 0 obj << /Length 2564 /Filter /FlateDecode >> stream xZ[~_VbwJ)EAR  cK$EʴcH_FܾC)7wG Jdc0JTJ$*Igsb*~*Z-ۼlJ;gmVgǍygw% J(ۻh}a$dfn#.&z;D N F#%R9H{J 8z_. t*f8Lɐ9Ha9&#qFy\+K \",*&6t^7  ODeD'jЁbP/X`X@,JZh\mEk*GR`_T@&JHBDC}KO5t/ۀ`gB ci)Gּ&&=809"g'MT ̅yu\M3&3|UC}76jQ.:ڱoM>cƭD ZárYիb]|y je`W\MUiAT%'D &F\h@Ro\4ζN>Ռ'??1VO A@ < X $x чh6ǢS`+cT0j nв1۬ώæZ>%0*bl62o>U[񔷋Vj66Vg1exۏd_&:snGW geAzQ .dAgduY#/ߐBȫ`=86铄^&4BPP HNMT櫐LKA̫u? [H¡:* ";?SB v6Q2"nS_x'~Q &=H%rc"_ty-sӲle gc6gͿhcQvv%0h{1hggNHx(wa}ZrγY m* B?[ W;ukNS0q7pMg;E^Y4nu,Θ$APZzzV㸋Z8þ${-2:dwFг~c^ k *< ٝ'ӓH`[U_;d E7J@DnA2Rd"r ;F! _EK (8U)ǡ}aWl&Zȵ}kϻ;P}B|'g(1xXP`tID<偔klނ('za]"*n'} $Uzg8 g}!Y;:_F^D*i|?'=1Q09P]KARut2ĤLWiy2~1U皇3|SG* ^SН8"Λ8=Gd} SoCrt͹u88 7 qh;7D|׮uy!ؘD; @EwiB$V-S"]V9@Z/]ٗ2mq״Cjь&O)+˅0[kG`3l/ӁDANc\P(cҩ4]6়oGvDZI5dYd{dc #}qqiY}7rLPnD hȻY7GDQOQf/+bZ s|}9բ]gQp"m5Me&7;uT ז4T;F߸>ՂAB'w;g۞9"몏]_4#Nֳ7+D3:=۬y|UB޲KQ $v' ;Rq 7 'x%1JB܀'|4b UWB.)9Qt(eMk.Eَ\s.&EW`C GWM=V@W?Ib—vS4 fO,  5cᇜ}Fb[lG#|Ig }?+-,3,^rq3L]t _vU\vހn]zA{gs_&H`—zUXw׫ =0yvYqsjB8&p13 El艗{&i`uϘxJSʵV2{ ;DUvQ'`r_7yȂnU]UHgo6XqrYʃeǟPMs8zPPBIh5+i%*b @) ~ym~f1` w&¾%_R֥:wl߂> stream x\KϯQx?|s*cW9qI`8ge 5ݝt )p E[(D>4ZC&2Ϸ7odV)>}h&ڲLrL_mq27L\Won2i Toz{ V2c2dtd{LHƭ|p=&BL ׫7!a$c/#mBE3D33SB\Lmy޽**0TZQa3"i<%ZL%2M2=3ʟ2(#42"fFH9!*whwy\w[IvOY0Sz}%g,.29g_dFOvU]>V2=Ug69S$$eM/OLNXUY'WX]<1 uSo^qp { gl2g"S|~^EGtb?M2҅DClHL7 orRAb p[k }̷=Kb.LJ'fp|Ʉmb%+9-V/3]l6Nz߹q^?벊tÀ=g9Y_1 Klb0p鍂/EX;cpzRܺ7D7|eF(a].p]\gҏ ryzAcQb#Ƃj ;pt^`ޅ$[%{!dƹ{x*茱C^P1~ފ!_fd,](>4+xYJa]Z& O1$һnvm AN,u&y1;09`8vr(~ kS\AeQTB"/;!@S T4DC50/LK60'Ne4 ּϰXOE_` F>ySC/R`%1ͺs]>ED 5 ]7|)6'.M(򕿬b- 9jSFIk0~kZͺO`G 1jYZbSdV"Lq 5!d1(lt|ƝC(&\tA7pQجZhX LeVS:nEq#2cuLsa]m1l!A7.?~+"~;7-qϒ}Q&\oCī Yb`fټjk:v2S0b-ǽhqn3+^`Ȭ{zY,"8hG5]iMo۪]O)^&`\E1M+dFyb'`1k?aaGwo ^DdMoyXk@xm#DG1vjߟ~Tގg̶VD'XoZW  ù44o|9zEQh$|A浿Qb /~2.0K"oE`Wd^W?[mo{\o{A91P@gŝr{Xz|waC*.Rԡͅ(p0 i`v3CYt0'pz^hI)!99mRz0'fЛ b{YpRniTWq;o >O 2T6dzq)33C|dnekkF:LRIg PRceg٤D2{`)ʋoJnUfI Id.@,gwAtpIV/޵BweT?ҩZ3Q|{/6í *6Bw,o51k%ԃ (0 ^V~$i )`)`cGRl=},R_{߮X@=z1Dr<ﶱH]I3L49 {/ Q`cLپ%Oɶ2}bYZ8&ЛkO\|>償  a3LG?cbY BuBMU2t`\*,TzD&=]r2A\~:Q|L!Qq{Ĝ SNS&2 =Ӣd0#ueN(Mo7I-I-cY-G |I^> +1z^ Me } O91EYZ1 ?s)]8?茛 y2߲PE/4Q0eQՅoj(9(1pkY0(ٜW2DoS _;{t7/nvJ)tVI{:U @($3 ͢CӏozUmڷ0-6/ЦxV<^dzyA\TE G D 6TEbW 8TEO"^xSE T.R/]EWx"JUdHGcTFcf㽀1 hPznEhL⥽q N`VngwA ܖ P BCE{-!,S'I)=UICu3Y\!7;,h9 )N#UD$ؙ*NӸden[Ц xNW}Nm-'N5ǸB!J^WQ `@ LJ>!0UWZ 0= +`B {L0RcM4v?KUM!UT-`b+ʗdGj 27VRRfƌ"X=ߕ|:BS#H*K3b+(qGZv}bK3᧞[$-Eq *`{pmd~%zGOt֎> stream x\ے}[ 4~sʱcWqI8fV3fק]/o%~ADFAS|v7/t}s3Ǽ1rv};9cf3bv Lnt3v˧6m7,d|󟯿տ3Qs9PՏ? }5Lz7{j>̔L+wW "2oQ ,L2a 9OA%͊:=vq_Th LW_q|. REzCTknXٺԟ8EL)z8wuPBYS4eBEmr[΅N޴HVk&Ěvs!~ZG/?j%q,4gLfvi:uۜJ 9KR1/٢%ݦ5-EemP$.<^tCg\ҌQ'7c $L",uiyjw!.9kW'ojW0kF^:k=mzBͪ1j֊mߦ"'}K`TW0yPՑS~Ф\D)X.$V~|.'Y'ý~E\psc[{Z&7C\>w{\3_,xä-vC*}{կ)$3 ^a2և&5/yAM :θuպBuBa-Jp}Us{7_H.|/{W{|yygȑ_ k;PA۬ڗ2~rX9ch҉h$>gO7UBvw#M~dƚ`8˯0/#BBk~ Vz,m?K7Y]Bv.y{j6I) s@'>2 ;2 ^oV-RL0N"6 W^Nz*&&J>]$C6ߛ Wsuܧ7tVT=˲?b@kht9? umQ4.m̌Ka4"NXuSi»40.=Iߡu,D7 +ZqXM`]+ᥚPbҍҺ]JMP\j@ g)ދ.pXJeaBtpEZOK2;7^00k\xxs U6T\$dU@ڋq}񌳊KG$@~m AuL ?NvH$*`8 #ED%V֭Ëa!b*51]+0Nc8sV|t23m / 萩! 1:Jg»`NO"Vv Z@8tNօ((|͗$-3p6<(1X+0hmf;pN0ewEffe{0ܣNg| òFbXvհ?t1FXwbXb{:emlFa*?Mh\|GNXS=3zL&zR6 l}sLc=cUPCQ~QFECP_Z_u6Ӏ6=T UŌjzZfM$5T auR)tBJ4jD %]Sr#AЕcf& A>LT  1(ĎuB+fx|_ Mhi($N! 8hB jW w ^.QS@#:  \^00Tx,Q<@h(;! :1(M" Jw??I.?Ôu;#.`&2G^W`T`T-=2e]aF/E-vТCz8ifUYHb h3|Q2u>oo9?͈/L%̰Fj |Puݻ]>` 6asM ҈7cn%L؞ '<H4r d:p, `hDuØY@n֝y@iAN8 q]@Dj"QG.ЀNT/$%UF URBӔfO <NZ,LD7){H! E&gpaF6: $ƸdҁPBXBy!)zw&/ߑ.X;X2rd$H[ɬ#2H  !:6wKe9d+BЮol0Oxb_alCDv -䐜Bx d]xA4@5oYlbjmE(">#~lrD]k82b(O$Gi |S(NSrs[朽B;BN&Ж"Qj_I<-x[dIqiŘ HEY8#+G4tblH4oIq8vp.'wa86@-qLa'HnhFN F3k#l7(""21;)]՝$:uz o.8~cܺa?J.~C~ 8,~-ЯնhD$tQ&oC"燰C]JP\]Ӹ *#9%?$N~YqZQDi)~5(Q?.>Q>Q|QC~|.D#k^g>\o@@Jͼ מz\#/ȵ ך~Ջ-8"LBt#Lr)D *`r߆pSl/mMft^Bǀ뺢Zu_.An$Z.Pb$pPIBvzbd7m2u`۾Ѳޱ dc},`[?q4b˜5*.NJ11=,ߞΥ.w뷱ف KB|"'bĄ2bƿ忤n2x_*Yo1k endstream endobj 9130 0 obj << /Type /ObjStm /N 100 /First 989 /Length 2417 /Filter /FlateDecode >> stream xZ]o\ }cDJ`it`A`hI=62\ώJGEN U\p5TuQPj23 Nb5A6Rin#!3 S et͐\M/0VKȥئ#vRv)hRqIXQlcJ2s"B,>=098jcDu>MD!e60XS{6A'j[7ڌ Ь3\\6AHl r"+ڎJtY ;pb, 2`,56=Q.d[TW Wru%"VhugAISp™vN!Bʱቜmzs<.4P, gϞm6//g7m׋m~w ejӻ>m~{Ǚ p=c9eϡ8lR={6oWoÇϟϟ~u~v篻f{ylO|q;]~?f._p5jEԛ`: 9չȔ aiiBn>r'-G" [WbKnG9GkF~qmi\ _e MYz*G_L{_^]n)^" 0!m^v3qLEO9/-&ݼLۼ~mNmG0m~vr7Wf'xxkC^+NI` VBZh/#y"""[xYyy7EeHDDX#8^н|ww9L~~q_\~0?E$ܺ-roD[ݵs)CqB \3yK=")ӄ@ZsBA'' ƷoDc?M#O` `m'zΡ9anXKsyR&*c/:dU.qKZTS,'Y- *J(7=t}7sL`2YÔSBCM@OUK?IPFHW6 s80։z~Gb'])2uFjff:*A2LN-}: eB;ġfr@Paߵ .=TuS;HΪEj-W4H(sGj0%i<5pFIW¬kI#HD!r@fcgC%}?%(#w+)üLJʖ ]Co?fI|W =;0W{^ڢ f< 0w+3y%ּN9+Wnb+32.8#u"{*#meNUSud`9ԇmIq̱W:433[$]95{K#{o^n:w[9"Gpin4<0ܣRN^ f.@+KɇG뛷]fU|0^Un^wԜΌo^H8D7˾{ w0eF^=SgKhDf̌L{=@7"Ӑe#D >V߇|`xX!ވgHهr?T Z Xl1_ endstream endobj 9206 0 obj << /Length 1997 /Filter /FlateDecode >> stream xZ[o6~YI-kCv h ÑDme~)J%ٱ#Y97~9i:oB)Y0 FZ@IL!Qј*=<[dՈa^β,WWYE䏀3(7#=x9; pt5ҔrF,W2!\/R si>\B*lIH+!Gc1~Q>L9dpַwXkjMQ+V]X @*DQ?hnq)9R\R*ę]~Ę.`ZjB܇_- 9̒hh:!̺Dz/GjHj%GD SI.CujW즭αzTz;BbamMy^YD(ܑ3TxPPWÖ7,G Q 0͹|OMЂXqQS`ېOgڮ<6iN|rtbzzf݈ N&W/'pfC Z,#8>"}߽śo> 1~r3mv=o!yx{YɦлU_`m~<l5_PiVy0QMeՄP,@%y.*?!:Ej`G3M&0`S[Qqq?vd.hם}IA5XBUt"N ,YE D֐fǀ1}8wnkZ9+pzؾA@jR[vKcKXMQ5cag@11(XRR#4tY{҃g0ܤYMk8:PNNϓ+˪x poA/慸_GvIbvoΥg\P*+۳ J.pޠ+^@ &p)1 vkִ0hXAˏ񲈡0H"iR0e*gэ0KCS7͘S,88n(tpF=T|Ȋq?zq9OoU}DQ ЋA/޸^N\ly4&n J ݩ@ڰAIRTJy,nsCNEs[H]na@djoN Vc?hݣ* Q6Z'tq?$5"aWtY6kߨv`vcJ'),D}0$TOO2-RMՑbXsEa\ddΕ®!va ݸńAC~,+){I>:}N1XQj_"s΢ &0!N6"1E\>762-_M K]U?NXl'š5 (;9A@0ه'!?#S /UK'gvq'0! NO>'@B1X~iwgjdطuxUq^t endstream endobj 9226 0 obj << /Length 2118 /Filter /FlateDecode >> stream xZmsF_L?T/~on4k+$lSKJn}^@"e9ñ޳{+ppA")Y0 F($)rvB#L}n2.,ݣ/x}Ӎsznɛ x. QHy,'A ~0bQ<ˀ g0^&-"*P_TZP%9! {WZ[Nlnz{r{w.JDvxQ\5YAX@qɀEB8e=B1">I.Q1-TA4Cfg"zF/YmVzR ;agȨ7KhQpDa)! ͆J1/٦#L9)dԻ "Ø2Hc 2S@S2e j+WY,=\ gA@A\$qFj^p* ݋m^T^Uh0tM6t?gȨD(dLGG9*9$o r x mRMcoIp"6{/Bnp߄DӖ3E`n @\ZU';)Wlm^͆@ցO7;.B\Q_7k\KA>D!0?CFA0]j)a ]1w1qK[`iv,>;pR]j2 r9?8-0\(lbf"f$B ه~ +4߾G@m>S >I|g,K p(|-Yv'YL2/A:ˋ"<`.^gF;HXIUip0zȫ;;F5NFVG Di; }nN8Ic7N>$1k'icKpP0D7mq݄=MDb7ђXt Ǯ>&#`:70?/=*D,e!荒Q)d2Q>@}vU\E>hI*ñkWU<_euG)bO,:e?65U{N!WY٪C4-0ԫjRmdzxMόrՃYؔmM^ KP =dYIBЦ\G! :A{8(%mt;g~c-2HmumvRM4/?9І4.-6m}R%#̼+پa9za}8 -KZz,=ň$~ae[=tgn`TѠ>$nyշxС(ʒj;J]\J7ѺGuVN\gko70av`ڨط00=a89Mܬs#"ɓ+Cs^zA64U%CJ:;Xk7y,onBߘ<+[C{AXm5M3Ҽaj]&fREi|}Ydq飖i ct7ŢԺ< [}zx{ lTQ+2 fsK&%Gۍf̦k+2k]>e^i[Kk&iAS祐YʅWsc9Uh_*]{ykUAi"EPB@˝"Ϯ=ogWp7/:5UW-A 5ˍ .zIj2y7565G~4(p ѠZ@鎛8dUY+8YeS0$x~s(BÙ]rM>[_;Y~+2UIӍ t?4q}?CS>?S*wO'Bȧ$TaejOylFNZv߾9|7}S Bz'bmQ%M/ɣ@R5iVdLrd}Ĵy쀺 &ŽyIKu|g?w}?>[Hf~fA endstream endobj 9309 0 obj << /Length 1473 /Filter /FlateDecode >> stream xZQs8~Wx^왢Je}IhP0׻k;j;)S0k37oeC !67ӇIJV~]ʝkbE 4uŽU8F4nQd *NP/fA8 iVG/KF1t ?mrfkb<"PiG#פT1C{ jokx#dS^zpK!qfۊ&Sg WlQALW"AD*lgΘ0QQ*[kOInzNݵouBSNztaQtݞӹhWHhgv[=mKrV׶;6VT @Eʁ9N׀exY%ncp-_v'~euiLf8p"c'} lPQLBGzHmm@ @%̓ɰb ]1"ϴ~u]; <c+jPaޞ<ǩܔ4 E8D//X &(ÑͰelU|YNT{y~j0(%IRrRRXrJ7}KY@Є,s`ȺxiZ d( S\㨤Wy5ء2ŻFpO n/$ b <xisD)} (zo,ʒ>XE]_.a 5r3<("Dne-dRZE{Be(UJà>\R4;F-1= 0bF7CǞ3$k#/QRWzpYa+̞| w*X'Uh=q!gL-;'/9᯶H^8Rq{}m>S3妱u>߫0H6hNәy8i/E+bzzwQ8AgoGQi6}v3}#aV WOd endstream endobj 9190 0 obj << /Type /ObjStm /N 100 /First 982 /Length 2677 /Filter /FlateDecode >> stream xZ[\ ~_qHn4@a tng ~Ԭ6 ~GCE~<{X({& FR$g!6B e!]g1/@MRohY +P|{='J3_!F8 P(BeP ۨYP@ Woc>&f-T1\AJ E {1{mDJި ۻpSd|)ykNFaEīY u<H 5@a=a4@x$EfFlEH<lٴlV$dqF%!O0!%icli1h)Jʘ cjSژJfbV-r*!*ވcA /!bo`)fe!LC[sP_2P]cDG-]-L=mp nS#ɫg..^aCy +]N`JØw^_|C&l rvAth̰Y&:Jyh)%ܗKr.\qdS,!l#hh/ r p? Z3D2`p AM2ew][e[$88KM"C$K0=._ +t( -k!K"a˟n_p/˗w/~rqTYn-&{fZn9o׿lJ)Q#|Bɞ5ڗ>SU"t"vB::ȝ{U:KҦ/]{۫_/.f}.{E\0yDQ8BrH&j!ۃy[_˿]yss}~{ݏޮ7ջzWw훵N~7wunoYwojzZVP)b%6Y*lV=sBS X!{ζ3bŧ(Ze^F24M49 Ca{>ՐeLAPd '4MYVԂ9 "a`vM)Jǔ|L1RaD<g0eD *vG.?َ01TY::s:ZP)r')RC- qH#+qtԬA9sq0mSC2 cB *uT$YVj^s])Ei&;&X98|吱E8pIAw |~5v/29N1 8yX#3+-/P+LtטrqS#Na |9 DʱMOP:ocO1#h.721A@`x0[ 8hݤnfdAnrJ+e#/ uy*7v1+s5:(ƸC;XG7w}Gb'-}| z|@02`2ۧC<|Fxbհ؍)WnT 퀠$}F\tyį "MQF>F!T+F@* CE8r;ݜkp {O$?? (V bW([ѰgagY௃Àn(Aȼ(ۘ0-lv[%]uEx9 %;)z/ԫn\ Ff'e&BmӍ6 n~xEy'3x}2aƎ0c?)<PcQ;;at%K,]t%K,]t%.9uAr.0)H"8J}>[} Sh 풵K.9wɹK]rs%.9wɹK.]r?W~\s5jոq?W \-<>t }bJ h A7UgA'cRh Fu? P$`rFsW/.1ʸ8<&ǜϢ>v`l@<(9R1:%?LsZԑe®` ?5n!ڹ_@5ɮ 鄵(2/s i3o)6h F6v8e"32XΠ?ZQ;vX:HHFgZ +.Ϛ.ٷlWueYJ-Jȯ>-i.Su%gz'N6L c_u#ׅ=s!!l3dQDEcH?k&LF͋jh3o/h^#ڄ?@N '$Mg?3ܐKjEs$u9#Y<&sQre>)eKTvN/H/9*`3 [D> stream xZYs8~JUϼybg&k˕TyR*$n(Rc<_(%K>jjlD!j-,jr짏Z> \WXQ⻮Ϭs٬J$<pEJeXY_ u  ]:(O.g9cZlm+Z ~(o=(ʕe;8vbݞhKPs.p()Ϭ㸃*-E*gf EFE*p$`]M!ŏBxNԡE 3gPE lGkŸ>2 @IqHqQ*M48%rKIx ? ןC \rrR<[q;iŤXwvaY5t;̩casf]g~-'I2 !eki` gpw:]x0_lp̀X ":p {=G@-G)\2,<^mG6 a53joK/㴔|>FU*Lu@~d"K3C 9r^c!U4pzn{16怑vW\B SYTo`qICAx׵3":6\]#]~KHeeXPH.|CZRGPhp]Ӹ$/ǖԜCgC[ ` c$ Gݮ8]DmZ'qJ Y#̼Jez%gcV1wW{-ܚpH Zf@+@MNXiu$)Q`Va(rG& <#ZQ+oX&Q\4 2'6?&O6{QNaP,-am~D"QU=;>6*ӑ ųw=bS_҈ E>hLjuueIǞ z(;#p5Y:D&qzr@ZfttޠITD?xCLDR+gZK0o>_~|6kב7 Dv\#d^$gCF, qX"e?/wot, Ax/c.fŖ9ck -&~pD8Jݝ"m9NhZ0q()-\V2#%}: eWv8?Pu Ke>9Z#T38:T A/H_nyyJ7œfeĚTe3 Wzs  @tV:VS0ga{gF5lOv{l؎~ [ 1,Zϕ !<SƄq:#]Ą2Bfsjg 4. IB] 3KEX*%VJb4㳸25.%&=a`=-vCgs:>]?˫/~ n B9`J;7uFj?ꎪ\ó6c\O2޺^mj̦]~ͅ`:`wSˈ6ED8\~(u5;1d0dӞ_.ꖡhV1&Lm`YvrP(chDTk3j0u"DM}kŁiFT6Q4esq҈lEWp~;b̮}B/4Y j]5bڍ4qԼ 2[a5L)BGM]lW#Y[Zo7sl oz3}J9\z 0䩬ͽEeF&U 4V/aѾe 2P:xzB{߂ˏ\pqS( ^ Iv 5_y` >))PwW{!p?G7Yܨ^f@XfEUA7ee \?u}pClCX|D4v7 چy1:sTy@|ʔ:Ȧ]#@arAZh!MS^=ĭcϾ8)? bϵ& $n}LenBqn^ʵnp-3=7GeyB+b,aDJ"S|\``#X endstream endobj 9327 0 obj << /Type /ObjStm /N 100 /First 1037 /Length 4000 /Filter /FlateDecode >> stream x\ێGr}WԣRH@X@+Z^XEy%Q3p5SCɐqwD #OFDVf%`D%k’xoD/k}Oi ogJK ^ Ã<]"=}QF hQ/ t,j>L8|7:XVy=`uZ݋h=>Ȧh(ƏjȾ"51xq&{ ͈HϦ0 /bk<O[rC1 l$fMBR=}M4"4s%FM6 3Xrfמ60TV4R=c,EoPtu xf+,Eo0vTC)ně&aplէ w[Y` DoDo5ћ=` S|57O.ygp Dt#)i zy#F\C"],2jY&j$cz!jRUdH@^V&(ٵǵ?u~~ 19Z+␦9S.7@? 11.>@O=u~ n{fxAa Fx fίh|ְe1D03_l J9U|ZHdQ|XvGat#t྘<*8^I 1Z2<@&#̧o0beL"%2*3w:0`$ pO#܃̥G?=ں#׳)*s9M Bu.F9cQ#1|~ċĵPdx䪄t̵픏\-O  GxE_VxGCV2גO Ew(/Ge |D߶j]2sS[g)>HBPSΓc@ ]?Q}#?JD<E~T: I}86fK7M& y&>gK{c|?R-=wGXXkKiHlh-Ϩ]æ;O. KA0Sr(kJI9gwd ?)ܢ /YlxjEQ<?FbKz^t ~QTO[95Dj: oh+ڶ1wOvWK^gqpbb_[G  -nUϧ؜b3P\Qz Z2KUGK"0;Es"C򡯅w-JM© 4 ~:[9-x6mjC.oe' ϒUuM;_Ed6VC^SLV(5LZ9 H&_58MTUG?۪y Em9/ݕZ0'@|h%ld;8:\ܐ^Ek bRfnp!VIPm^׆m6NeGE6-;F1953zl*9`"&V{*j ѕ%[wR} r:r.ñKDʴ"Jwhy|S`rK+ =r ʄ}>ly g= =KF(Zp~Sތk_U(3Z=^y-~Ww훁Y^zz=~_|*oƋ۸`+76n?޵K:۶"ۋWBooo{5 ֶSA{FzlP~l~orxû.eo%]r%]r%]r%]r%]r%.YvɲK]e,d%.YvɺK]ud}LO ׽ ݻн ݻ{m1Q 3 pnNͥBZj,19?˱Yb˲F@ީ[pQ\,}QwA\~|m{M7!q(8㑫9#l{!P0G!vČ _[Q4n529 ӖJ`?juKFDi&UHhG0b2ضOiH }➃{x4}>Ե6@%H2+L } ;_oiQ8V9DlW,'!u,>:x5<=iw3_j!BP<8'נ%t1R5eU#oözC5]-4+jSEEp\{I5DU)gг^PF c:FNi,w!{eɊJOeQBsXʬy":z-mDNŴC]h?q;m9K*u4'h/)av=0ߪK"BUTKYP$4wT;۸Gx!<-0 g/jo)%;V3mDۑ;fyb6/ȳ8`L]G'3L F`0iˬs~KkNmwOYJ.t_z,{vÔ xȰuNP wjۻM>6` XD~6_^ԡܓNޟ'̜˜ (|#jO AULO3τ[$Ucw=v#Vs *;ya}0;*z^5=}?>rnao{4"$H~PFxIqV"CAH{~-66a1x0{Ne,ewa1tʑK8|O#?udhPssiaeL{ija4Uzi 18Q endstream endobj 9438 0 obj << /Length 2224 /Filter /FlateDecode >> stream xZs6_G$A4\.vcgf<YH*R@_rm3&wo@.]&IzĔ( ℓKbhcS0Χq=4Lo@ M߽%8|4`[)Ze0Y|J)Dv2J%'kN Wć_G #bB8a'FcF) *]6} T$ˀGOil+¤&R%mM&nOOuq8&*s"to_~_)f1upre&΍o4hѰuH^#2 s?ojf#YTn^Vzuqw~>; XOoZh3 fThpSnu淍ɫg,a$-Fk`_#t1J}Tӭ|Q^Va~|ܿŧ8gM8eyZVt=bYjGV̯%]E:~"o\a^$(Tř3;{n. A35(Rn5ehMs{c~){\O$RCx*t[8~V.tGQ_ y q|Bs)wHo ],>EzEeJ̖(otIr3u{$!7d27J15;4p\~B}ݔ5'AdSy⽏pFhm=8}}q.1`.Id7Le#i|ىq[lOZ=ީ%QƬfV!,B3V$;Pϳ5)( o]gNOELbS3FI t67 Cf`wqcIc8HTўUQBh*8uлC@ғH_M"v ǁ/Ot<|iZ.ZZ8".3[(bYh6E/t)'Х T+0 hu8).ǪXn G0,kÜ-aOT0iA۳[ :ޛBfG02Ջreܡ%x Ehyq9fwn`bߗ]0*20Oav:M8Jr|\f\Vnέ[$X,刘?R7CHu-1j]TN!ݚaoA~ΐ "@ױȺ>c#zt]u6C28!iaz2؍nf3@×^$ߗyMu2$$ `1Ca} :e ŞS;G]À!bxN*u/.@b )8Ԙ )ͤȧ}兿{"ZױFO F87-KhŲ3&5C:<*dfmzwN0[z@Z>gDH<sTy,l$Y_*V7/*HW+RNfհtϼǹ^Yg9,3 >J9h_TA/ZI UW?#@q|9FFFFw.6e}~ڑ)k~~]Bi 7]>zkp cx^ո3eUsOƧ`Uח5M~6$+тD@}tD?/t$!v:b#^<}"^^-$W.Y=)\ųcuuӍX7`n{:Xqэg[B ?Zq$zѕML8X:p:DBأe/zN!7n9'q k\'e)lѮ_/uÜ%0gein&5+(&~ZO/ 5qIiw|P(8rH'>jD=-G ˷> _!twH*&WH"(m"\Qk3Y t[H2+Ar-N<&wߤwp{Ooߑ~~8{.tD endstream endobj 9482 0 obj << /Length 2946 /Filter /FlateDecode >> stream xZo8_{Z()=tk^IzE K#TlPVb=`ÙPxwoH)]*"*N_x<eyS&Vu\geA]ݍyUZ*ϩo׿^ { -n"^|-Ru" rp})/.& vTJG0CF,񦙏HΤ>Oj(/׫m=ĩhŸ sFR^#l3,EY" DrL} 9O$<%P"J)JaGI#EI(iK겳'5]EHmrDbмU2H.}q:?H4 C/$ L#S(5DZМg5څ!;=NJF}eV(`ׯ.F!~dņFc*P؏QQs${-M}?b8i@6$h,OaΕN خO&9>Tq5]/2GNr NJ5ja]Ū9e;hk z?blV@r"g56liKh䗅ybxY!;C|AN>dywr(q g "58e$w#1m\9nrSq-d/g&arok+c_" %.E-ԾZ‡۸Β8aFކ \$"BK-];CzB^[.)'4H4舜;YM Z6ēxac>7r)#sI6 v=֣VnNxBȷAJ/mMm54me=9ɰ;ɰ?9IvgG V 1؊ZDz+@{&; ?$ ؅<)|+m/Sjx*jÉKۄ'ny ?oȸAZ<>n*j (l  iLHgaRНEά7dt5ߘNVOm,m*4zL꨺4THT~wr&ZWUՆI{epOU9߅3uwt{s3`Б3P~Xc}l"&52 q ‰#tp"e3 wѽ~l_"V  ;Oc!\c$5]̽vx [> =1 tB抠N[`DWCG7"jn^7]cNS!ЩmЩ&eYAά {%+H~ K0+?Mf'ҫ9d!W &+M]&=]LX`6 L7^*鏵vW㫋81_C8;%.CH0V>S7 cg10|QN | t#19`,9؆/~&PςjLgXs}0^]| x\P14uVYR`R%58n0h ` MhpC`RoF+] +BJ5TRЛf{+O0_ 7nk!֯ ?\ۦH IZoҬsX`N>qJ*#Iugy+H |9/P%[H̵]N,a[//P6rNdMggƞhYjP }S:|Q~ EO t);]}}iY>\5[]2yEkv]Mi|atB EC endstream endobj 9411 0 obj << /Type /ObjStm /N 100 /First 1018 /Length 3165 /Filter /FlateDecode >> stream x[ێ}߯!V@0 KQl [Ia"x+s3=`{wZ[fCv]NuqJȱ] 9uTȄ܅&N@(K1&Hb!C3Cq3& ƣ=D&QGB m[w>v I[@*lmQ R͑J9CcZ?8lv#Va7bR5,)D6j0I,܅+>[N8$l&N7}'lLwˡSM6/ 6,iiaChO.*dX|KKlDZIaOmPȂwNn*ቒeφ"l/mIz}ٷI͐Jkp~!6bK@A2]ņYŌ"يa9= :Ѕs[b1=kr6t!zziȆj@>F-`oC h#` J6d V3 hDi vD`=fJPؾLi 64uIbbr`aMLf]%mw$w lP<ٓ'gWP˫۳Ovw?mkl|y:vy %vlhf#=<6?u]6ϻ?ϟ]Mr:?|s0$Y1t,#-s7go9X*@Ϲ}>*S&]~riq!8?,\gM IPy:2< nԇ:5#ٙ]Rgɮ+z#.wl@iWOØ4 CT<4h;ϻ ~6`tp\xq7;Csqoƣ0&DaԙHpXgNί`Q+9  M]=YWM^ {*wWl33bu{F fWtjB/ͫ{-ֳ3]/oood{LXoPwWfe nXWr|^ho7CWw,q#;aǨEa,""P^/-2)/s2/S2/#22/#e䰌u߲:,PpmtC!;0Ї'a)N})a }5\c)k үy+Ii6,8mE͒*XXW[y2KuJei4Bc{WkdB.YW?SЊ[ ) Ss*hV"jx:b-Wbv_]?X~7p,Eh[E_xR x7~T?\ױz, .Pm )EEjPG?㊼/>BcZjtْFp[1:V"BjŊ!f0$@N øwC^TuFj<~ :֨L=T[Q)`.JET'V H@ [a:OzeEQG_zW  SFlX"S_Ay;6GjߑAꥧg_ aʜk#݊#2xXdC> ÿ@/08H6sTC|,+>RB枨/SAbcOT!=Z%E`N>|gE(/{F> c~Cj#_AFHSa8̖w)s@LR-̵ONC?xqcJpUI;ڕV+Y=B.Y1qň&=-qKV@^!V [bkH>M( 6 KV{Oi<O+L:yl s>1LI ĥ/zǬ쾮$W7`i3=zӠ1H߭n`=}y%rt&hC:ph374Gzj%(V9l"vΚ ^,X衝Ywz`gp`gQJC;hv9Y(Y:pСr;$V MYpe%]V)~ee+c_vgWZ*JTt(RQ[Ki).RZK*.Se ~eҸJ\i+-se̕2WZHY8mnF[ zL1?_x%7Ƞa]eT<)!x@18W]9&w IHاy \'K2^u}%%ёޖ=|!dH?i OrOiW2=ȩ7ُrՀY\CI!dU 3M~M蝷D;߼U4 endstream endobj 9556 0 obj << /Length 1890 /Filter /FlateDecode >> stream xZY6~У ,Iihf&0m %GGwxkmq)jo3fr:5G9tnqϳ"XغO_Xb=9K9<}gGso&rztuD`[d˅sĩkEglpZ\ :0N_#l$Lj29 [ xB0vYu$aP;I  b"#9lIU8wCx>˜wx2*ƖCĥքc\6]&vwY =jfR(T~j&,-,Ni-{R-dfQ$JjYҠ&0DBYuN/ZhɶVW3$]4E>S%n2m(y)MhQk*̨Ua4ɻT;2GaPIFq( 0;nlU2[9'JYόy9](&[v$Еy5}Le{t$~& M AGY½Z7!Q ?^.n>'QQ}PHmN]'}еtUS7OϪ|'|ׁ~ܡ/ y=ưeB5rvG! v*v!>ī ]hvd>T31Jga')jBbv$#jf0d$sb1'HnCC٥z.d2ePu<8A 좀j'ea,~e} ,AZ̮*PE*֮fW#'b&C]Bˎ'@zз$~KF3y ]|TV"6O{E"1%ܠ8/sc=4턬~%+134YQ"h]6F/xqUfy N>tSW!9N; XTa|\ B[qb!2ah.˞n:Nlny W!l>$.IPGY\aݲS1.w8UؤXbqUⲝln2VYiv]ѱXͥ/Ho}bh 8qy'3l5/%8=@Ok.)7:I.ͩe_Mf!od\ u endstream endobj 9614 0 obj << /Length 2789 /Filter /FlateDecode >> stream xr6_f"^֛;IΤEB'%=HسO"\Ayě|78v1 =7 Is7`la!xPfZ,2m7h&/ %7MT1 <&O?o/&#EnI7`헉8<蝛/+}zDH1 zV?8 L:) ~xI hxhxFfBy @䷟ɇ1 ٶ[1fҨ?_3 &3'!O`*,tgHIE/ S+ݧͷӴ^*j |*׼.&YhV):M-+eeCZ.8]n7ɌK7.c.wNE|ci|z9$ѭ)7ŝk%a J_./)8z GЕqI'ǶCISJ -J۲b d&wnI:e=z.e֪3Džu;ܰ:51c a*4_ͻt &`*[}0 mT>wB[6b8Ln ؤ n2 co@۵LcWm5MJzz20 TAjhMЬ5L XD Ate0m㘰v41imn2^[E(+ԏE" 9VF O gCz!&΃Qvhg9ap47zG=Q+T4nܙ8 1.IhЂVwӧY(/ BSu>~{w3b&Eu@GQ˳nՑ <ʾl7"^^zT~I=—h8:/$q?uJn(dSꂆJcs:Mg6%# ]4* %\W,=kCou*l"Y~@Myh"+b>Zc1Bj0wy8}NaL@sΑ)9DÜ+x+T\07D9: .ĂrK-){aMhk0"_߆Xkoqk-qKiDN>4?οӮm[l,9<ӘANW1 8r;$b,_85-~`ѮB:uQ+Sgfvsܐ!;M\N7Ri~pV+U78* 33ΰ'.'¤sQ^xP*.Oh%} ~ SK+=He#ٵʀkKH_E?~ꣷO_}ij'4ec]vpOIsCS/-|+Ɉ䆵VԩR T߬ Y1*z4N_=z`Ivƌ4`4$Qjqْ1_6ӧO #T?7l\ۻ;ъ^ig5GƯ/ks3']!Ԁ Lr6S?_Nf>E^}~@:r3.X|+v|ۗ͢]q?RD*ӍF~FC7]!6r 1}.L;Gyl#``&?R6T \*8#*4*89p Kiˁj*=(]jE̛ؒ<. utw/exΟ'#asBp;?BUrѷo} Eި- yxL҈K_ra=Eh`WrJ"F=5 Zz endstream endobj 9498 0 obj << /Type /ObjStm /N 100 /First 1008 /Length 3737 /Filter /FlateDecode >> stream x[[o&}ׯ݇m" |YH#C!!ciοS-QIVV~)U<$r>-!eY|XOA*BJl=aan(֣PZDŻ|8F%x`=aQLyѸƸDDĒ[COa!G;OBѦ l  ‚!h/ 'X-+80\qy 9" )yL29[`x{{.v΢to%b[3 '@ʎ& -l`ts4.z l{pVqnxLlBKrlK}6Vy)搰LQ &}&mx ${dxN@]aG1Î$kٛMrJh~@Mnf[All ֫d.B1]( [&eBW[{d-bS؛fTn IXf&~_</EbSIgd "blyS41ƺbAPW⋋o70#a XBC"sݻ/~ONV3H~M8_=E:ټU?Mr\>'*N:&DCW3aޫliIY'beM|`iX3[ *T.ϮO{]c>M02ɳuf6)f'vWqff{znEӚIWۛ/oa0gb߼~Wx $tzm~/ova|<_Cy;..y%pn۟7~d?[яABp_B蛇lp<{h6zd6lوfcEs iJ)diJ)dyJ)dyJ)dyJ)YdeJ)YdeJ)Ydd?%)O~JS$BCc_..n^7b֠f +ٯ KAF}pWW_~۫o}}>-z[AFFx= KR.!#By5/'AuCE9TU-)T6OO AucO!0Ftv#bwʇ|ف[:j1**Fx#yҳ?ܗw E.cxA*J~^ S } lw{q  u>pa Y9"7h}6yKav9Kt""էx~,63<.^n5Chʡ'qgFG´ڵ[z[O̻Xx=s>s*n.+RcM5H(n@pl`c=1= '5g+)SBBKq}9LS dkߩ92(!ڍ6gzˡqHN[!i'ۑIDϖ|Zſ-Z%s{ݰQ|„ g@ZFA};hQMMZεqBҡ/F)wurlj%30E FFTAR¶q9Bqy028ϼWs.KMTeD$,Qyd0s>n &=ݾg/iel9% [ԑs; RDq[v~w}/?7Ϋpyx4y^NiîɵM#7N|dr^D3YySDk̬o1$;Kn)U݁܃ZR{ǍHSl'1VMί}Q#w`YGxM`dVqie~u  l`hZUB0"يr>&yh%Dj7z28@[|sFX^m˹ǖctŵj+PM\-'c 3/8C8(NG$g> K'Ne  sgUT/ğ[/k_<YYffŚifYfifEyɏr5Oy ̳3h];2E˖(N8X:%y՜FZ}ZrcVŃ]F+[l; *090BG] 6iȂl[%,?U%X?{أB.,uz A>,U-7w‡g=% >e,˿/Auo~eqGs 66ҺQ5JklGB "[LXcW_1^V4fל_Oߕ$ۏw/Ww~*?׏6>LrZ endstream endobj 9656 0 obj << /Length 2781 /Filter /FlateDecode >> stream xZKϯБZx'|X8%1+HxӍIPHts.4F>tɇ>>| M8$D$I9q106DG_W|7/6FYD MLJ kWњh.'çdcM(D*AL>>cFP{1jk[WJyY+ٿyl5Z}T.($ʯ* `4RE-= AK#L%I54KĐ}Q&#!ZJo.k3)@&pz sMLLxX@?|Y$]ڡƜԎ݅cYV嬜26% Z9v<0,쨧rt0},6`r3  Z@b%"Cck.teX8VEcj٫}xv+ $)W~9+h N]V"x )h(d Y.h\&*0jٌ. ± ־nh2VnL˘Hҷq>u"3nTH`MA~W]MO+I1u+,Co!F֮";;/Yj﹃iTJ$KB_=[<pgD 蜉KtSYߛ 51BTe\9%pW"x D`. SwYPu<fI~/y?@1}[yVnt#y!@@_3[,f^-f@d QV P޸=s'0SϵLe'"P"A8lq6sя?ۡT[P~QOyqiTsB%A 8E/W ^v&3pVe". ,##'}G6ʖk" Ǻ]NRp& .k >Hc8~%ḦT®CDCDJA8֪=utHH#D ,A@lHE;780 F`8f#45>W <;ҵ7Pam-sr0ITZ;d#lt>"\F3 h&$&$||dV.wj4eb@\> "LXB^@/G Ե-~ļA6˕$~aAc2* Вp>*"\ ҧq$ǢJyyЭ8$P)i@7 "&0rh8>8>zmhۑS\RA-9#@><fJה'hy`U:A4=4c{q 4.bAoe90m7EY1Jz/3t/ ~L$GITP<ZA\5:_><\cG\WnMSij3xy{ע+nEE@Gtg p uu,lH5/}^f0F S|J 3܎O@xҰS8*bڇB+ F"{/ݺ۰_9Nsv0E—>/&r^duA\+-A(}9GW=cTDAvhUS1# cl: TGh+CKj=VRC|rv.8pһ?oe?3ӗ,8Í(Z_h,>yDNR)?eSdj95_.]'E݀SyyctLsfnkI[4gВT!u;k@`C)PuB|]e} ݀ɤ+"YkvXpu\7fn_, ƯV2sW)$MH`-wCBmƍZP+ꬻ> stream xڵZYs~ׯ[* :zKʻł08VtO 2y0\,>]y؄nZ/"ύp% 6_|uD/eR[;oK+uݔ7]|e9-~OW?^JB űKm-r xUIx237 ?Pn+h^yDABzBU.=t&čP)@T!'"y9nS,LAɝ 4(M5,m ih$dpҚ_U*u|(q<2R'4XDZ\I{ Q/_ |O%AyZٚtL'{\#*Wf wŊ^& 5+.=k>)`2sUtEZ@DȹAQQp~8]@ YV/qoDGN )m ևFÌ4phUA@e=3Lѽq4U5cCU7dE6L⟽ÛF GJ] AJP>z)m9:;=D/`N`g4R ysKự;w:c~pᶅ;"hցzEp`y9 mcFʪhU1#P*Ἷw6ohU00xCMlfBOEYRX6m[K#s]bPqȋFg}o}~+M&n&dL#i\p-bw/ȱqcCw6g"O.)0#N5}i/7<,/%]hIaoJZ-8B6L@ A 9&4؇HI1ALhtُgu X9MrfژR;e= 45g8Seaτ~E~,?Mpx‹$m;m(K?4D\<66hO:׮ȍ/RJAJDwh}V=BQ&!.Kx9Alm3' W<1b>k4f!/Ç!LO ܚK3/~jTRAW'U|%c*W]0_tS:Uۺm s%oE9,~uSWbvgLV:2'0 Cci,L| P}1$ )ı;}P 3}B\Ak02*1Us/4LST)"%?Ss48GE%i id?d^Iӣ-[j#9t4asK6@/NT`P~033(V:`06A Jd v44h`BDŽ66 S6Ia4젏<0n"yЁ;Cz)lez AI9N1bbE3]SZM 5wTE;S)FA9sn썮euN33U<(Ldڌ"G#mxצt0YGhH#ؖEV` O97HJ9} ȂsAvqdcX`_"S>" ujE )?8U8qt@. ;>wVKNj=d9d8"8A2 FO,?!>Y筍ot8c{=QY/JK3Lv|<4]QNdKM $8٘`>&i?@h`56EGfk10D0_):WQeIjTZ L>ha!;2|Shu4$Oxro&.-!Lv,z*=t0poe/&XFz>+`/ EsF 7 ɯ"EMGlg?V_w3E(KPD'jʣw2s!=JdEQS.qS;^vDFEw^$^b^$pz:/Nvm D WF \K b(nrІPᒑ͎(NHJtxhè|}V7Ӌ1ȦuCB+X_υW` R* y:_;\[ɝ7zK O_cZ:dlrڻ~<:o_= endstream endobj 9633 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 3145 /Filter /FlateDecode >> stream x[ob?_83 n4\Lj#\}tB45T0x<8μ7*Zy2PRE>IDܻd !VHCBgh%L6ps-G( boY| Jh)5$b]MaQ0.F˼Sr4>$}JqI2l D+R|VYg@Pđ2f.&='jX(T~0g} A_3c|bǜ$p,C*)A,E7>pObv?CVΚqɷ>2P|>EP[80 ZZEϊ%&F+sa ZU g0! v}6Yއoc}i0t.i?iْ :=Y}yo4dmbLJ`!aP]}WAﺱ-y)A ľ~GA'`w4T 1ܖھ6f"}QRo9%@amcjqfȘ~gO^CvO/..ov/?N7_]pjiW"Bxz?k˒ƀc`ґ`C4*{:ؑQxVW9!Ϟ3D'D2qȷ yJ'L{qu9C ݋gχݫfxln7^O*w/?^z_}߶]Ѓ9E"RWd(Qy?kkWnаC#q^Wm!a渟F bHW"YJwSSyI΍Kk*αei1ِ"~""5 HL'VpgJ9$"nDa_^{ {4[U9U?>Sb)TڜY>l sHGC e6Ӥ6E2-,E4m7QFBЎpiOwsZ]sZ+5Bjؖb͟  D=?H]OEDDre^ʜגT|&G'O]O.Odrcjî%*P=yZm%YmA>/_)eե,)dw;TO3TIjѷ$1*7uL94 丩Sru/j72s"ñ3U?^LMbVc(&}M}E3;nj)>^s/N#g5O"73{*731#/L8s}:WXM(l fK ~usy22edTqMПwmw?-$8+e+dŗ! sLBAkAt/Cr> ,Ddk|kḲ>JɽX&U81> NTY* uN =-݇K6cvZ ebqSVZ3llˇ_th.1+zESZ΃6a 1 endstream endobj 9712 0 obj << /Length 2022 /Filter /FlateDecode >> stream xYYsF~@վUd.3z&>6k-\0Pl+~ h!%ؽh 8E},# c3Ep/q2h$NJ P<~z&Sq$)Q6 -ۺxrh!U-); ` fP C %Xٵ}v!UVc[*A$X.` xDsȗ?[T!2ެ쌿uQ#3n|5;/;|X]1gS REꛙYߢƦnc!sAp&.^΁s$$Ŭ yuscZ~>w$sFεwof)k|~)SM9gDY̩wo \gge`{2C]Qi6ATeul5ۇd݁ Zvi(Va_=+enuE(fDQm'> &:.rBK0 l:]hm.,t Vnh}*64_x\}'iGƳq0c4uBJ^TpܢBMPCƝ:6y_CH>Dn$ythն[ q ZH1xjMo'LbD>nnpf6Hݱ>mGoN˛-'fe(#.Ou 8sD@hq,HOWwI<C>ߵE|_!hr(s&8TzGAJ|hs^z$0;')N੝hgw +z[Ҁl0\kEн]10B= iD_o)Y*'Ʉi6L96*?ye6nčd!|!ʎ߂otݧo?tVwشGtf a endstream endobj 9748 0 obj << /Length 2200 /Filter /FlateDecode >> stream xZ[s"7~WPiҺ3LHlw6] ᲎9@ ژTݧt.w> b’c;LJV"<~xvJ=xhRfD`Q%;]c&h=Ml*[6e+ɬ_eۻ:2}srE|ܦsiJR&iq{ rLi[$$,^޼:)j"7HQ*R_8u R7!E9*R6e)吢jRE>[J7BFIN MP jyu}w5^]f1IĭX~W,c7a-Ckfp>}>wui}9|3X֝4*9Ft֧^p7PS{Ce=6(;lR ?mgG$r&lˢC(s]im'BXvh.8p!+g+}h N _g MYp#g1 T#do;,]9 E/ %19L7TLMc%m6.2!-U4czvYZz^%I4+RFcVthdƪAA)dT K18AXj<ԂR >|3)c?Ԃ.Z֜^YJ|NI(=^ya(Jm&$:(`89Q~"ݹ T H`jaj1L"7ZUKեmbt?\7 sCVIOc&nUPp\ǻOΛ:5d*]4"SPڗ{@y7,<sD]ld+'e˯׌qF23xQ ;=,! -R[ԆN'μIlvNY=>Ů0+J{w 8g9{ËٝGjWeCYS^\ӨK?]YvpݣOC-S@-j{/5F5#*MՂhcwίzt8] On:UH*ϖˢEYlRq>["9hfv.l*y[[,W?X' >YԢ1jк֛{:Wy ww1UsR;*q'1:K^W\4}9%"W%*^Pf% &)#TݴG;V[ a7`V|ۍ!qzƸP;$lncsIp^ wXS9Яܩ]c?[GL+QzF܃'FvjgW 3KGÈy; V endstream endobj 9765 0 obj << /Length 2071 /Filter /FlateDecode >> stream xYKs6Wpq&B&k;iXiiCņ"].&hrcŇ} 7^MO}IqDJ̯X J($g)!FTp\ff0cL#*PX=d )"4L1-AO%a݌1ihI'cH$Z}=NOޝR'pDbþ I3yHFָ߾$aH4 óL| ⾇]IiyO`Q$YQ552!],T]q4],f~(!A>\J^ VhOa,nYڤfLˬPn?BTYQP8ckȽ6ym,3x;Rn&_X]v}`RS" L0z!J 3ïѦ3y}N&vWb³F*J/1 =TYWI>, ͥQHG:Z)Bq 1:&ѰX#{4]}ަv`õR^!ZԐF[z/Coͦ㊋*ae B{1` 0؄Ͼ(A_F0ni{?>$#( ~7\H0Jh`  \nu!$N {./E(d"]Q#6 j^R 9CH #]$w]$qJ)vږKqR3ʇ1snUFK8; apVdjhť%%epm.GFC̰%k̶vwNU|ȗ_,bQg[ȑIB8TwO.>vCnM)q4/ =3 2J{ҽG^_]FA70me2ˋc' u-#{9 nM(Һ5V~g-<3ǝ!8tJ 3/g ( 3iGݲ6˵Jڮ^+)33{of]h[zMKw#4k~AVWy;\en-Z_mQ4' =1DmunbӨPaH?/?}s1Gz,bYtT!c6ڥk@p嵇̃}m05)aF"!npuG*-ӽ;hg+ͳe)2W==!y1/gPgď]b>KS?=tk8e<-*ߌ ۳QG ?]Bs׵t@:b WV\Nn=r6vU H߰X!kf B ?#/m'?W,]Rst'"][3aF~D !ӵ鮪r.WioMۗW ܰ endstream endobj 9704 0 obj << /Type /ObjStm /N 100 /First 974 /Length 2434 /Filter /FlateDecode >> stream xZ]o[}cP~٤.m@k#\gh_Z7-I(wx8<9s0Ĕ`JoJHxڑϤ=%ɆkO6QLtxT\9+8 :1A`0dgNK0S)61hN)֓LL1k,'w,h9V|̍\6>E't Y[j2y1DЧ`ȫ吵7:!kطVl}VPvhEt$^#|99Ȋ>q61z 8R88'*f,6[XH~aqI22e<[R+j]!Eշ>mq baʤXURp]fi} 87xeIHWscc;@|6|t޼9[7p6'Voﮯ?}ӃAru(2zĴT %[Ae %dDF <274g F-h8ӴwV%X=8g]WF̝gX'Gw4nْKLB6zM Al8z&˒l.3$[Lsn{0oޘ9h|lO02'h~7|ɬ>?7`m^~n57kgn?dRǫWI;XD1_ |?vOWaHS#ƯgVCgwՏw|?b3Z.k:=Y91ƽmhV] wzÏXz}|2v%n2R[_}B~tu:|c/2$R(?Bߤڤ1F) [̵C-nAL'O&>;F<_{+cdEC$ K4$*n(`(u5,f1ɂC#" Vy&d嘐1ˈgHPHlx*/>i<%A~iZ٧RY9>2G$ gC48BtBIfZ\<:,Mx?QHg\22#6̲ $ LKSMU+hM8LyQ2:>z<]I/{ٍܧX7՘cԜ{=[IK^d#X8jl03wn [%} z7Egr 4}PZՎ"Ft6kނvGβf:<\iSo{2ǥ8opLAMF7X"ܒe`,<7Ad?lWI34etlW(ժUBStB⣖q6H([,8(Xp뎼XA(hGe*^TT ǚTS2NcT,qUDfLא|bj]N҈:6TqCzrpAH0B-!x&> stream xZY~_E6K#+yw{`& x<άʢ>xKUY_ <潿/ Zz׷^ĂXk/JDw{_|ųH_[:VEզmYWv( Ԧ_?iؑ_f_x38ŗߙ܏ d{rPp>]킑 l @TrE)㯟^_~Ƿoidr1`Yi^/H6mٻi`oog>_) L%;sH=2R ϑz6UUY&zEgܪfB҃dz]=]}7' ƘfQ{^ݝ#.p:hOo|<c}letrR^FQ2RCRO ,c ')BqHir#p2@1,`wnz%#xeFzYfe.޸9}ѲHyfUHrm4uYC̍oqHjmrXL,X!tMk h^ Nu`H =%ceVG,gd$$K+/]6Xة{8pdC6Vd˟^>$AאN<ϽGb Y{֩l 7?BJK1>fjuc$_ Dbhِ=L/:3"Ha.;[*w8*7Rjlp}I܎UrN8ljkF]A^m,)T0k ktq@jeʡ.4 pǑ..ُCSVf/|&W‘Z5V:g&~ .Bu$SY"!HݬGedp5! M 6i~Jls9C3|?],>źʂY2@y#wuԾ=f0v-W;niؼLXG!MWyUv'qkt5xj ܊)dwB-Ri:մQ54&8vq`Aɺ/G_PUItVz>K^#y> yj I$ xL$M`[>ṭwIMGmQYO3^\4G CKTԮ;/Qґ2 P#黙 !pUfT`Ά>K?u(Ҧr˔ X1J!D׋`65,v>­}5mI@ukv?Ø"]jLfBm8]x𑅷TbKRtM2;[@$kߝu/|_ l6+0yB4@kڲRvUnQtn j4 aN*BEcPT˪=XpJqZ* L,K0a3O\Ȑ;UF+}"`& DU@YʞRǻ2:^f^'^&&9 l{00L f(6um$2Z؇`@ <F”Ī)ϡn .VS5sij0夯;MEf d=TEgY4R^""IaPv^< /ϛOv8`˟ )"rS˴dͺJii JK%5CsM8s(LxGUH+ -5qL'k{#xh8+!݇bb[  KkkVe=!c[kb[ endstream endobj 9792 0 obj << /Length 2922 /Filter /FlateDecode >> stream x[s6_gj_$Ik!dh 9HH hKxs/1-Y,g~dd ~^jqoz"I*8Ň'9IXE!yd4!D,Q Sˮ/6w}1IʙeO B&XT6DH>f&41fZWn_4oe!!RҪ鋗ՏT,r bb_p9:As. $Xr v#Ԩ/=H0dBBA$ۏ.of)mwwMޖZ,MQUsz=2ծi{[X1}U׶ʵsN?zekZcdqm[hD8gflX}akڍH5h }qcm;;ݬtSV]LnXsaY]p` k40j9׏^ۚիտꦦfAqK鲷ոXm[[͎"lnhTe׶Ye@}zL?ޟ->Y@1Н,ݾz{hM۴.zLj3>93ſ;+Pq|Uۦj1v)C3.Hۍi}iEON[`ТXwmUV ]#@"С"2],7bQWm *q'7(@Y Յ|QͶ7!z[j`ΨZEILȶ,ugŲQg:[@oP.ꭶVW?44͆p޾87K<ű޳GU ~[u,(VUa٧Pp˂%ǂYz bǷ '*%[}gFǬLĘ + M%TpoT-XYoW6BrΏEz. V}Vُ)i[8Y>COyh /q18O$LjڕlF>g;cc*7qX}D>k;3 2: )A14= iwpFC.9  3A7PQ[L*ODsFE"x_@_L#٥L$B:2m5?!~30BUc3Q%'?;$7uC)pP(j`EFd8\GLɄp97(")8"`FM"Md:R$-`OBibŜӄI=⧰{bOR0]8x;_gSOIQ`1 oH)GaQ U1Wc>gtf.`Ʉ|ʣ']bI{*Ko5a*]vcL=JgfrF _~  Woa\7F(u7 lol7 nz{3s񥲏>W,C*iǣ\!MqB,[+lci} ΞWy&'He;-}]뜃t-0`Dx͸l~c,hVWmu~9R7c-k endstream endobj 9815 0 obj << /Length 2166 /Filter /FlateDecode >> stream xZ[sF~jU:}o:oq2[LJ%,SA4 HG/\saoawoRHKɼ0 Ho<>$!՘JtV,"OY:-$8MB{yHgb'Gj @o؛=rC3^x7'?`FTKRG!I5R$Q!(x;ޗEwDp$XPʢrfxiwOD(@MMY4ǀ @e;"?u)IÑ)HRF3癵, ƸpsULK#l&0& }pOr(,^cFp jt@vs%Hi*aC1E`uY"PKϢ]Qu2*i^߻-5i(MXk2 Q-AVVmh?$Z#ƴ7d6R(p)'3Ԥ# C]Bj+{|+yaNK`!-?{ޒXIrqn2ؙ\"~ D%W 1'B 1?,QُWlRe N12N2P׫$I48RkyF> ǘB6ùҪP">-36pf'{?G\9Iyd,i|Y"4RK:^~4`MB؆W *9 S>5ϑ$h31Z?cVeigGeQ՚t۟*snlLtQ[9Y:#2K;&6kѴi1nrEZu Ч~2It04mHb+QWÕa} $o0(+x;L\ϊJ{0X2oLG y5l-Rk5'5Ϋ jRH Ӓi\)b~J38x̵ b.,$O8Fs 3X:嶱IJ*eڰHM]j`.wXy1dY9?2FҬ-?9PeeJE础_X:Cc\VGW'}x޻馥5w:G?FdtQ/.b+ƣ^~}E7r~`˟&.8~EǣtW7hܛgTvcWDߺ)Ϝ4x(>ty%#+NFn*OxUZvWjZڛ&Au~N 3hDhLOybMML0:4ޢN=ڤ<*!v5zJ~]A(2+w&t\P$;A(dzl[)(ݯ|U6ڝ ) 0uZktq/f^\vLtJrf,,xQEt/P[ĪuJdI?gHu*՜hȚJg}o*5XBB02+Muά1*qrQ`̏խ"|>#Nͷ"cA g[kL؏9")g!_tH͒ȭ1Z޳>> stream xZ]o }EWHd &mMz)#޽cMp(Ѥdw%K(rS4A;6RB)ܑOjuDL 1~I!e<$'RS97+qJM*@ٳXɞLN| cX;IaqSnz _ax&(٬k'JM&#MM`(uG;CRs;n,}JA-" rCljK _!R |e,<'fˀc\ =B K0]Imv7=Cj ,–(#&rG=1bz@R;`^aEMc"5=Xb -^kX+dqUWJ%1[O=:ټ׻mNwa߮ry|q99yy:׈0R X*q ѣnEytgweﷻQ~7a?v?p_5Rp:.#{q>ZΞ\Lq Y?y9SV9Ke?s'DZ휘]0k5Ya5UD|<=Gs-UOFGU\SK>yq.X- d ;!&``| Bq;4#<\ޫt<.]o)](Ệ X_ }?KgaT?Ǿ^GĪ Ry}c?^bo,G(۽??7eKΣE}mG!GUSaб0 &ѻZ4pZ,N|Xl941"Fxib J2PG+4{rRRISYAF_$TI\єP)3/boYO=3BQBFf/a\_+ܪ%^yqy1w͋Ϻͫa߽45֓`u ecm/u/>t-iJAmR&F[޽3Xa"""EȋXŲ^[~sT%t@lrgx_m~i;4_7r94s#m4 ̉JCka] rDR.. @ӬÜ4)\܁r#B![쑯aX8<`ii!lCdy ׄu 1Y)(3ify$/|D掅 mG :?jH)VS@A6dLC§}D|T!Ә>S xKn4ʂ>d;gL-1P<PX<`XQC3H2$e=$L1BxA"mw^6zvw=uF_3¨XAr?Q'Z) !P ;bFgQ6~IwCQg ]TGA[# ;N^ύ}G[۬Tc;#D+99k)GJ+ Je$ard>yw̻ōyFA\gZ2E<,x\i &EÅ}Xe:*Cn:hϒеާC_gʩ% R9\Iqyh-~N?!s c`\—$&ɺ\]X.,WQ9--I]z𰂅>ʈ5ԏTea $]{dDTڙ%9 ?;ߎ[ZTw6"SRs里B\J8b+kPR'B,=)9,aSJ\Ò֞>7#p CPL>ZR)tc+ڃNA1י$r1A. K,PNL3-C.zP0G*Y# tGo⃦A 0azgItI%T> stream xY_s۸קL_3$'8KT'hh9IHu?}w%ʴշX.]@N{ |y+a2^MNƟ*+lʸ}IY8N",V;J|NnXBl-DuYGG0._7}6[Uu>YX- niAMVU|\O ob&nrOtTM~Dޏ uVE5f$Aśx#1Ͳ*|4Ugqp7b.gMQ^g였GGJ3ҮG== fyzN=.,b°85]?LU BYГ˾o-Ks~-Zx!Ώs:?HN ; ~fh7J9JbT8M'Ņ`1Bl !H-`;V4VnzuAv}.Meof_{ u/{w^%y=$<2]1lo,akߎE4ItXv:_Y*ޜhm!ʉXa?^O@oZ!-[iRALZ6-U%fFK23ۀ퉋d)|/iF[<At4p90ןuvmu.6i`UT6b$োw&v?7щep8 'LNzH 45LiWx|kJ Mry֫C$-S翜^O{o)y-=$!)Bvg/?_4\y Bʴ !!eX! 60ۈEk`. π зT.- ykT/Yt e"5ߐ)0_Upuu9<ígN nG;U9ͦ-mȸ~1aFb9lIv{Bi%$>DDN6$姫}+Ek]!.Ⱥp ~ݺ@u]>—.Xk T%qL0O$KXfXc(> E>4N6T_a5.}ҍ!exՄ-.Iu \Y< nW}zPXf~y-0ʊt;0-l&;Ґ5xSԍxLoW*8܇.Ur թJ=r*SDZi"Ui8#{>RqHE=#UGӧTHE((R8X$ig/{VA B!ʪ/H/c5tz}s_4=eɳ.8MjCv8{pcw^~V?\{My=$0A2|R]{HMEHkޔytl'm(o}Y/f)lcά0]T;J_;K0>ֳ|aUWiMg<_D׸ȥ3E3#"X2."@9&7Lwk V.wtg{[>}{jeU]+-qEOv` C;RUSNšK6~- |:"_U}/D9%8%֜ 3+fb}[O f [Jc9v˼>7ZՀ#І-.~h9~ t=|/ ^Kߡ_%8X?K 2IoOA-b>jx endstream endobj 9895 0 obj << /Length 2366 /Filter /FlateDecode >> stream xZYs~ׯ[*s<a{׉vKv pD" DJJp0t=vfv>4>yI@#_ (Oi@LEotH,Z-dZef*DQhe_/p03ëOoO.'>!;dO-Nag ~v0b< 8qOq {HA+b]Ϭ<'uEz<]LF@᝝}v{ж ]㳏G28UXպ0dQ"J3g%N3 k,d}x}ޓu󘆥tȿ6!#O|8N𷶎ѢOzsW>jIWC2EӒK;* Ž̛d"UD-+WZ׋'_@/-[mCXqZʙO_4⇧8ܾT3+iB8MyJ%?J 0b+vqhM%1mћ`\MӖ,,5hҥ_+(A*3'd*u%9|sq\Զ ?ixAnGaf(~<<ѧ/Oߎ=CB,W|r6ނq ^U\u_2P T~VkdRHEq.s!-Ȁr`7ΥY@BǞ;OJuScȀomYgv]Cc$fto)C-6<;N%YSVѕjӧtd @EW}6r!K+@: a2, '0gU>lXX -)J<[-rRُ-ˇUiIvPlhy'tF/O|Vl`(J6(0I({yvcAÂ=x沴N&rMlLRPl{A}@>g$49>VRlv7@\GNu+K4|" '[)"8hUmA R &lUެ0We;Tq_J"18|L 1SBXRS"++7V TؗT4h2<֦f;+a/N40t&9݉ .77YH(vJ'^w\YU09옜S1ꔣTMf3 ط;P%@[ Xf ԮthS t w?`$'4cqn]ql:5Aǁ"~/H.,ݝD[bEOle*@TFӼ5~EB+R_ü=dp E"␓ȺH%piydۥb(MzM\ 0?@<$&qu]foy `fI ULGo-NDN5'#A;_Z᡻. ߞ;(k"{N=Ls߼ }`!RVt?q3a:ϲ۟3'#O3s_ endstream endobj 9823 0 obj << /Type /ObjStm /N 100 /First 1010 /Length 2954 /Filter /FlateDecode >> stream x[]o\}ׯ 36@p?x #dH2*IF+e%!\^p83!8PIޠA,{U Yzsс(.kL*ZՅxG2ohzҟj%KhiS9 *Rj.K@P}F(X0昩 _U|6> }2!`}?8 /L C8:zX ZA~`ha?%Ix2(\h>H׋%XV?-9łuܮqrѮS`"]CP[PRb-7lsS](,`1FP)Rq-("i~NA`O:h˸H /X&e i#>mncnFt#G#kl$K7MaMaMaMad$&9o&9o&9o&9o&9o&l&l&l&l&lK=&yNxRrC ƛ/$bs8B92c9%%Y+Sh\y|g<{I'=NY3V1 ^INW!;"q} <ŊGʳJ`+b&ca? -W$_Dbr>|Y -~~ܝqD`Ҽbm)ΓJv$ߡ w4F?b[zm`Gȃm]dwHHa(=#MYoa*yLm %AU6}A:5[Ku2Rw9y֓7o:#YU/Ն~&lq endstream endobj 9926 0 obj << /Length 3328 /Filter /FlateDecode >> stream xZK ϯPnTj'\W3냓xzk#q$J"R4|  |@K,6 ⫫/Sb,Iv%"Tz.i,R.aWʖjZժ,F:KD۫]Hh p.v,Vwb }?,D3# culnXf )fPDb$D,Ry+ B9ձԎ2 NfļTZecphg(gil VB25S҇朦q~J>1xQ{:f`$XxZ3dfU^-PdǨKc;!EKzglmRДqЖm 6dX62$,#&W'MJz1)+|';+eQ PNh܀7p!o6#\5 57 0pm>4S4s\$Adyy:}hh=Dc)$ &AXϡT zf{Se'2q&xfe#c TK1{{(V-^0NM#=<}&3{tƩK`s2$чݣ+˒gGr@-6ܡcS Vš jΥeVub)>L>n?qvB==НAwN\R (ci-J!&u}`q.&ߩ_DvC/7B8a&^-6K= *2&Λ'Hq~ߚs[g0k89ku sB*8\J[0=u1q*9 jm6g6n9?>@yP(i?- ]FY Y8̋ v?ZhE$zU^z0~M63Wj 2ں_ a]@cScf'!^Oj{tk_5ps41?CP$P#iweYj*(i$ki^+-|q 7p>7uY]jF?oиEE5݅EUn endstream endobj 9939 0 obj << /Length 2695 /Filter /FlateDecode >> stream xZoܸ_j"R%-4ih{`&q g]'q\򐈢EofVUzw˷2X~TY%*J2+,W=F6PixKRMS ;]yori۟ f^~OB`%Fqi2Z 0KWrЏ?. JM%^i;[+tbdWMAhn_]><~W5=)'fWPdcX`4(ҥ$Nۜ L?_PgqL^7]g22PmS #0y) ]wG7kpH2[S0C%G9C?V] 2D!h4xi5x[pe9rY@<F^LjR=\0/y7J<>-ek~M>JnЇAdO퇇(ȏC 1  HlF3MDRV>_'8C,D}$BD8Bq3q<_pb ug'[f9 eY""mD;Cj*6\b7]}w͔osz;`!X#Z(4֧ %@@=g0znT9U&cDvh4/^ ^S+̞Q}!z=TFرOяc(%p~xp ]' ;5C[( ]Cd(tch#$i{[ScǦ.BۢiA}SƶZ+&'@p5T_4XVrŁ\ѳoL`K䶢QڱkFfǸryM1>%f0\oYd)e1 R9fgbM(pElG)YiqC2-s кcxYJ"h*:J!G2Q IN80lwVXEN Z#mSN',pvtw,_GFȡ{,c%;ӲfGFD/.2e;Sjz IHv4= C,|L[nFm2qu%qn%U̾ j (]F̪o(+2;m=xRox/NUV;6$S&Pro #ht:^Drj7X[H\5Pv/n&/=Ԧ?,T[ѭtbi6wEDβ$* 4 mqD/hN >vHGei9eSʦFL:2vh+ևHᔱeu]cu9u[x}dsv?օ3!bQg$G }Σ0)t!~_eDp ul+uWp_VwֶW{ vwƥIي.|y54m9c]sp'o; c LWZQt=9LJSH>;N8U6M4̅v{]P0-YB)Zi>a:qIۆad]GD~,bEhDO؏hN #gBYbTa&;`ͯF<49g\Fǻ ᔭ`}M s7IfҤR1Sp7c "OoTU*KJv0A~s.0lpq;[vaoN(&ر8ŪUuzRi;Ra[b%6Y$(lNw{?3庬,Xr:3p+ ־-')N+ȍ_+NW%!PWǐoO]&a}cߕ2 m;Мs\dm/YQPJmj.zl_=w|V#zscU!P"! }/B ;iYu:S"'_bo۔/o/eR|XZ_Mn@#1x%W2d[vp4 luћ#:{qb:ttq endstream endobj 9985 0 obj << /Length 2258 /Filter /FlateDecode >> stream xZ[sH~У2=}ּ9x*VfAƪAb<ޭ{"@ aV|}F88pnx5ŁF,> #-e"$ [H"קJw=dأ8̗8'|z  8Hh ZᳫgFq@ Z#My0} xKtlg., cD4* FJDr[IV#qxege>^͓Yq3٘ }QDxվ0C7Dk+=7 "-bq H#t HD)RtRW2yW&Ԉ!N鎖 DxKȃy3.e1"j<+ҢLqO/ J#O[1TTc%ʯX^ `Q,tM$`!DVE dعuC+멂ٚݧڤy^@a fÔ*"ɖ섍I_)%#ͣgY#J_FQƳK 7"Mwmz'{kxNg~Cb)BP$3ɬVr VsBnbx,)2eJ7|Ju1䔆cJp Hܼ 7saY2)^ܔ-Y" P ᄎIVW4O>38h8!r M(r7ȋ"XY,~FN+}4sG7gdB 7OMZhCk'7p| @.V#4;k j{y |G&kVqvP) \(GI\;-P:BT:(TC6ŰDLOK1T({D9. (> "c?F⧈.`,DtxR zx+eUu)hk TuF3f@h8yS/ʡQZj l_az;3 y (LDuv'@7:zSB٦ $USбcQuF)UoU }yCI#rC,L,taU`Y _ µ檞0Zsg>NҒqmcwex@7L*as@zQ-jU# nGPlhwP=Wܬ6֦?=\)?2TEOZ#-wX _ (Y;mcsЭC[!c$+\`Ar .|#9`6ʐ9bG~,J^1իX`d,S@d:,I%-(^f@ڗ{2lz Eѯ{_eRyG'Ϗ$3ᵚPZ(AHv7sX`xqu./~֬n^^M]߲f~q6[{ վ!؜m|K7_zwW0Sjmϟoݏ7F.WGWocDqy/0Cpv Wcu|^!f:*c6I2*b}h.qY5J;$EޣA:V4+_k[|#6~14Jw=v ^ԛ-E<}ޫ8]3]aewD1(Љ_Uf=ٖC~(l#Ŏd:.T N{:Y˧]37H  0@lj&Tv3`*s8*DN,j5K2pjdC eY}nզ?4e|)5-mM x&1҂SP x _ñ| l[_Wƭі<\O2{0z#uTqw/Q>5C[-֊o>]53p-|U.Ve S(Tu@W[ގOAS%R5õlLf&aT 11 㭫jDc(_, *̜+7+YN D9?FE'xaΥ]w1>ӮD#@'yfIŏ!(oK_"MQ%HJGdXU}cU~p,p!?3eGw-`?!Gf?̍zl =Xe endstream endobj 9902 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2995 /Filter /FlateDecode >> stream x[o~_ pHum 㰷uؒ!@F ]t+5'Y,9Cr~|C^*J4"F@Ark)fkC)@)ECQx* Sno!("bTn++> )|[$R@3ƈy@֦Txb$kcPF+e 1Ik[[[-&U L2 ^JK FUja$E B(D0(D7* 3PP0֖D!1A~Hh|m: B6CXTckKF|> ZϞ2(,-GP6joplmS mLs»IL m,mf!3E~ȉ[mKa(mGl `a mM|6G<{6l6x}1l^ zwyvշ_~z}Q?O݈1kaN$AВCU c9y3;^c TH5ey<{Hze*pt] 8L݉懫)'exK+5.EJkka^V\ljBQ'in&\w׀ɻh:95Xœy'X8,U˸̈qE T\2/ Fu+hXشC";z"LKʓFcw.#M%Dw㊶#B7*PȎeޣf]p^_өV$ Z. .8+_"@nβcD =zwu<'6$ 2"GnFUveYsf>t"#++k-yX;h72uD T$yhF"h?+,x fHa蘽ege8HG hpֵ @lpx|YI@:G|f/Π}">?Ph%lc'"aP08n%:|Lٿ~͓Z }dECPm%{ؼՋuzx{`^Rϯ r'{T}W? ͔)B xN5^aV'1ZԊ${"NNtwB::}C]k0V8V"`8︿ |n_W?^mG?TRse Tvc4#=﬎eEG8"?T;8dLh^OzL4[‘ ,@d%Ӏ<.# L2bCiB#V50_3o HX\F$P)%<rʃлqc-/:'j&l9I+.^SBP D ÅENa1P!]ص "B1gsQ@R FƧ#}H 2`. @0?B5ߪ`Jx HQTp,!ہDFLPg']͑ HvS-`a D>-9$.q rlcӭHE 0gB>)`O;ޫ%8x~/ş 1 5S2Gvy (`kZY`nj%ú]8PEEfAb\puPf,IpX1.[v@?Ymok :ܩ3s'E-JkӶGHZ_tgnf`1g$nWחmkG*vE; *h,a%UiaiKW͌p%Ց@ O$NJCnx4K0#KՓs.JܖNG}n'Ȫͯ }0$YCT0̹/صN Py;1z ~UaHL ]`)T/8O*'B8CJ '84k6H]4zhHQd79S+?m&+U Ov+4/T9L B:1,>˭-B#9TߍH>"Ղ1 D;X3;%o y~lg)˟.HCr_标d}C|OŻR'bs'@TLꘈ؝8!l%5!#5ىv(1G'NGPj 'w]0K+`0.t49Gr?~HG5t0#H3{η!!}<O` Z}J}J}ԇH}ԇ޳g=kY{{ּ&HUrFgwñB~"PCFD[~L0PO0sVMvy%gUrqq<*"A_aO`h 3%MЧo'aEVy.!6qʫr/A|;k+P;i]xu}qvϐ dX(z.~~2dzۏ*>Dw4/n ( VkN~֜e 9y]| ]>.n`)W4 4lj'ylg$TBO QK8ɊVۻ`SQ I4NSSChG[%~́o{Vl jw?N>́Ԑ¨XIB˔)qk|e endstream endobj 10042 0 obj << /Length 2257 /Filter /FlateDecode >> stream xZs8_᪵ $A޲3lM2s5;@b*X7[ؙ=!D[_v˱>2=s,Bޒd41 &"^g I~_Dea # pRۯ Ǯ׳g;m>gE˳o+oZqzRK. ̚1*8U*$8.1.eַ1NLVf{ws ].׳2Y/8f%Qga1<7;UA!^ן?P @E&PEDRv"!<Q<uh}+Nba$) IFܱ 5e1. Ɣ“u|OQ~P~e|"Iu]kpuOÎLjqHa=o;|]O<4p-zTyY{.}'(6sJGOq^PGFGc.Nf yOc\|tt0K2;hMQ㝍axhO +),͖sz93y~7/L}d(Ov2617 CvRUx7W~Q1a`YPNb9$ ƞKO7*'M!Gc]g1ʃ/Oz"s,{Σ} Nj{_ l7@jn1f\q~ n]crC۷ݧ..W_n&ߛ|y}yoL߷UfɫĨ+. hMc@ǝ^3fY-q?.vG4?"tbloeچ|i{;NkTO=[@{q"a*t5?y>8re;"풤]UR4|mp4}\ў LGA\dOW闻~2|es=pxw9@rAF'r /2:l79-|Y%>*? ˅xn S{2VŸJMRhCH1 du8з:έ0Q-Oxze"0?)skn5D8 n_R_x=w6Or'L~S-U` 'f_mFYs+e 7bUD)-U: #W~T.kt6ۮB*Db|*߫BMu3#7 /D4ZnIJ_;ħ-yɇ쯕)XK;sqLo1汾Lph)h-@\Q4c'+ef])MȅNLNRy8;g~`,VOaϋTOD=?`Ikߋ endstream endobj 10068 0 obj << /Length 2578 /Filter /FlateDecode >> stream xݛ[o8)hck CgzAo(l J"ĖiHɢ%VŇ@P?'w10FR\?xL6xۨtKgOwE>ӕŦ< [] C&*|N 0M̳y/tÜ"s~mE*&X`"lL.>{bp]QzYNI8'oxϛ__\zy>2q嫫?~R<ևw4)7Jw:gIWռ3Mv4I-sZǦ)mfjp0g$32MW^g[]rs}Rlu5 MN<.qQE =#ř3RB$Äwۋ"uGI-pգ\r'fv.#O.p^]޼mׂgE3Ten 8qwwOGEjy&"T#ڌ?6l;@J!2b#F`@fa t9ɠnY:1Q2}O)YMӅ5a.E֓ou|{0c +s[sp3*"vE LOIa3Y^Q%`r+qqE>`Hv\⡀h<trYW*!._c=\CՍ &6 DbDp;F, (HһCC:Hڇ¦cTxnwïECw%dˋZC=% )OlW) aErUaVel/8]I?L">鑋T Unkfɔa{9`+C(^C8262/M^W+Hꎡ/aY t [Wa7!Q1 C "aiehNp:v)c'\ن}} 1}&d3 U+w+d)0P>CR Gm֩?:haA}hS xK¬S6qTfcQ) X;FxdVlX` Q6+XM=Py:s^qXa .ԅcEbq|(W\*/!EV&D/Her!TqF_a/m88QF-- U!"K:nT=Ptb?5dyoB'j/m@cc$٩}(GٰsCO1x՘{1oa>ڈ N8GٰG *ܴ8>+ț G!݃vMzSY:IV} Jbܜq>lwwoۛ,8 6r`q5ٰbp+? C> :mf5M#;`SU| j,>uI heJs zѶ6Y!Yڔˢ:[iL{9ΆEU) 8mJ/{@XcT:S5Ӂ&L{-K/*⌝zlJ3V5M5_#i~m#e 'W*<^M鴈G =zPuN}6QZdكeNY~]ӳHwOO/5~ endstream endobj 10000 0 obj << /Type /ObjStm /N 100 /First 1082 /Length 3097 /Filter /FlateDecode >> stream x[ߏ ~bۗY( 0$1h#C8hF7H3@fo ٛ=$F=V#}#9 94 y  BvCJI<@]Gߥ0$ȥ^Ѿv =IRHٺnD]J3Q`0pL>lArL0GHI (V}/ Y0@VPU$h*A2oKHi \C䜠`4Y !E"xTLDPDoBɭ"Zs&G&9bb1r211Z! UCb0д~HWtj:YE2<į" 9[ocXgyk^9"f30&grPد%ѱСbfYe|z+:Or6sIīD$!b.GD5eIKmt.ֽyymZS\Q<ɪel+GU;k%Ԭm49ZĂv=A}iYcIp]) `Lb;rҫgϮ ߾:|~W/nnkׇ:|Wo|?|eزucX}#V/*}><{6yu3ys{/~n۟۹]_}Sۏoޔ՗8Q^ľUZMK)E|*Kօ8\4Wu+{v>1aW(B-lKD-Q5zV&ԣӶ9U.ť*4\Xk:/sO=q4<^0 ՛Dkuq)bԹTe?^ћa$'VF_c]D#ȥg NcTeis<_)\(h\<Jޏj#>,Ԓ |dKɋd=Q4 aԌl\Bq8}(S$K쵁 ȼz٨ˊ^1oww_` 5n|#cKXKSGop=g? RO͈mLp&wlco68r:w@~\ r{yL,3AeJM9֠IM{bm2 '\ş"VvMR\۔Xcs,l; [|wQ[#bn$3ܿǗ5nOhfa _ W/7]D]Olݼ1 nCߔg?&/-t^}}=Amzz(aUo%6oV>AM 7)mm}m}m}m}m}o}o}o}o}}ދ(d}% @4qiAZ|ۆL-,\H^`Z+c>gN ؕD1 v(}j_lNP6"HQ7Y |Xi#0I:7&""V7-⒖4i1 WD|\Da΄G#iq<`^ʜ|;;炁Ѕ-qf>HYRS(,PiôT):˞ɇtnB? >vaL}61K.&q+e) ɞ-Zz%o/vvE JXTVur 9ioɢp2[Z >|{ vZt9 .s#'|+Nc$4ZxjkQP'zD+j+Xj;Q881wv ҕp-UJ\U3ִh;; &9ӏ6=H"[̅18Դ#Gug Rz rC=G/hNK+BR =!Jl^Ubccf8L湺DRA2-9T4ٮzUT}` h`%F6i sjz@kGSY,xֱAi'ƀWFh7ȳabƀB1! N\oSED- @4?V  gL kDf O.; P.wW Gg7ck3N>*dim>NHcރe5yO^/ڪ[c>F'5,[djs_'cmsoՂ9;`r Las;6zAT~ pbmpsIF zڒx< دuNmwn9Զ$\N㟓sGj[s~2pxۡnjMRRIdKٶ\nkA_> stream xZ[6~_[pUdN&mORnj|[9@4[yi;:'Q<X~_| F,XFAP$I\Bdz9M0?F]qvUZmJE>~38,mf/]<H(<ȶ7~$0= z,n~ހ@g \UZihf]XԿҲC$(Pqk7Jni. F={Mx1*1،93:Ń ݉^ejAF/b6'"O+&%S $RD#&7^'KN#ב6\B>s0#~ϱ#M;&9ԡPYZA fADǤYfPhfnԒnucAvr~,weR׽zTXʬXvNIنvC3htÈM7Iҍv=rntI6v.DD^5 y`bՇۻ˻[kiks>v=x̳G#PAZ7ZMBV<(3ʶ;7-T{ݜʜ,m>i`ODƩ+aVʶf`j=1lhy˔}:Eҙ^)wvMUnܭpsa:Rc0+z "9ZEʷ͚ɕwlKAX#Ӏ`# I&&(Lgbta.t=f]6p0o&+X_'@> stream xڽZ[w:~ϯ^-<$NzjLegMVm1̯-$a0f^ F哴;v~Qy̙>9#Pg:wDD]*Q~S׃@=>L8#;}S̖g_~s0b,z..¹?6cDUc Z5;E` |?>\6MM(D.M_AfS!"|nkK#ɇ$ց_,Oc6) Rp7u(+6BRa.6΂t @CTR-2C8Z̳kMnk+k7),6fx@wʀJj 0Yрiͣ=jp4 ue&m\tX0>o>$zwY657A؟Ш%B`ًOdB 1p =B n Uf#8b%DFswH p!JwW;J-ain5J/=d! cr/Rm 0LqLC%@-Z02}2 Emi[ROd{8vM~Uv8̱^2 TY (!-Ǫłd$ہm'Ysa?j^N6(y JAE M9b$$h!-'Љ&C-@.iYC<,^va5"p@1 ( {sN,Qq3w0jh˨*4_A\"@\U% t:FY'd"3 ,J K1jijY11[mdT&bEw.P'Ф`G^2 ,D0y,"O$bØCK Uoשbx[}L>1upZij=GcؤH2ګ%Rv egfΓd,!sGE-r:u ړ|ģʝqaK^EF$Ղ*RbPµ L;/ұjkd2J*5̏1p6VVO%ΣYYCF 0άu(ufYlk$ MJ%%T} e̓e"Wz0,٧~XW5 4wdl1~W M1X@4mюХBD?OOM]znB?nep-p }1ցe%io6Y:@sMtflnkⵚ<[/FP[()3 '>+|QFs[`ͲrWQCw_@.*$Dc@OUyS i):Ӳ!0O[G֙r& @zs[je ա!ry>v96CNP q V׊5jLTrÕcD'6T))TX&2\u{3V1箁:"ܶiWE!A7InVQrD1ZNujSZNuf|_ lUs4" &/ J KYUhY€m,a@ģV0o-OQ5>[.$/!m 0gR/6_K;"]U8(#LiM}h!$LoO`,]>ƉM[s Gޡ#c'%;q:"E֋ƹ>&^+1:N1wbp(*T. *u҈ ,l&oB~RnNӛ˛?`rN.>tcexηKw8\cYФd8X5e@ۘuqN ;Nc49B߷$"+g꣞nônm3ïӛ>r~? NK&O`Lkc?/W1̶-<05L[&w_o>.K֡М0ѳpT:/pã}!0-v+NK`Uiy!%A}ؔܒ-^W#!I?<Eo'־oޮz\=nobLHS>_lzJWjNr3\GZ1k΄b'! O]Y}MB>@ߛTE߯jS;ݎ endstream endobj 10094 0 obj << /Type /ObjStm /N 100 /First 1079 /Length 2478 /Filter /FlateDecode >> stream xZK1pX,`(1BCpي`yGW읖ȘWٚ^,~"9'8C%1!)!ߟDC\l(,dJ/!&Þl8vTL  Ɉo7Yb6r"&m2)Ͽ&brf8HۮĂ*[r4!:⓺\DPn$$ȳ;LxO]]⒍4X_/A:IK I6,u2N4b|d4AW2ef&00sTLg @N2N}0 FfêPR8lL$Vg0AsD`xZF ŝ$OInVNH%I4d~6}&1̓!Ag5 1f7ˋLJ1W }T#Oϣb4 Hw`L:'s L'jfO=U yIf@Йwv,K^> PC߅&/%Igumc=6CZCtat&yfy$!{Oцgɪn߾~_{r6c[ax}ydW櫂"V3R4njX4ZZIt%7'*72լpSLi5 VJv_ȖxUCHq-7kE`JWoEd5;;xdC ,P\mu| k׊N1]^dQjnMK~z='O)6#Z=U7NtH 잝l^ݳo,3?_^o_>vNS~ql5@ݡG&PT]F'W MWs/H^UvƷq^~ߝOoݹ޼zlwi;{o.Q6!{||yȕO(Ccv|' sϼё).|pv׍~ƳeVEހd)R>/kQ:Frtcޕ(ӆdiT jCO6%yPHD%/!ԱZ|=8-0l,lu+Ma;X|FX%u+bo8K, K(P65$<؊BT;Nz#9;Py_ݝ_ 6?r NlL>DhSa(~p涷?jI=B!(Oݽ:ц>l}Q} mw((《qBNz F"sF+ޜPmTr6EQyQY2";ϒ1 ~ԚzzM/0#U)N< @R -gX[84ʇIZqΥ"H7$FJ(,{u- >ȍbu^eׄR 04,2V[ԸȖUEX[ppaKIaCi%ZbdX!H0ra,܍PW6Tӈ-Tt1ʢ_ |W鿂2%rzцSJԦ(JᚳEt "~Lnp/VI%(vSi-7%+O~O#HAzYZ)ai,m"vpJX+ai܄"۶WNF:jTtibku: p,$a|1W,`yCܻz%^K_;r_M_‹z(tVzK>}(i${=ŬwϠߌKuFphxqr_+**UTᲚ=i`0 b>O>4cvv^Vv`$gK&^nQ_Yf! endstream endobj 10169 0 obj << /Length 2464 /Filter /FlateDecode >> stream xZKϯ!U,,ߜz]qeWkGHH"=4 5C$ _w*޼yGq%HK(C$2gsj0ղ-rtjnɚMU }Adǟ:8>~zۛ 9i4b{W, F&\0$8"t)0xE |XBD >q-at]vPWNTی,=kkHcυ9m̋Xm%f\C&~9&Ѕ1)HRcؔ\Ngz\KuM; <\# v!9>'!*idTzb!b?px)hYᛶ&'e8Vtu+t3fܺeq~huAlU>(:=L% +v= ~DDX" 'z\okIZVo~ۯfY͈H, ꄖ#uEg˧^nqk~0??[%:sΐRBLb_w~WdOhGBtM%wC`h-0W @KA Q% I!'Ak$b1i{_̱}؆Lkmg}]p}0_0f>1co|hr ~M.`uǹEnΘ-;BJ&y$*֟@^+tʔvY1-[ciV`i6áonVv~= = 80 KiXHаDM  CîG h eAAOaA9xkFE,5?#&<1쐄Gh>:j}mvo@f'v>A;zv7g8"+·2Yt5~6rqɕu$HU)mFce~o٫]y*e6X=t>a2HrOh>'|b({ ir/Lۡr9|vw`lS3uˇ&4 ؛t`%Kg Ij.@YN EB˄ú *6Q%)˞C&~/LRAm߬|9$bϝҫ!0Džc3:gE%ze ]\jS2G R 23x|ePp8. $:*0I9A^9h @RZNy 4a-))x>.m;Q/'<*$#850XS*^eMJWu9pn"^QШ`U"ުA3 t&S1Oh>%A:Oz4ymK#|^FC2h, e`! TP1'Ae,aw$0_[Ic]~TT_94T| =4Ð@qC_F4A31 AX62 Nc#wpRw'8xۣ5)W含C`r|h̰ xB@Oʾ |ya$%V={^2r8/MwT[лx;'(MӋmvm3~ ~\znLXѱ1Ũ,8ȩN0d`^ a`/5?1+2QX9_54v 7!ŰsFl}vI4NBMՍ\]m*HٍdG3Pk;!3Y\WQ%1cFvNlk;r\{IW.R_ts&~O1bcPlp ߼]o⳱~;~Pw f@ Ԑ4knizIbQ \BX5?H 5RR`/ղܐ(:sBt`2!XCp=,{JsZG8AC1qz;]JAJէkmye0 va֌<_br $hKa@!=Hh_o#@KFIOWwvάc8f?95{b0ACimwXڏ5;\ v'=c ?DȷKYwZG/>+U%|S7:UcwifT  ) endstream endobj 10190 0 obj << /Length 2064 /Filter /FlateDecode >> stream xZK6WEboRH6M6EIZW-w(R^K#EO(j|88x7vŁF, #-eb$ ncH"2SUDqX|˜γ|ycFBkfގHiʃbO#౞`Hpf{Qa/ǭܒ \ c~(,c*Y-׻`H0]ˢXQA@Q}DD.{Ԃ U *˫1xT^VXtmM4"$|98s!ë?"K.&`'[$T<Sэ jDn+]'gTn{ˍlMEPdV%"mCZՆ[YѢBpF432 %H6\ڐa[k2i3ϪLIx j8DP=ωm>5&`OL/n{ {L {I@r>7vnϬ"5wͱDXu4iR]zWK)Cڇ !>9W`T~!jp+u\-J!-l!x/Ԣ^P*-{0R@s)(tVR/8`#=LCMR{.KIDpP=-M.BbohSlO.&u Hq:Xh-I3--yh7 0I^5[2-m/1mM 7h ׹ߙ{g۹j^G`^OlUCyq{vzwgRpݐJA;oÕP8I'I6;_Jr 8̪o.qݰǘul%QeMYl[4@3ow,Tvo!(b![BZP#_걤w@3F:MSNei@M*.[ǧkV yG;ᮻ-|kgi]VgkkH@^Vm{8[/۳{y>OPUڣ72UJCUB6x%.a;'! $[M</BS"͏n^BYM8 0Bu.EqIQP,a@'[RfSaWabG̫f c׌Cff9'?CǧY%Mڱf@nJ}{NHG:-]W=ߍPe0M{.P>lK_"SEw0VEPSv'kq ^tQ nV@y;Áo_Y}9=/})=Yq4#EZt(֛9T.=PEau*5[*U-w ^/r qp:kD:]}GS-:$QwhG)۔DжA8Kww&7:%zޘ#1{EwG}Q| '_\)k3F  endstream endobj 10208 0 obj << /Length 2751 /Filter /FlateDecode >> stream xŜ]Wp*cdjStr11mSmv~}4p+HHw}^ `b{\{_${c,~).}6:/ y)A/(ur?-䕿|绿=}#{sE(5#[{9CgpyUp((J3/ º,R[1="/juY:n7gyЬ/j%YEcaU>}L/,]^W5FcPXȹ$Y=VHB /lZ#B| q#βꐥuK목R]`hR^?-(R=LGqD=Rbl ˊJg,@^GKWN!\`vE-P}O]Te_Ke@ñitNtfCv\Y^=Vi7q|[(kzR|8NVP S>ۗJ ߤQ.~ЋG0 y܂yOFЪ">9Dp@a:w 1gUzmlB!ijP0i>Bi26ߖn3=g]։ S9CG> wDM zb8(Xj%>99rc}uR R R#ӼxnK{g!An&_`$|"ch$"-Pw'L6rh_{/}SzĽQ#v- xT_$Mu^{>{yċvSmu>;#|݋gB pY1+]ڱV?nȌo-$*QΊD_[=F1 b`KS+CYhpY?u,kCd) %\:!2{hG# [$y s :H΂!Å#3->ۼg$J@ Um@RR!܆+ e PtmGȈOsuL:Ov6.Dr An(> ]*cv[ِb ~ jo؅ pOˡ0.dh{2[sYq ^@mn1ty 5MM\$Ά"6pA,cBn'ցXSKK,t/s*bZV3-o}S.40A`tm +7EPQY\jCՔr(3bWS5W%WNlK<&OC-AERv nFSd{/l= w!E|B&`jnlb]|E6yQtlfWK0m+ mX2oGہmSA؁iӵb08*9eZܐoMy--ձEl6<_b G";l(}x4v t\J,$v ]Ӳ]w-̐>MTPSB`ij{!_uܤ3Y!s`[6&$4O lۅOfl(5nͿS}@l_;~MBoLr8ȘJM@? aogCq.5"gh{Rz܋</oM&`jXPn| ]xl^Gsveb:M1YQ*ٔEmT}>vzC엘]!p`v -`bw ` -oj5E ךܞ*[tU:ޡjzG:Tiυ:czjGYOۧ/IKNa۹3/~٥&Hl7mgC ,F&؅kM2w/!3'ŏxv d̕l(Af2T"',lc8|kM߇rvOӲ}6R؋7};M s-Gb zlw ($pADoA$ 8p'DD=`c{ה@D}#Cxm$b#Xo#{Io {sTUI6JyLal.)ӍfiU^J!UHKMuΠ_쾱޲rt&H~~" Ά\1螶Z7gYcv(fVYRAT+8'F 6,*F3V&$ab'0" _huhNM!u  {ք7GXGַtDNLm&[Q PɬKEᦶEt_cHFE]ų Q*C҄Yϒ UL<#Q= .C=)Oe2ߗF䌋}vF endstream endobj 10165 0 obj << /Type /ObjStm /N 100 /First 1041 /Length 2417 /Filter /FlateDecode >> stream xZ]\ }_E#DFǁ `~Hkkvw]4=d̦/6(wHjIv*ٳjBuQő舃$dcBu D@NLKMr]ʮH b֓jj!DKưt(ɕKQ7KWHcb3g2%r:C0{ I@aSJj_AHkbw[XH01gexLV Q'RN0j2PlA79t}Kq,8L]ıH_-8 tqFVSk7=KQ"s1WHh4 Cl\<,RNdSȜA̡jL%$\IU8J"Fs=r4,ƜH1 1^j""t]aW&+)i@)v4|,_cƂQ "r0rm}R}[( +ڃb!P4cb>LPٳ7]\Bbm~pҦӧwW_}+ڪC˰N}VjgGyB7B[ZMIu&#MBy@jer!??[ۼ$d ƍ^"Kx,ooeey l{싑%`gO&Q2%w7GM@ES( 5 i.cԥLQ6C CꍱU s֪L#5*MȗD/@B BgH4MCAR eZ&P6О4!R,zs%DiB mYIeiS咗(.o4;|^ qJu(G0i m P4WhcDZ<,S)JyRh㬅Z(aG,[[Zl: Bm-8Lp"m뾑dD޾!JmU+\c^kq'Zm!6N[T^kg|-f'%/@>H*H*H* R"${jG=#B!i>3[<]v iFl%/7$MR/ߚ}Œ7u w-w~ىʓooh?{t#G?? $9?rBa79oQвĺR[UVY Fm_ǬfZV;RSY |(I}TVi'us endstream endobj 10242 0 obj << /Length 2416 /Filter /FlateDecode >> stream x՛KsHQM |Y[^Ox6@H&܂^oj bw6$*++O_| Ab)Yp(")S$Ip>D!"TEm8,ni/gQlW}E*H'5PDyz'p#Gip 7?t(KDqQE\uz"R rL(C1qH]C@*S끪.Dͪ^ڦ_߉hK8}ϔtp/]55|ehaA簃2T};kZA^/ Y~ ҵ(S+ZucxEp[5wӤj`kBP,٘^~[P&4.k&JH84B xuwxlt{FA+m0[[@嶇sn0Ct #'_p;ȡE_! B@IO((wGLSJf?,x3li܋륍nFuόah.:}+Վs@KC #pHK5$($z YP;-d))v+ ~}I ?yO{=gz8:c̹Ξu`I8 7D߳fĈڤm'bҾewa/wH)31 i2Jw!@bĤ:9TPUWuٜz}6`d=/J!": I2؂ tf )H\.чɞAw v_|CCGZ.G_"g0Ӎwo _㗺bH*HMr]WR%q(r1zFi'Ԅrی-4-#Zt -""B3i[@˕C?D _Vߌ# z)V1GFq[cׄIbg" A]=0K!=4;z<>^'/g4<༨ qM77r+XqрMqZAT[R agvjU01])za+M5]0s͚~!vOCtx}%)Nf^/G͘kcuw NK5õ~Vvm6R mj!N]|[4[0j6LcnR)|ҵ +: KܮmGwAU36^ Apn"'r ^@[mk2aUox\u:{r[dy{d؃4ӷDvPd aNEl㱹<MOum)5Pӧ'LƪmnZ*])9o.@>|ɪtI`ln}ngR~mĻ4qؔDZ=vH4~7yOEնL#Bw73Ɛb?|3g,Mcl)!:XU)-wIN\ˮav18BL9Iz Bo9$htf trnh҇rJm+Shk{KݵHް'zyV۰ w-w2H#I0}0InmQezF _eT6Cpn(yii=+UŻtkO;`"!oCՙ|p] fEp? ߟt_o e endstream endobj 10262 0 obj << /Length 2373 /Filter /FlateDecode >> stream xZKs6WTDnN2;fbk*I%6(ړ@cWϯ(AZJ"Q"e4ED4gTc*iI%rٮY4yYW -\YT>m&q\7}8c\% J(/(~0b: g^EW^a?0M$Ax;"D8sFy\)(J7D`ąD1UtzFFBxѦcLWy8P=HrY3%Jq-Bڿcg\8/HmכJ[C=jK9r0Za$j0b\B}}mPi]S)],͓o[g2c8.+v:SxYX[5+ظ?,K;~jg2#5|8!Ǜ./}`Ƚbgd]3 S>v[3IB!K+DĄJYw_i(-|5bsDY24ifI<$HNK!!TܼxI 0'yFWi5uuTK $!&W}sPĒ| hIȇ=xͼ0rO.1eφ I|5gB]{&{DB; lL; (*Oo-LmU{0܏  \0 鄀_{zUG`T ;龵 ?sͲXbŲl&|26 PŹ7鍱S2v  C3.f$˽ٹʚ֤]/`9mR]}bMjۋU;=Y)N!)$N{cP@ p%IBWQ²B{$X!A7mōe΍6SQQ͌1@Z`!d^Z% Ң Qؔif"PQ' # s1&D$ p=6 p >b7T3CoXڮ3&,ͅEL^,"{%zj?:I6M=,=oe˒%tj]-" j&LaZ7C"DQ!#c}v.ƖYV ԘD&MZԗ#K4}k ,}v`%S0$9Wva{:.jrlMA5T?12`[Ȉ˶6 0Pɝwʟr[mm `x7%'am  I(QST{q5Т7!(<53k%K|ۦY!y۰iTly00T0X .[ł:I̫WNSj`z-V#,%hfڗ3CVS *DB;~kPUhRHYBBzj9+*dzUՀc!-LXofDcL@)Ѷ8Ruu:[E7fO3 +LC4R1>IqL3g> cd)Ja5"9o'/?wbwk2.w ։ց,@@X5|Xdg^1˭]TV9FS'`Z5SrX 72}VslX)@d*byyS@ GC]M/E+!@}pR05d6K/5mv starpu-1.1.5/doc/doxygen/chapters/distrib_data.pdf0000644000373600000000000010210112571536552017133 00000000000000%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.1.5/doc/doxygen/chapters/starpu_non_linear_memset_regression_based.png0000644000373600000000000002055112571536554025221 00000000000000PNG  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.1.5/doc/doxygen/chapters/tasks_size_overhead.png0000644000373600000000000006613112571536554020567 00000000000000PNG  IHDRb pHYs  ~tIME )H IDATx{x[WU[iBvڦHr&ʱݦ"ama IX043Јpf`KXSne ÔV2}a}w{"J)RaSY_yۻ:D봗̃Pv~*?ìf>}s jPB!g˱crc͚56m!Ls' aϮD*-~B!EJH)0]/}U_i}B\BR*q2H8[,Re!xB!UÀx`p%d75-b2L&P2BY:2>L #ӡ-QuObRX,@{R !CƉd+Nv޻#iV"BH%&,|" Haln8eݶn!Bumw}Gm_>~uݑ-/pĉ794֊iD!c !;;;xl<|x7Wrt69s3A!0=r7,R?~|A4X,x<O]AB!-s={N8+6ovo9p*0I* ~?H0&R0D uشiUW]\[kwRX7.KRXzNa4h4 u]w"BrAqF:z1/]< q0RIhC&iUB)XupClgqm]{r~~Y&^۽M Z@4L&#*M!PO![$:nxѴ{k:N{ DF~$i91O!-eCA s_?_bLbuC$x<>99kYv-\U^xuNB:ʑ\RyDwݼyGU&[3@gbG2`KA s'ͬPo^F.t᧮;;gdfɷ֬r#q6 000PH$244Ts8 !iF\@JiF٧J`躞`YV"D"AJ!u0QEѨC,KաP  9ah4H${ t갸b9 DŒ%P>(BH'þSRJ)L !֬???_Yu1#e@BH!!DVPq=+D fYk(V?2y!^ u )!n|(E\0a6/L|z (BHaŊWyLSrot0!j℅ItS RJH]&~GVƷBY:x< lC!LV0::g۷o/l1y`؃fx<m) @5^fM_5B:LMMtJa7HizBhuOO pXE'wU4B!UW7^uU23buWKђ qM9 H$ qJ BȊա N=KEWXLU&HX%095T'ע Ӏa0 p !ZR:(P6U!#^RQrYMizi+躮^ 9BB@-%u("b.xy(@h~GQMӔ4T*%j_;!h\u0 EUJWf pfEeԴ\S aNJ44k݊B)3n˅ӕC%.㞿^MZѨJu2~mq _.=zzBu(D龑.~Z:TZ!eQ)Ph޽jK&Yn{K HoLBH u"gzu0G2=;+7ˢ1h@M~^S %eBAHϺSSSS!ȏӸLݧ5cdA\"Hx 100ЮJtW},˲,RIA!R.a! Aa1eK#o4ξw|` K3ԗlHĽ%Z DR`0dTʚ&QgMA!uII wtJϞ<[Η,H@DX,6==]:܍3b1)u}hhv8KPA:!3'i1EuX(20NJ'O}kP=jbl:4mrr!(bAhu=+&0S}f4k{u_?ҲT*544ijZ5!}hv*)RY+vϊJt@ 5{oURPhًps iMFB!튐"WT dv|5 !T [d>oӽze\S_Xv^[-5!t*1eAuPlW*xbY߯N*>ŚݹOmB%V>EW {ix Q@ v 7!L?pP+ȗ,82vwwW5@ {Q{:y/Q]i=ou ܵkע7AUC*6"eAB!AJΦ|]73Yb?\sSO}3 Cy۶WP GC 2ɴM!JI)-J$L&OͨZL& P(TgbN-,\!O$kWq̝Mgk7损_۷ #xh7{h"P5DO<bnYV@,]U1p8\n ~hPI4{+_9{~ GÇ/d IJɆRPc{֡ePi~?HFeo[c!@iiui4L"i8ds7FmwY^ !_ц!4-L5mQ!hVWOWrY`Ԗ O>?p;|羨+ ~#(FUTT*ԧsBH{H;nٳsuݶWY}l<+/[Zk Dkd`P?LH1;qaI0eFG7nSO=<31 _OgqGUo:( C,W̥pX%TVabbɷO> >wM^sB::LMOgAl<y1~jxhA@B)eiX]$ ?!}AJi&!Z^!b5bü| ƃp)EكaJY]~*uTk; !a׮]p: X{۾>\hf33jR N 4MK$N҃eYeZۃl(l~A^U5f>һ%.(AH$TJhTu% CCCpGdԪ%Q[sA 4:I9RJi 1 չY눅 D,s˄S: iY& Wl!!M}"-Ab$ >h.vN̗,gaި^"%?9B:xM:9::ꪫ\vw* _к-j1bR !4Zvϊ$PpȑM6娃ro|jy-/YSB :ض*%iӦJjbdz+JB!-ҸL Ҩ3%)BZAS>8u QB!}>_MÍHt <(u$D"K~ggGk( ? Y[L#˶GGG1: _pP U.Ԥ@4lStRJdTIWI>MDVRBH!)SG8m3saƌdr.}nEpgQwaL&sرGST 4mzzVBȊۦTQ jWi\הu]մTu,Ǎ6` *upQ龑i5|BM D3aYV&IRDDZ$zC* < UC291rBxBM DFH$244Tpx<^V-9aA:*W?F4&PKR !w,4MM;$p8+<_KbLi-O/>BS龑q9/*DYRTOOO(ڻw u}ll,G,A_*#L$T2JH^19]K{_@ldAӬ&{S}LlUt]\x_RKe B!%TJR&- `,s~X%!:D:HPrY$}x@:gәgh~TR:,HDUp BAiyuԄ0ԥ آa D4 zx(BV RJllYIdKCQ HiR u.pAuA,roL6Q !C ,p-X9gc#@?\u +hT moM!:bzPͧ*$Q|@˲T[L&)Rku@+^1a]:H) è5s K@DQ˲UUB!Se!oyMD^~?9F:Z^CC, Wha*І!E)(ZJՍ{韚S\4oH)tNIJBY Bg|uPxrz_ʑ\6gܐC EיĎP(lR g7%Kرc*b۶2=mܿ&=".„0ag~p]n,!a (++mضm直ňj{|rT2/F !T)owsJ˽߿d|ӷmD,hEN~7hLBӴD" e;_.%eD<W}*g}Vq#Xl H Hw?xӮڞd6=|uTwK237ρ ===BL&|!P(#tVdD"7Y٧/Og iuGDwߞ5u%Ǟuvx#n255CͧɎl-hva4Mg4u`@ @4{7~ՇS}$0Rqƒ >1.laﴅ8~߹p z-~?buXC}i}j} 0¹Yo"U94e%H$6!:Wo}h5O??-[# ƻ 5hi.h~<.DrgffqTI9DX,V7BR>`VR^sD$}b$ [o4;;{Igx'?sGmS[9믿As }zCNRdok1bd-BijicccB*TH qi@ߺuoڴqƓ'Os bbәe=bN 9,h1b<f@HGYIBuo߾%{مK{+x<}}}oi|^s];USP !\ueot/7/.I8pΗ?/k4aѹ 23BKW8]K_Ga,Umn͚SO?]9 9b !:`???_ۙ 24BCWcEu(U#JI)U L&DCL&' Lՠtd2hTTJBu0?~F:k|P5CUPge+DU4MuUeD"1005M4Y.(B ,뺞J,066VJϿg&QAs M?<ܕW/ebE|wvd xCwTpth %q6jW~HilT* hT D",KNR===x 5EfA/:l_: [PftHWH!%ziTT]UiܮjQUK}H/7!uS $bD UAJ))عsgWb DS!hTMpT9BP : zO|lz|֍7nϑjpML  E| FRt0ʤH D ǝVI0ϹiilIB~$,Whysȯ&qwwO\F+Up)ّzI$p"R}jm+G TpE9?G:KG0ff 4MBǼCd0~ؘJbX(ڻwD֭[Ŝ-%oDgmYABp2}|nTUb@d9 OݮP Zx< n{@6iwITu.ԂBjǷn#xeP2/. ΝC۪gd)mkȮH$Ni)˲r$D_rC:~ӊWf:iiǐe6uC DkH$TJ%hTP(dYV8 c4VaH)@0d2E J,8%+3UC9uXlEThcCQvc`ж҇رcHIu4Z>SӶa"oHseB>1Sq ۆm[ %86 IDAT ʽ TňR֝x`$!U:Ƿn=kWWr$K,\g|Ht{ZkA~I%\Rd5Xs!UP_맶o++3+Xܡ6]F]4N6 BȲ{9Ц7,(XDr;hbSN*CKS !)8鵇w՛(VvZdbGaʦl^i BGFdzUQ*V%s`gq4EA!W޵%s$W,lȡ 9F^oI(p;m^f\Yȡ4 :liEN!XL& ;DQRD/F===֭x>FzP&uGo?xŷͷ޺83f:K x<΄Js$`d$K5ߡ֨d>i#d ꟩i4-J :96eYbpةl] m:NBaꠢ;޽c$[턱՛0\Wޒ<jzNʱ%,C؞U-OBRMOĸorŇ}ЬqI"XdN-H'Pg@DQw5ֲ1D '@eYHMͻkzd zF6dmMW]I=\*-ˬNȡ}0',HҼS%-Afh4JAŲT*&,RT&q:esSP*WU/tdVgPNW'+{Z2!hC x~?n]ו iQ'wj.@롡@Ζgpp뮻;<5ĝoܸqA*XY"M@i -,K"~-Bռ[000݆ǝRa5Riʵ  wq .GHuG,Ey~~?c[fF9yO$|KO2U9T]h dy4ouuoi"rawܹl)8D׈ #"LƝ=CR1Xitww$HoAJ@uwغs7gn/NtX -% 1DiYVN_}f*iKuf,?ʩoc=ęۦ67n,]lB=ԗwP(Hb1U)arru+JB$0=ӏ|mS7b>~?~A:x<i[uR4ߤ\RAG%QV0䨃{Ç?1ϝ>{#@>f'Ib= 9+hd{Yr,#GruX@BZU3}@J-| bv&78}ybk҄C2Ѩg)Dy4Jb10֭[xѨP&b======a>:8=-G6n܈<1'= xܷXݰ,mf9UQ y<beY,+~]5MSTm:Ad>ń4:L Ƭ:/}^+/|B48ǷnJT9EMӂCS j!]קHR@ C F̠@&W^/7߿EYC+Jz+0miKUF۱inbպ D4b-`X)F(X9U(EPmN("B 'ͧ'?o7߿Ԃ/A-cxhd'[f5ʧyPx!D(L&J)ѨDT* WQ5Y8y#2={ȲݷbbbC'ȱّdAuF˞ĹsrlifZ}8*]eY9Mj}9b2 i^upNQEX xخU`0 :E*0~ؘҕjB) q~!HrqZ:C B 1BB3uavw [U`0ݶwdN_֨UR{X | C&Q*@ɢRHvhLL.lXa8t+uX,d,YlB. Bh|MI0~]ׇ. ҕ A \mD}1;a1xNMs!(#A}uT҅wgm,2$W UY5 ב4t@D`iIKeYC$yՉD"K)~(r Ie2xoĞ={s9_=~luxw|/9@V YoXr!!WGx;l<שJ)'#ΈD"9 "2HLOOw}SSS7nL*To m~8x;Gr9 MّՔ:Qr D@g4کbn2L8D"u zǜo ݻWmbXVaTb o v|cVT=z+~7nd -7{^ ǜD$q('{RZH$"FפsTk68h%;|>{R0t5M ̄Bcǎ9GlYZ'fg?ss}дm[ϔ79Ӷmömu{Wտ—FkE@d:d#f(+ԊUgvބgϞ />]ţ7uQ\&pd 9;5rVV" :FV7#`Pu 'Nv|{mѧvvCI͇>;a_+KX dVPT =Apz4 IޒT*@3_יVgWޟ*`ԛ]P[.)e(P%]B8\QVFX4@ FSrߟJu iΝ]T<6co_Nua)$`ٵd%m1H"RD"բu iُNr'nz׌KBV|I}bP>HBU]׫XY]gsssN'@7t&Mؽ{w_i3WlxE?+f%XM9Uhd~ŵ9 zNuEW Z}g_dP꠸d9Ǥ&]*X@HewUCer t]W8-TʲtSٓEMx]3Ȇ Bj,e*rG9(;G D8ηDwtqh4 R2C*2&&ݍ^LL ^+-/Q ?ݯjG~i ,i!]3\m/ nZb@Ȋ(x%!UJ*!ɨQ~ ArC1iXVuؕrJi@V-`X!ȟ?hO *Iu c" Rͪb4mΎ:f!č00iP%'ie(,:v{*n0:O=CsOO͖,3ي!gJ I#iex b1xUkKsFў300aݺuatHeQ )7\z_/_w{M @Bvh&Aw4arb@ U F'-JO$,+RdDi8뺪QmYVNH ,Kdܿz/T%snѱi{ F *l=%UHjlllll4M!j?=D-$BR)ROOO۶===4z\pUR* s|}wJUJB]/ l=(3[,Xܨ|=dNYF *\4MMTH@D"ηJ*k \}뺦i9J}vlg,Lž+VQ!-2bYw(Ars4r&uw1wC&QTT*djZWcxJЇ> f H yǷſwחv|̕P h^)V&45f2>cdgFU䠒Rr)iZ<u]=40 FKӴjQ|81X:u}u#w^fɕNi!s( t@mG& HqPߺa(P~F;qGMpXVBʕ Z5wX"zi G?rȝ̾7G( ޽{slFرc94+BLU Ywʟpo}9>ysg?ztKK8 IDAT}Blբy萟DB:,ⴲwjF*rL&u2GdFUPC0TjBEq腳ڳv/G@x8Ie Wux01+=M6M!tELw!CDiHWaB8Q'O  A˲ ~QD"D=x<>44f.T%(!sܜ ^GD"$=XHdS2w 볟岃^^a +О4pnR@ L #& g޽{@ BR)){J,S[[d2{:J144{zzLFJiZU̝ٔ,ANJRW/M2׃jXiYY7-s@)A_@ct*#A];":Dc P]PkrrRUR֕//-DeB},\6C˿Ͻ޼)P8IhXEQ}켄i 9(S: *CJzzzjr/ iU`Q4yE.ևk 2[&R">1Lah6== ?MjZԎ\{Y:<]݇cquH, .Y.ЪA}$T2N)ұQɳ'Np9twD Bg:M{.1 =FRi#,,HeR}(B6 t =BQ 2L<O$2`0 8H3?=@2 !Ԋ-ˊFTJUcL$pQe.ѨQ%._ggn)~#ܖk^k=^!ػXF)(*r!܄$+Bv0Һ F7Rn!#OOObU&۸Sy䇮wd˖-sss^w||u+ s_5ls/0MLDJ )ar>@oQe'.tAo7U8  Oy3_c{f94u1R!:클@8XdR7ǥCCCm"PͅnHRxܲ,U3 9T*2x́W-?[ Z3sF8uXQ(x_^.ΟdG9PEB:kTi-뺮&,ܫRS N^:Q˿Yoxmǡ7ܨvę۾^Q1КQ;{ s^uQ$9Wd /JѮQE;/XD"֪444dF PVUhR4TMx\u畒[^zçN1௿|=ui{h:Cg:u,6qP A}hiRCB,5âUCbrr2ؘ*έiZ$QnszY_lKO=7\#'Nc7f? !1\Ֆіߏdߏ+,*$HТ%JJ!e cvZt7'ͨS?=!LF/9(N7,v415\sFG[ 3 |><$ygs]N0lW<\kyScY.,0?9ckh":bP:JR.,Y|ѾnKpl53 o@o/W41is :wMXA,X6 O΂M=!(ɥ=fa[Ta!u8 xXBE(kW2E m?!DuL3XVV) Ϗ!:P) ()* $TI:4:\ܷoCS͸Fx:8%H.ӔDK:A_o_֤U ̇E>"T٬2a~G"jz{_[8٥CR8p/յ@]¨w ECP Hco?zFn?u]V]ѱEJ58PJ~6@!*X !(B>οո r^=4C aegxs%>#+0Hҟ@n(gF+/Rzb]L)I%lI3bR H]g[ߐe KBJx7SJ7o )'&$J`v?'qE b]3=;W/,(lHx)蝅zM+'d8T1ůM *bI(Y7Ipn-/ɳa:g+ L ٍ^1H;2?x7>=!Hk+]b`k^gwF/R+3CQb3FĈ>s1 `brV&f dtź V4yE.__}K{ (_[*麒BMRE{@vbڻw:_=5]t/xEd|{{= x}W_u+!VC __{.k.m~ Oyp;>|lV0ŁBH eYp@0b!795| ]nLU0@!P Yƽ{; SBHÄʙ|*!P :;nͿak/3; BwL'~d~;a>x֜yY_=a! D{sɞO xYKŠލşZ.׻x\ !CDR`UqFk=0p^V[׋> =Y{su^/-!,Wtvci C { DKq+xC'nRtbPFV|}Ha0 C2 njJ!a=t&baWxo=>q ^xحq G`x !)MsdS@ vN?$dO{S"V(u{ŷ='OG?Eu9~% cAl FΉ7(6p 2`J·9z5=t"!h Nof70AMXB![>R3ffwAKaipA{`tPª;|C`u_>+Q\~o^wlꇹP$GNLs!LgjsP Ct|Y tɐ!PvfI# 69S ^,GRyPQ% Lx݁u2=;Ӏ1!.G(h9Pv?i=OhHȿ|_nֆa WUSS[zԏC"gy] ܎IU#߱'tJ.7m#%J$l $pO*5ubt Jָ.Ww 3)|#يFz9D';3PZ3lVUxkΑC4=+|*t0]M\-xE'4B Etm/NaTWNXOtp7ZnLPS@?6n78R&%V'F$ oiu#ڐm8~`@9+Oֵ͏"`im6,qLw%t? F"xH>>Çr_'䉬G5C3΂_b(2?}[ʿޤ7]D䔈N5f6 N?Ε&3:l4@xWjCR~k?bvߖo_K=rϰ5 *=!6jҰbWkL6OߵyWGyLu}Kt=C@;=7Cl)U mg%S{ #ߒ[fZӃ-1,:|8~Fhz+چ8l{/Rz/SEK'3#Ts0? 1-}o/tۘΡGW^-;CїlA>w:Mzt6Frvr !:gfFAVN2K5&ImZ_KnHHzӒB^|#g\wID֟Vb$-5Ҷ"O{|ybpW"W}{tgrWyPoCQ?':Ͽ+}L|\YfɧmfT>g:ꇖNqAIK"WH Jt3?ƭ5FB NۏIrz+7/e+++CGo^MO`{y?Dg{C>7ȨwUm='kkrLO_y]ޭ~ffFq[O~?ROE׿;N]]ێ|SS&뉁1{bd@}HpL<&krȆ8뭈"~x)ZR+_^zf+ƭ"c5 $IeYr9Ðo_wD?{s՟yϊ""N1M9bCU~~b3UCa(2D 8dfESp.:,G'b$SG&~p=}wM,.d=[ mKs(I4I E(+|y|+K3cg]/Ȋ25:q_6$m $rdZ^'ß9xE9q\]97.l#@$o+I9OYumlfZ$ @h O}#Ԡ];8ŚIc^剧{''թtNw#I@ "*@&!2paȓmoQZ|zSxą޲BOHE# 6JdIu IDATsشu=5@pwlyS](;n' 5U6It5:QKK""εGZ,IoAM'DGځ|a;˺xQ.^\ueEdrRr3OO%Heey 2e .=2}[?uJN|OlkL&e#Gzp{AjYw$@$1^%6T!,-I6BgO*CE~ފk!'I ߈"&Q? @m-1kkmkmFI "`[ځpXZ=$"ط:161zI$@DF]$whiY{:/g"en0vbTZ3_eԅj2W=EW._e/+ڛ)t|=Sh@Y-hCRI8ݾkk6M?>3aj-DdwF  0"Ibn5n0 =I{st%3m߾k oxQNZo30+_U2!UMՔ!"#@3Pբ: @@7y@9P^֘C 8<00 rIJ8]J>_ dqzBDi.,,FQ. h6|7(n(mj]mX%"I@۶4`h TYbfW曓OMMihS@9Pv13@ Xb` ܅8N[ m; lЃHH 1j $I277gYf3"uLDoQA.,˵Z8Joy @ @i6AxwA0|K4R4;;;;;yB`0 04\wuWҘ=x𠆻FF7RIdR5 cnnRDQ04-Io۶eYiFQEiZ ,UqGQi۩+ѹ,t2eYsssIX8B>oYVq M0 nߨR$mj0 0\XXPwؾhj4Fj-,,HZm… .\΅jThiu]uաSW+қ*r=B2i;b=UK?l==a욯~uGΓK˲[h(8/\T{|NO7ǢLTVk~di6jvݓ$IӴlXRj}o6 wf:,ft2jm۶mo:2al6w_ GIh[wժLjlyGKqFQԇ<5\4ZVύF<6z1&8T*:Ws,ngqah44\dǥR) C=[ՀAuLRNm٩uU}!zimǎ`uuU9o/K m{E^HV㐨}HjN2JeY*FP eٶpտM`D,)ui{\=\">m:@ZM\qx֭¨^Myg?=$IEٴ(pB._jF7Qq&qGmZ JdnnNUǵB:Yͦzhh;}~o{{UP # 4Mb%0vRUY͚'x(n8EzIe^ ˲}@ ȨjY-RD;'I"ahK27]rZ-bF -zժ/dP?FQԶ3T׀zD]Q0@XAlnu"\u'MS. Umn8I$c5lBDjyOeioj͹̆Yy3EJeX$IJR\6M3M(T@ƐeYz]S?o4Bj>c5\.ahAk4D@ [x6`sS.,,a xTWXlu=¶jOض=??dZ-Jl c   "*EIENDB`starpu-1.1.5/doc/doxygen/chapters/tasks_size_overhead.eps0000644000373600000000000013604312571536554020572 00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%Creator: cairo 1.12.2 (http://cairographics.org) %%CreationDate: Wed Jul 3 10:53:11 2013 %%Pages: 1 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%BoundingBox: 0 0 360 216 %%EndComments %%BeginProlog save 50 dict begin /q { gsave } bind def /Q { grestore } bind def /cm { 6 array astore concat } bind def /w { setlinewidth } bind def /J { setlinecap } bind def /j { setlinejoin } bind def /M { setmiterlimit } bind def /d { setdash } bind def /m { moveto } bind def /l { lineto } bind def /c { curveto } bind def /h { closepath } bind def /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto 0 exch rlineto 0 rlineto closepath } bind def /S { stroke } bind def /f { fill } bind def /f* { eofill } bind def /n { newpath } bind def /W { clip } bind def /W* { eoclip } bind def /BT { } bind def /ET { } bind def /pdfmark where { pop globaldict /?pdfmark /exec load put } { globaldict begin /?pdfmark /pop load def /pdfmark /cleartomark load def end } ifelse /BDC { mark 3 1 roll /BDC pdfmark } bind def /EMC { mark /EMC pdfmark } bind def /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def /Tj { show currentpoint cairo_store_point } bind def /TJ { { dup type /stringtype eq { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse } forall currentpoint cairo_store_point } bind def /cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def /Tf { pop /cairo_font exch def /cairo_font_matrix where { pop cairo_selectfont } if } bind def /Td { matrix translate cairo_font_matrix matrix concatmatrix dup /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def /g { setgray } bind def /rg { setrgbcolor } bind def /d1 { setcachedevice } bind def %%EndProlog 11 dict begin /FontType 42 def /FontName /DejaVuSans def /PaintType 0 def /FontMatrix [ 1 0 0 1 0 0 ] def /FontBBox [ 0 0 0 0 ] def /Encoding 256 array def 0 1 255 { Encoding exch /.notdef put } for Encoding 32 /space put Encoding 48 /zero put Encoding 49 /one put Encoding 50 /two put Encoding 51 /three put Encoding 52 /four put Encoding 53 /five put Encoding 54 /six put Encoding 55 /seven put Encoding 56 /eight put Encoding 57 /nine put Encoding 97 /a put Encoding 98 /b put Encoding 99 /c put Encoding 100 /d put Encoding 101 /e put Encoding 102 /f put Encoding 105 /i put Encoding 108 /l put Encoding 109 /m put Encoding 110 /n put Encoding 111 /o put Encoding 112 /p put Encoding 114 /r put Encoding 115 /s put Encoding 117 /u put /CharStrings 27 dict dup begin /.notdef 0 def /space 1 def /zero 2 def /one 3 def /two 4 def /three 5 def /four 6 def /five 7 def /six 8 def /seven 9 def /eight 10 def /s 11 def /p 12 def /e 13 def /d 14 def /u 15 def /n 16 def /m 17 def /b 18 def /r 19 def /o 20 def /f 21 def /c 22 def /nine 23 def /l 24 def /i 25 def /a 26 def end readonly def /sfnts [ <0001000000090080000300106376742000691d3900001200000001fe6670676d7134766a0000 1400000000ab676c796619b625bb0000009c0000116468656164fd034687000014ac00000036 686865610cb8066c000014e400000024686d74787d3f0ef4000015080000006c6c6f63610000 eee000001574000000706d61787004880671000015e400000020707265703b07f10000001604 0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec 310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f272062900020087 ffe3048f05f0000b00170023401306a01200a00c91128c18091c0f1e031c151b1810fcecf4ec 310010e4f4ec10ee30012202111012333212111002273200111000232200111000028b9c9d9d 9c9d9d9d9dfb0109fef7fbfbfef701090550fecdfeccfecdfecd0133013301340133a0fe73fe 86fe87fe73018d0179017a018d00000100e10000045a05d5000a004040154203a00402a00581 0700a009081f061c03001f010b10d44bb00f5458b9000100403859ecc4fcec31002fec32f4ec d4ec304b5358592201b40f030f04025d3721110535253311211521fe014afe990165ca014afc a4aa047348b848fad5aa0000000100960000044a05f0001c009a4027191a1b03181c11050400 110505044210a111940da014910400a00200100a02010a1c171003061d10fc4bb015544bb016 545b4bb014545b58b90003ffc03859c4d4ecc0c011123931002fec32f4ecf4ec304b53580710 05ed0705ed11173959220140325504560556077a047a05761b87190704000419041a041b051c 74007606751a731b741c82008619821a821b821ca800a81b115d005d25211521353600373e01 35342623220607353e01333204151406070600018902c1fc4c73018d33614da7865fd3787ad4 58e80114455b19fef4aaaaaa7701913a6d974977964243cc3132e8c25ca5701dfeeb00000001 009cffe3047305f000280070402e0015130a86091f862013a0150da00993061ca02093239106 8c15a329161c13000314191c2620101c03141f09062910fc4bb016544bb014545b58b90009ff c03859c4c4d4ecf4ec11173939310010ece4f4e4ec10e6ee10ee10ee10ee1112393001400964 1e611f6120642104005d011e0115140421222627351e013332363534262b0135333236353426 23220607353e01333204151406033f91a3fed0fee85ec76a54c86dbec7b9a5aeb6959ea39853 be7273c959e6010c8e03251fc490ddf22525c33132968f8495a67770737b2426b42020d1b27c ab0000020064000004a405d50002000d0081401d010d030d0003030d4200030b07a005010381 09010c0a001c0608040c0e10dc4bb00b544bb00d545b58b9000cffc03859d43cc4ec32113931 002fe4d43cec321239304b5358071004c9071005c9592201402a0b002a004800590069007700 8a000716012b0026012b0336014e014f0c4f0d5601660175017a0385010d5d005d0901210333 1133152311231121350306fe0201fe35fed5d5c9fd5e0525fce303cdfc33a8fea00160c30000 0001009effe3046405d5001d005e4023041a071186101d1aa00714a010890d02a000810d8c07 a41e171c010a031c000a10061e10fc014bb016544bb014545b58b90010ffc038594bb00f5458 b9001000403859c4d4ec10c4ee310010e4e4f4ec10e6ee10fec410ee1112393013211521113e 0133320015140021222627351e0133323635342623220607dd0319fda02c582cfa0124fed4fe ef5ec3685ac06badcacaad51a15405d5aafe920f0ffeeeeaf1fef52020cb3130b69c9cb62426 00000002008fffe3049605f0000b0024005840241306000d860c00a01606a01c16a510a00c89 22911c8c250c22091c191e131c03211f1b2510fcececf4ece4310010e4f4e4fce410ee10ee10 ee111239304014cb00cb01cd02cd03cd04cb05cb0607a41eb21e025d015d0122061514163332 3635342601152e01232202033e0133320015140023200011100021321602a4889f9f88889f9f 01094c9b4cc8d30f3bb26be10105fef0e2fefdfeee0150011b4c9b033bbaa2a1bbbba1a2ba02 79b82426fef2feef575dfeefebe6feea018d0179016201a51e000000000100a80000046805d5 000600634018051102030203110405044205a0008103050301040100060710fcccc411393931 002ff4ec304b5358071005ed071005ed5922014bb0165458bd00070040000100070007ffc038 11373859401258020106031a05390548056703b000b006075d005d13211501230121a803c0fd e2d301fefd3305d556fa81052b0000000003008bffe3048b05f0000b0023002f00434025180c 00a02706a01e2da012911e8c27a330180c242a1c15241c0f091c151b1e031c0f211b3010fcc4 ecf4c4ec10ee10ee113939310010ece4f4ec10ee10ee39393001220615141633323635342625 2e01353424333216151406071e01151404232224353436131416333236353426232206028b90 a5a59090a6a5fea5829100ffdedffe918192a3fef7f7f7fef7a448918382939382839102c59a 87879a9b86879a5620b280b3d0d0b380b22022c68fd9e8e8d98fc60161748282747482820000 0001006fffe303c7047b002700e7403c0d0c020e0b531f1e080902070a531f1f1e420a0b1e1f 041500860189041486158918b91104b925b8118c281e0a0b1f1b0700521b080e070814224528 10fcc4ecd4ece4111239393939310010e4f4ec10fef5ee10f5ee121739304b535807100eed11 1739070eed1117395922b2002701015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b093b0a3b0b 3b0c0b200020012402280a280b2a132f142f152a16281e281f292029212427860a860b860c86 0d12000000010202060a060b030c030d030e030f03100319031a031b031c041d09272f293f29 5f297f2980299029a029f029185d005d7101152e012322061514161f011e0115140623222627 351e013332363534262f012e01353436333216038b4ea85a898962943fc4a5f7d85ac36c66c6 61828c65ab40ab98e0ce66b4043fae282854544049210e2a99899cb62323be353559514b5025 0f2495829eac1e000000000200bafe5604a4047b0010001c003e401b1ab9000e14b90508b80e 8c01bd03bc1d11120b471704000802461d10fcec3232f4ec310010e4e4e4f4c4ec10c4ee3040 09601e801ea01ee01e04015d2511231133153e01333200111002232226013426232206151416 3332360173b9b93ab17bcc00ffffcc7bb10238a79292a7a79292a7a8fdae060aaa6461febcfe f8fef8febc6101ebcbe7e7cbcbe7e700000000020071ffe3047f047b0014001b007040240015 01098608880515a90105b90c01bb18b912b80c8c1c1b1502081508004b02120f451c10fcecf4 ecc4111239310010e4f4ece410ee10ee10f4ee1112393040293f1d701da01dd01df01d053f00 3f013f023f153f1b052c072f082f092c0a6f006f016f026f156f1b095d71015d0115211e0133 323637150e01232000111000333200072e0123220607047ffcb20ccdb76ac76263d06bfef4fe c70129fce20107b802a5889ab90e025e5abec73434ae2a2c0138010a01130143feddc497b4ae 9e0000020071ffe3045a06140010001c003840191ab9000e14b905088c0eb801970317040008 024711120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30b6601e801ea01e03015d0111 331123350e0123220211100033321601141633323635342623220603a2b8b83ab17ccbff00ff cb7cb1fdc7a79292a8a89292a703b6025ef9eca86461014401080108014461fe15cbe7e7cbcb e7e7000200aeffe30458047b00130014003b401c030900030e0106870e118c0a01bc14b80c0d 0908140b4e020800461510fcecf439ec3231002fe4e432f4c4ec1112173930b46f15c0150201 5d1311331114163332363511331123350e0123222601aeb87c7c95adb8b843b175c1c801cf01 ba02a6fd619f9fbea4027bfba0ac6663f003a800000100ba00000464047b0013003640190309 00030e0106870e11b80cbc0a010208004e0d09080b461410fcec32f4ec31002f3ce4f4c4ec11 12173930b46015cf1502015d0111231134262322061511231133153e013332160464b87c7c95 acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef000100ba0000071d047b0022 005a4026061209180f00061d07150c871d2003b81bbc19100700110f0808065011080f501c18 081a462310fcec32fcfcfcec11123931002f3c3ce4f43cc4ec32111217393040133024502470 249024a024a024bf24df24ff2409015d013e0133321615112311342623220615112311342623 22061511231133153e01333216042945c082afbeb972758fa6b972778da6b9b93fb0797aab03 897c76f5e2fd5c029ea19cbea4fd87029ea29bbfa3fd870460ae67627c000000000200baffe3 04a40614000b001c0038401903b90c0f09b918158c0fb81b971900121247180c06081a461d10 fcec3232f4ec31002fece4f4c4ec10c6ee30b6601e801ea01e03015d01342623220615141633 3236013e01333200111002232226271523113303e5a79292a7a79292a7fd8e3ab17bcc00ffff cc7bb13ab9b9022fcbe7e7cbcbe7e702526461febcfef8fef8febc6164a80614000100ba0000 034a047b001100304014060b0700110b03870eb809bc070a06080008461210fcc4ec3231002f e4f4ecc4d4cc11123930b450139f1302015d012e012322061511231133153e0133321617034a 1f492c9ca7b9b93aba85132e1c03b41211cbbefdb20460ae66630505000000020071ffe30475 047b000b0017004a401306b91200b90cb8128c1809120f51031215451810fcecf4ec310010e4 f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b0c7f0d7f0e7f0f7f107f117b12a0 19f01911015d012206151416333236353426273200111000232200111000027394acab9593ac ac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99cfec8feecfeedfec7013901130114 013800000001002f000002f8061400130059401c0510010c08a906018700970e06bc0a021307 00070905080d0f0b4c1410fc4bb00a5458b9000b004038594bb00e5458b9000bffc038593cc4 fc3cc4c412393931002fe432fcec10ee321239393001b640155015a015035d01152322061d01 2115211123112335333534363302f8b0634d012ffed1b9b0b0aebd0614995068638ffc2f03d1 8f4ebbab00010071ffe303e7047b0019003f401b00860188040e860d880ab91104b917b8118c 1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30400b0f1b101b801b901b a01b05015d01152e0123220615141633323637150e0123220011100021321603e74e9d50b3c6 c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2baa2424013e010e011201 3a23000000020081ffe3048705f00018002400584023071f1901860019a00aa504a00089161f a01091168c25071c1c21131e0022221c0d1b2510fcece4f4ecec310010e4f4ec10e6fef5ee10 ee111239304016c419c21ac01bc01cc01dc21ec41f07aa12bc12e912035d015d37351e013332 12130e01232200353400332000111000212226013236353426232206151416e14c9c4bc8d30f 3ab26ce0fefb0110e201030111feb1fee54c9c013e889f9f88889f9f1fb82426010d0112565c 010febe60116fe73fe86fe9ffe5b1e0297baa2a1bbbba1a2ba00000100c10000017906140003 0022b7009702010800460410fcec31002fec30400d10054005500560057005f00506015d1333 1123c1b8b80614f9ec00000200c100000179061400030007002b400e06be04b100bc02050108 0400460810fc3cec3231002fe4fcec30400b1009400950096009700905015d13331123113315 23c1b8b8b8b80460fba00614e9000002007bffe3042d047b000a002500bc4027191f0b17090e 00a91706b90e1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcecccd4 ec323211393931002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f302030 2130223f27401d401e401f402040214022501d501e501f50205021502250277027851d871e87 1f8720872185229027a027f0271e301e301f30203021401e401f40204021501e501f50205021 601e601f60206021701e701f70207021801e801f80208021185d015d0122061514163332363d 01371123350e01232226353436332135342623220607353e0133321602bedfac816f99b9b8b8 3fbc88accbfdfb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2bdc0 127f8b2e2eaa2727fc00013500b800cb00cb00c100aa009c01a600b800660000007100cb00a0 02b20085007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa0400014a0033 00cb000000d9050200f4015400b4009c01390114013907060400044e04b4045204b804e704cd 0037047304cd04600473013303a2055605a60556053903c5021200c9001f00b801df007300ba 03e9033303bc0444040e00df03cd03aa00e503aa0404000000cb008f00a4007b00b80014016f 007f027b0252008f00c705cd009a009a006f00cb00cd019e01d300f000ba018300d500980304 0248009e01d500c100cb00f600830354027f00000333026600d300c700a400cd008f009a0073 040005d5010a00fe022b00a400b4009c00000062009c0000001d032d05d505d505d505f0007f 007b005400a406b80614072301d300b800cb00a601c301ec069300a000d3035c037103db0185 042304a80448008f0139011401390360008f05d5019a0614072306660179046004600460047b 009c00000277046001aa00e904600762007b00c5007f027b000000b4025205cd006600bc0066 0077061000cd013b01850389008f007b0000001d00cd074a042f009c009c0000077d006f0000 006f0335006a006f007b00ae00b2002d0396008f027b00f600830354063705f6008f009c04e1 0266008f018d02f600cd03440029006604ee00730000140000960000b707060504030201002c 2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720b000 50b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ffff50 58041b0559b0051cb0032508e12d2c4b505820b0fd454459212d2cb002254560442d2c4b5358 b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b0206368208a 108a233a8a10653a2d00000100000002547a591325325f0f3cf5001f080000000000cc445386 00000000cc445386f7d6fcae0d72095500000008000000010000000000010000076dfe1d0000 0de2f7d6fa510d7200010000000000000000000000000000001b04cd0066028b000005170087 051700e1051700960517009c051700640517009e0517008f051700a80517008b042b006f0514 00ba04ec007105140071051200ae051200ba07cb00ba051400ba034a00ba04e5007102d1002f 0466007105170081023900c1023900c104e7007b000000000000004400000044000000c80000 0138000002340000031c000003d80000049800000570000005fc000006d000000830000008d0 000009a400000a3c00000ac000000b3800000bfc00000c9400000d0400000da800000e400000 0ed800000fac00000fe8000010380000116400010000001b0354002b0068000c000200100099 000800000415021600080004b8028040fffbfe03fa1403f92503f83203f79603f60e03f5fe03 f4fe03f32503f20e03f19603f02503ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e9 3a03e84203e7fe03e63203e5e45305e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03 e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705 d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03 cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03be fe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004 b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e 03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4 fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe039e9d0c059efe039d0c039c9b19 059c64039b9a10059b19039a1003990a0398fe0397960d0597fe03960d03958a410595960394 930e05942803930e0392fa039190bb0591fe03908f5d0590bb039080048f8e25058f5d038f40 048e25038dfe038c8b2e058cfe038b2e038a8625058a410389880b05891403880b0387862505 8764038685110586250385110384fe038382110583fe0382110381fe0380fe037ffe0340ff7e 7d7d057efe037d7d037c64037b5415057b25037afe0379fe03780e03770c03760a0375fe0374 fa0373fa0372fa0371fa0370fe036ffe036efe036c21036bfe036a1142056a530369fe03687d 036711420566fe0365fe0364fe0363fe0362fe03613a0360fa035e0c035dfe035bfe035afe03 59580a0559fa03580a035716190557320356fe03555415055542035415035301100553180352 1403514a130551fe03500b034ffe034e4d10054efe034d10034cfe034b4a13054bfe034a4910 054a1303491d0d05491003480d0347fe0346960345960344fe0343022d0543fa0342bb03414b 0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe 033837140538fa033736100537140336350b05361003350b03341e03330d0332310b0532fe03 310b03302f0b05300d032f0b032e2d09052e10032d09032c32032b2a25052b64032a2912052a 25032912032827250528410327250326250b05260f03250b0324fe0323fe03220f0321011005 2112032064031ffa031e1d0d051e64031d0d031c1142051cfe031bfa031a42031911420519fe 031864031716190517fe031601100516190315fe0314fe0313fe031211420512fe0311022d05 114203107d030f64030efe030d0c16050dfe030c0110050c16030bfe030a100309fe0308022d 0508fe030714030664030401100504fe03401503022d0503fe0302011005022d0301100300fe 0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d00> ] def /f-0-0 currentdict end definefont pop %%Page: 1 1 %%BeginPageSetup %%PageBoundingBox: 0 0 360 216 %%EndPageSetup q 4 3 345 206 rectclip q 0 g 0.25 w 2 J 0 j [] 0.0 d 3.8 M q 1 0 0 -1 0 216 cm 32.75 186.75 m 36.449 186.75 l S Q q 1 0 0 -1 0 216 cm 345.148 186.75 m 341.449 186.75 l S Q BT 8 0 0 8 19.992188 26.5 Tm /f-0-0 1 Tf ( 0)Tj ET q 1 0 0 -1 0 216 cm 32.75 164.75 m 36.449 164.75 l S Q q 1 0 0 -1 0 216 cm 345.148 164.75 m 341.449 164.75 l S Q BT 8 0 0 8 19.992188 48.5 Tm /f-0-0 1 Tf ( 1)Tj ET q 1 0 0 -1 0 216 cm 32.75 142.75 m 36.449 142.75 l S Q q 1 0 0 -1 0 216 cm 345.148 142.75 m 341.449 142.75 l S Q BT 8 0 0 8 19.992188 70.5 Tm /f-0-0 1 Tf ( 2)Tj ET q 1 0 0 -1 0 216 cm 32.75 120.75 m 36.449 120.75 l S Q q 1 0 0 -1 0 216 cm 345.148 120.75 m 341.449 120.75 l S Q BT 8 0 0 8 19.992188 92.5 Tm /f-0-0 1 Tf ( 3)Tj ET q 1 0 0 -1 0 216 cm 32.75 98.75 m 36.449 98.75 l S Q q 1 0 0 -1 0 216 cm 345.148 98.75 m 341.449 98.75 l S Q BT 8 0 0 8 19.992188 114.5 Tm /f-0-0 1 Tf ( 4)Tj ET q 1 0 0 -1 0 216 cm 32.75 76.75 m 36.449 76.75 l S Q q 1 0 0 -1 0 216 cm 345.148 76.75 m 341.449 76.75 l S Q BT 8 0 0 8 19.992188 136.5 Tm /f-0-0 1 Tf ( 5)Tj ET q 1 0 0 -1 0 216 cm 32.75 54.75 m 36.449 54.75 l S Q q 1 0 0 -1 0 216 cm 345.148 54.75 m 341.449 54.75 l S Q BT 8 0 0 8 19.992188 158.5 Tm /f-0-0 1 Tf ( 6)Tj ET q 1 0 0 -1 0 216 cm 32.75 32.75 m 36.449 32.75 l S Q q 1 0 0 -1 0 216 cm 345.148 32.75 m 341.449 32.75 l S Q BT 8 0 0 8 19.992188 180.5 Tm /f-0-0 1 Tf ( 7)Tj ET q 1 0 0 -1 0 216 cm 32.75 10.75 m 36.449 10.75 l S Q q 1 0 0 -1 0 216 cm 345.148 10.75 m 341.449 10.75 l S Q BT 8 0 0 8 19.992188 202.5 Tm /f-0-0 1 Tf ( 8)Tj ET q 1 0 0 -1 0 216 cm 32.75 186.75 m 32.75 183.051 l S Q q 1 0 0 -1 0 216 cm 32.75 10.75 m 32.75 14.449 l S Q BT 8 0 0 8 28.910156 17.199219 Tm /f-0-0 1 Tf ( 1)Tj ET q 1 0 0 -1 0 216 cm 77.398 186.75 m 77.398 183.051 l S Q q 1 0 0 -1 0 216 cm 77.398 10.75 m 77.398 14.449 l S Q BT 8 0 0 8 73.558594 17.199219 Tm /f-0-0 1 Tf ( 2)Tj ET q 1 0 0 -1 0 216 cm 122 186.75 m 122 183.051 l S Q q 1 0 0 -1 0 216 cm 122 10.75 m 122 14.449 l S Q BT 8 0 0 8 118.160156 17.199219 Tm /f-0-0 1 Tf ( 3)Tj ET q 1 0 0 -1 0 216 cm 166.648 186.75 m 166.648 183.051 l S Q q 1 0 0 -1 0 216 cm 166.648 10.75 m 166.648 14.449 l S Q BT 8 0 0 8 162.808594 17.199219 Tm /f-0-0 1 Tf ( 4)Tj ET q 1 0 0 -1 0 216 cm 211.25 186.75 m 211.25 183.051 l S Q q 1 0 0 -1 0 216 cm 211.25 10.75 m 211.25 14.449 l S Q BT 8 0 0 8 207.410156 17.199219 Tm /f-0-0 1 Tf ( 5)Tj ET q 1 0 0 -1 0 216 cm 255.898 186.75 m 255.898 183.051 l S Q q 1 0 0 -1 0 216 cm 255.898 10.75 m 255.898 14.449 l S Q BT 8 0 0 8 252.058594 17.199219 Tm /f-0-0 1 Tf ( 6)Tj ET q 1 0 0 -1 0 216 cm 300.5 186.75 m 300.5 183.051 l S Q q 1 0 0 -1 0 216 cm 300.5 10.75 m 300.5 14.449 l S Q BT 8 0 0 8 296.660156 17.199219 Tm /f-0-0 1 Tf ( 7)Tj ET q 1 0 0 -1 0 216 cm 345.148 186.75 m 345.148 183.051 l S Q q 1 0 0 -1 0 216 cm 345.148 10.75 m 345.148 14.449 l S Q BT 8 0 0 8 341.308594 17.199219 Tm /f-0-0 1 Tf ( 8)Tj ET q 1 0 0 -1 0 216 cm 32.75 10.75 312.398 176 re S Q BT -0.00000000000000147 8 -8 -0.00000000000000147 10.449219 100.117188 Tm /f-0-0 1 Tf (speedup)Tj 8 0 0 8 156.15625 3.25 Tm [(number of cor)20(es)]TJ -11.602539 23.862305 Td (4)Tj ET 1 0 0 rg q 1 0 0 -1 0 216 cm 73.551 19.102 m 97.648 19.102 l S Q q 1 0 0 -1 0 216 cm 32.75 172.852 m 77.398 165.648 l 122 180.898 l 166.648 177.551 l 211.25 178.102 l 255.898 173.648 l 300.5 174.199 l 345.148 174.898 l S Q 33.25 43.148 m 33.25 42.484 32.25 42.484 32.25 43.148 c 32.25 43.816 33.25 43.816 33.25 43.148 c f q 1 0 0 -1 0 216 cm 29.75 172.852 m 35.75 172.852 l S Q q 1 0 0 -1 0 216 cm 32.75 169.852 m 32.75 175.852 l S Q 77.898 50.352 m 77.898 49.684 76.898 49.684 76.898 50.352 c 76.898 51.016 77.898 51.016 77.898 50.352 c f q 1 0 0 -1 0 216 cm 74.398 165.648 m 80.398 165.648 l S Q q 1 0 0 -1 0 216 cm 77.398 162.648 m 77.398 168.648 l S Q 122.5 35.102 m 122.5 34.434 121.5 34.434 121.5 35.102 c 121.5 35.766 122.5 35.766 122.5 35.102 c f q 1 0 0 -1 0 216 cm 119 180.898 m 125 180.898 l S Q q 1 0 0 -1 0 216 cm 122 177.898 m 122 183.898 l S Q 167.148 38.449 m 167.148 37.785 166.148 37.785 166.148 38.449 c 166.148 39.117 167.148 39.117 167.148 38.449 c f q 1 0 0 -1 0 216 cm 163.648 177.551 m 169.648 177.551 l S Q q 1 0 0 -1 0 216 cm 166.648 174.551 m 166.648 180.551 l S Q 211.75 37.898 m 211.75 37.234 210.75 37.234 210.75 37.898 c 210.75 38.566 211.75 38.566 211.75 37.898 c f q 1 0 0 -1 0 216 cm 208.25 178.102 m 214.25 178.102 l S Q q 1 0 0 -1 0 216 cm 211.25 175.102 m 211.25 181.102 l S Q 256.398 42.352 m 256.398 41.684 255.398 41.684 255.398 42.352 c 255.398 43.016 256.398 43.016 256.398 42.352 c f q 1 0 0 -1 0 216 cm 252.898 173.648 m 258.898 173.648 l S Q q 1 0 0 -1 0 216 cm 255.898 170.648 m 255.898 176.648 l S Q 301 41.801 m 301 41.133 300 41.133 300 41.801 c 300 42.465 301 42.465 301 41.801 c f q 1 0 0 -1 0 216 cm 297.5 174.199 m 303.5 174.199 l S Q q 1 0 0 -1 0 216 cm 300.5 171.199 m 300.5 177.199 l S Q 345.648 41.102 m 345.648 40.434 344.648 40.434 344.648 41.102 c 344.648 41.766 345.648 41.766 345.648 41.102 c f q 1 0 0 -1 0 216 cm 342.148 174.898 m 348.148 174.898 l S Q q 1 0 0 -1 0 216 cm 345.148 171.898 m 345.148 177.898 l S Q 86.102 196.898 m 86.102 196.234 85.102 196.234 85.102 196.898 c 85.102 197.566 86.102 197.566 86.102 196.898 c f q 1 0 0 -1 0 216 cm 82.602 19.102 m 88.602 19.102 l S Q q 1 0 0 -1 0 216 cm 85.602 16.102 m 85.602 22.102 l S Q 0 g BT 8 0 0 8 63.335938 184.847656 Tm /f-0-0 1 Tf (8)Tj ET 0 1 0 rg q 1 0 0 -1 0 216 cm 73.551 28.398 m 97.648 28.398 l S Q q 1 0 0 -1 0 216 cm 32.75 168.5 m 77.398 152.051 l 122 158.148 l 166.648 151.602 l 211.25 154.148 l 255.898 151.449 l 300.5 152.25 l 345.148 150.801 l S Q 33.25 47.5 m 33.25 46.832 32.25 46.832 32.25 47.5 c 32.25 48.168 33.25 48.168 33.25 47.5 c f q 1 0 0 -1 0 216 cm 29.75 165.5 m 35.75 171.5 l S Q q 1 0 0 -1 0 216 cm 29.75 171.5 m 35.75 165.5 l S Q 77.898 63.949 m 77.898 63.285 76.898 63.285 76.898 63.949 c 76.898 64.617 77.898 64.617 77.898 63.949 c f q 1 0 0 -1 0 216 cm 74.398 149.051 m 80.398 155.051 l S Q q 1 0 0 -1 0 216 cm 74.398 155.051 m 80.398 149.051 l S Q 122.5 57.852 m 122.5 57.184 121.5 57.184 121.5 57.852 c 121.5 58.516 122.5 58.516 122.5 57.852 c f q 1 0 0 -1 0 216 cm 119 155.148 m 125 161.148 l S Q q 1 0 0 -1 0 216 cm 119 161.148 m 125 155.148 l S Q 167.148 64.398 m 167.148 63.734 166.148 63.734 166.148 64.398 c 166.148 65.066 167.148 65.066 167.148 64.398 c f q 1 0 0 -1 0 216 cm 163.648 148.602 m 169.648 154.602 l S Q q 1 0 0 -1 0 216 cm 163.648 154.602 m 169.648 148.602 l S Q 211.75 61.852 m 211.75 61.184 210.75 61.184 210.75 61.852 c 210.75 62.516 211.75 62.516 211.75 61.852 c f q 1 0 0 -1 0 216 cm 208.25 151.148 m 214.25 157.148 l S Q q 1 0 0 -1 0 216 cm 208.25 157.148 m 214.25 151.148 l S Q 256.398 64.551 m 256.398 63.883 255.398 63.883 255.398 64.551 c 255.398 65.215 256.398 65.215 256.398 64.551 c f q 1 0 0 -1 0 216 cm 252.898 148.449 m 258.898 154.449 l S Q q 1 0 0 -1 0 216 cm 252.898 154.449 m 258.898 148.449 l S Q 301 63.75 m 301 63.082 300 63.082 300 63.75 c 300 64.418 301 64.418 301 63.75 c f q 1 0 0 -1 0 216 cm 297.5 149.25 m 303.5 155.25 l S Q q 1 0 0 -1 0 216 cm 297.5 155.25 m 303.5 149.25 l S Q 345.648 65.199 m 345.648 64.535 344.648 64.535 344.648 65.199 c 344.648 65.867 345.648 65.867 345.648 65.199 c f q 1 0 0 -1 0 216 cm 342.148 147.801 m 348.148 153.801 l S Q q 1 0 0 -1 0 216 cm 342.148 153.801 m 348.148 147.801 l S Q 86.102 187.602 m 86.102 186.934 85.102 186.934 85.102 187.602 c 85.102 188.266 86.102 188.266 86.102 187.602 c f q 1 0 0 -1 0 216 cm 82.602 25.398 m 88.602 31.398 l S Q q 1 0 0 -1 0 216 cm 82.602 31.398 m 88.602 25.398 l S Q 0 g BT 8 0 0 8 58.246094 175.550781 Tm /f-0-0 1 Tf (16)Tj ET 0 0 1 rg q 1 0 0 -1 0 216 cm 73.551 37.699 m 97.648 37.699 l S Q q 1 0 0 -1 0 216 cm 32.75 166.602 m 77.398 147.699 l 122 131.449 l 166.648 126.852 l 211.25 124.102 l 255.898 121.199 l 300.5 128.699 l 345.148 124.051 l S Q 33.25 49.398 m 33.25 48.734 32.25 48.734 32.25 49.398 c 32.25 50.066 33.25 50.066 33.25 49.398 c f q 1 0 0 -1 0 216 cm 29.75 166.602 m 35.75 166.602 l S Q q 1 0 0 -1 0 216 cm 32.75 163.602 m 32.75 169.602 l S Q q 1 0 0 -1 0 216 cm 29.75 163.602 m 35.75 169.602 l S Q q 1 0 0 -1 0 216 cm 29.75 169.602 m 35.75 163.602 l S Q 77.898 68.301 m 77.898 67.633 76.898 67.633 76.898 68.301 c 76.898 68.965 77.898 68.965 77.898 68.301 c f q 1 0 0 -1 0 216 cm 74.398 147.699 m 80.398 147.699 l S Q q 1 0 0 -1 0 216 cm 77.398 144.699 m 77.398 150.699 l S Q q 1 0 0 -1 0 216 cm 74.398 144.699 m 80.398 150.699 l S Q q 1 0 0 -1 0 216 cm 74.398 150.699 m 80.398 144.699 l S Q 122.5 84.551 m 122.5 83.883 121.5 83.883 121.5 84.551 c 121.5 85.215 122.5 85.215 122.5 84.551 c f q 1 0 0 -1 0 216 cm 119 131.449 m 125 131.449 l S Q q 1 0 0 -1 0 216 cm 122 128.449 m 122 134.449 l S Q q 1 0 0 -1 0 216 cm 119 128.449 m 125 134.449 l S Q q 1 0 0 -1 0 216 cm 119 134.449 m 125 128.449 l S Q 167.148 89.148 m 167.148 88.484 166.148 88.484 166.148 89.148 c 166.148 89.816 167.148 89.816 167.148 89.148 c f q 1 0 0 -1 0 216 cm 163.648 126.852 m 169.648 126.852 l S Q q 1 0 0 -1 0 216 cm 166.648 123.852 m 166.648 129.852 l S Q q 1 0 0 -1 0 216 cm 163.648 123.852 m 169.648 129.852 l S Q q 1 0 0 -1 0 216 cm 163.648 129.852 m 169.648 123.852 l S Q 211.75 91.898 m 211.75 91.234 210.75 91.234 210.75 91.898 c 210.75 92.566 211.75 92.566 211.75 91.898 c f q 1 0 0 -1 0 216 cm 208.25 124.102 m 214.25 124.102 l S Q q 1 0 0 -1 0 216 cm 211.25 121.102 m 211.25 127.102 l S Q q 1 0 0 -1 0 216 cm 208.25 121.102 m 214.25 127.102 l S Q q 1 0 0 -1 0 216 cm 208.25 127.102 m 214.25 121.102 l S Q 256.398 94.801 m 256.398 94.133 255.398 94.133 255.398 94.801 c 255.398 95.465 256.398 95.465 256.398 94.801 c f q 1 0 0 -1 0 216 cm 252.898 121.199 m 258.898 121.199 l S Q q 1 0 0 -1 0 216 cm 255.898 118.199 m 255.898 124.199 l S Q q 1 0 0 -1 0 216 cm 252.898 118.199 m 258.898 124.199 l S Q q 1 0 0 -1 0 216 cm 252.898 124.199 m 258.898 118.199 l S Q 301 87.301 m 301 86.633 300 86.633 300 87.301 c 300 87.965 301 87.965 301 87.301 c f q 1 0 0 -1 0 216 cm 297.5 128.699 m 303.5 128.699 l S Q q 1 0 0 -1 0 216 cm 300.5 125.699 m 300.5 131.699 l S Q q 1 0 0 -1 0 216 cm 297.5 125.699 m 303.5 131.699 l S Q q 1 0 0 -1 0 216 cm 297.5 131.699 m 303.5 125.699 l S Q 345.648 91.949 m 345.648 91.285 344.648 91.285 344.648 91.949 c 344.648 92.617 345.648 92.617 345.648 91.949 c f q 1 0 0 -1 0 216 cm 342.148 124.051 m 348.148 124.051 l S Q q 1 0 0 -1 0 216 cm 345.148 121.051 m 345.148 127.051 l S Q q 1 0 0 -1 0 216 cm 342.148 121.051 m 348.148 127.051 l S Q q 1 0 0 -1 0 216 cm 342.148 127.051 m 348.148 121.051 l S Q 86.102 178.301 m 86.102 177.633 85.102 177.633 85.102 178.301 c 85.102 178.965 86.102 178.965 86.102 178.301 c f q 1 0 0 -1 0 216 cm 82.602 37.699 m 88.602 37.699 l S Q q 1 0 0 -1 0 216 cm 85.602 34.699 m 85.602 40.699 l S Q q 1 0 0 -1 0 216 cm 82.602 34.699 m 88.602 40.699 l S Q q 1 0 0 -1 0 216 cm 82.602 40.699 m 88.602 34.699 l S Q 0 g BT 8 0 0 8 58.246094 166.25 Tm /f-0-0 1 Tf (32)Tj ET 1 0 1 rg q 1 0 0 -1 0 216 cm 73.551 47 m 97.648 47 l S Q q 1 0 0 -1 0 216 cm 32.75 165.602 m 77.398 145.301 l 122 126.102 l 166.648 117.199 l 211.25 106.449 l 255.898 95.199 l 300.5 84.648 l 345.148 82.648 l S Q 33.25 50.398 m 33.25 49.734 32.25 49.734 32.25 50.398 c 32.25 51.066 33.25 51.066 33.25 50.398 c f q 1 0 0 -1 0 216 cm 29.75 162.602 6 6 re S Q 77.898 70.699 m 77.898 70.035 76.898 70.035 76.898 70.699 c 76.898 71.367 77.898 71.367 77.898 70.699 c f q 1 0 0 -1 0 216 cm 74.398 142.301 6 6 re S Q 122.5 89.898 m 122.5 89.234 121.5 89.234 121.5 89.898 c 121.5 90.566 122.5 90.566 122.5 89.898 c f q 1 0 0 -1 0 216 cm 119 123.102 6 6 re S Q 167.148 98.801 m 167.148 98.133 166.148 98.133 166.148 98.801 c 166.148 99.465 167.148 99.465 167.148 98.801 c f q 1 0 0 -1 0 216 cm 163.648 114.199 6 6 re S Q 211.75 109.551 m 211.75 108.883 210.75 108.883 210.75 109.551 c 210.75 110.215 211.75 110.215 211.75 109.551 c f q 1 0 0 -1 0 216 cm 208.25 103.449 6 6 re S Q 256.398 120.801 m 256.398 120.133 255.398 120.133 255.398 120.801 c 255.398 121.465 256.398 121.465 256.398 120.801 c f q 1 0 0 -1 0 216 cm 252.898 92.199 6 6 re S Q 301 131.352 m 301 130.684 300 130.684 300 131.352 c 300 132.016 301 132.016 301 131.352 c f q 1 0 0 -1 0 216 cm 297.5 81.648 6 6 re S Q 345.648 133.352 m 345.648 132.684 344.648 132.684 344.648 133.352 c 344.648 134.016 345.648 134.016 345.648 133.352 c f q 1 0 0 -1 0 216 cm 342.148 79.648 6 6 re S Q 86.102 169 m 86.102 168.332 85.102 168.332 85.102 169 c 85.102 169.668 86.102 169.668 86.102 169 c f q 1 0 0 -1 0 216 cm 82.602 44 6 6 re S Q 0 g BT 8 0 0 8 58.246094 156.949219 Tm /f-0-0 1 Tf (64)Tj ET 0 1 1 rg q 1 0 0 -1 0 216 cm 73.551 56.301 m 97.648 56.301 l S Q q 1 0 0 -1 0 216 cm 32.75 165.148 m 77.398 144.102 l 122 123.25 l 166.648 104.352 l 211.25 93.801 l 255.898 76.551 l 300.5 65.801 l 345.148 51.699 l S Q 33.25 50.852 m 33.25 50.184 32.25 50.184 32.25 50.852 c 32.25 51.516 33.25 51.516 33.25 50.852 c f 29.75 53.852 6 -6 re f q 1 0 0 -1 0 216 cm 29.75 162.148 6 6 re S Q 77.898 71.898 m 77.898 71.234 76.898 71.234 76.898 71.898 c 76.898 72.566 77.898 72.566 77.898 71.898 c f 74.398 74.898 6 -6 re f q 1 0 0 -1 0 216 cm 74.398 141.102 6 6 re S Q 122.5 92.75 m 122.5 92.082 121.5 92.082 121.5 92.75 c 121.5 93.418 122.5 93.418 122.5 92.75 c f 119 95.75 6 -6 re f q 1 0 0 -1 0 216 cm 119 120.25 6 6 re S Q 167.148 111.648 m 167.148 110.984 166.148 110.984 166.148 111.648 c 166.148 112.316 167.148 112.316 167.148 111.648 c f 163.648 114.648 6 -6 re f q 1 0 0 -1 0 216 cm 163.648 101.352 6 6 re S Q 211.75 122.199 m 211.75 121.535 210.75 121.535 210.75 122.199 c 210.75 122.867 211.75 122.867 211.75 122.199 c f 208.25 125.199 6 -6 re f q 1 0 0 -1 0 216 cm 208.25 90.801 6 6 re S Q 256.398 139.449 m 256.398 138.785 255.398 138.785 255.398 139.449 c 255.398 140.117 256.398 140.117 256.398 139.449 c f 252.898 142.449 6 -6 re f q 1 0 0 -1 0 216 cm 252.898 73.551 6 6 re S Q 301 150.199 m 301 149.535 300 149.535 300 150.199 c 300 150.867 301 150.867 301 150.199 c f 297.5 153.199 6 -6 re f q 1 0 0 -1 0 216 cm 297.5 62.801 6 6 re S Q 345.648 164.301 m 345.648 163.633 344.648 163.633 344.648 164.301 c 344.648 164.965 345.648 164.965 345.648 164.301 c f 342.148 167.301 6 -6 re f q 1 0 0 -1 0 216 cm 342.148 48.699 6 6 re S Q 86.102 159.699 m 86.102 159.035 85.102 159.035 85.102 159.699 c 85.102 160.367 86.102 160.367 86.102 159.699 c f 82.602 162.699 6 -6 re f q 1 0 0 -1 0 216 cm 82.602 53.301 6 6 re S Q 0 g BT 8 0 0 8 53.15625 147.648438 Tm /f-0-0 1 Tf (128)Tj ET 1 1 0 rg q 1 0 0 -1 0 216 cm 73.551 65.602 m 97.648 65.602 l S Q q 1 0 0 -1 0 216 cm 32.75 164.949 m 77.398 143.449 l 122 122.102 l 166.648 101.352 l 211.25 85.602 l 255.898 67.602 l 300.5 50.352 l 345.148 18.801 l S Q 33.25 51.051 m 33.25 50.383 32.25 50.383 32.25 51.051 c 32.25 51.715 33.25 51.715 33.25 51.051 c f q 1 0 0 -1 0 216 cm 35.75 164.949 m 35.75 168.949 29.75 168.949 29.75 164.949 c 29.75 160.949 35.75 160.949 35.75 164.949 c S Q 77.898 72.551 m 77.898 71.883 76.898 71.883 76.898 72.551 c 76.898 73.215 77.898 73.215 77.898 72.551 c f q 1 0 0 -1 0 216 cm 80.398 143.449 m 80.398 147.449 74.398 147.449 74.398 143.449 c 74.398 139.449 80.398 139.449 80.398 143.449 c S Q 122.5 93.898 m 122.5 93.234 121.5 93.234 121.5 93.898 c 121.5 94.566 122.5 94.566 122.5 93.898 c f q 1 0 0 -1 0 216 cm 125 122.102 m 125 126.102 119 126.102 119 122.102 c 119 118.102 125 118.102 125 122.102 c S Q 167.148 114.648 m 167.148 113.984 166.148 113.984 166.148 114.648 c 166.148 115.316 167.148 115.316 167.148 114.648 c f q 1 0 0 -1 0 216 cm 169.648 101.352 m 169.648 105.352 163.648 105.352 163.648 101.352 c 163.648 97.352 169.648 97.352 169.648 101.352 c S Q 211.75 130.398 m 211.75 129.734 210.75 129.734 210.75 130.398 c 210.75 131.066 211.75 131.066 211.75 130.398 c f q 1 0 0 -1 0 216 cm 214.25 85.602 m 214.25 89.602 208.25 89.602 208.25 85.602 c 208.25 81.602 214.25 81.602 214.25 85.602 c S Q 256.398 148.398 m 256.398 147.734 255.398 147.734 255.398 148.398 c 255.398 149.066 256.398 149.066 256.398 148.398 c f q 1 0 0 -1 0 216 cm 258.898 67.602 m 258.898 71.602 252.898 71.602 252.898 67.602 c 252.898 63.602 258.898 63.602 258.898 67.602 c S Q 301 165.648 m 301 164.984 300 164.984 300 165.648 c 300 166.316 301 166.316 301 165.648 c f q 1 0 0 -1 0 216 cm 303.5 50.352 m 303.5 54.352 297.5 54.352 297.5 50.352 c 297.5 46.352 303.5 46.352 303.5 50.352 c S Q 345.648 197.199 m 345.648 196.535 344.648 196.535 344.648 197.199 c 344.648 197.867 345.648 197.867 345.648 197.199 c f q 1 0 0 -1 0 216 cm 348.148 18.801 m 348.148 22.801 342.148 22.801 342.148 18.801 c 342.148 14.801 348.148 14.801 348.148 18.801 c S Q 86.102 150.398 m 86.102 149.734 85.102 149.734 85.102 150.398 c 85.102 151.066 86.102 151.066 86.102 150.398 c f q 1 0 0 -1 0 216 cm 88.602 65.602 m 88.602 69.602 82.602 69.602 82.602 65.602 c 82.602 61.602 88.602 61.602 88.602 65.602 c S Q 0 g BT 8 0 0 8 53.15625 138.347656 Tm /f-0-0 1 Tf (256)Tj ET q 1 0 0 -1 0 216 cm 73.551 74.898 m 97.648 74.898 l S Q q 1 0 0 -1 0 216 cm 32.75 164.852 m 77.398 143.102 l 122 121.301 l 166.648 100 l 211.25 81.449 l 255.898 62.051 l 300.5 35.852 l 345.148 20.352 l S Q 33.25 51.148 m 33.25 50.484 32.25 50.484 32.25 51.148 c 32.25 51.816 33.25 51.816 33.25 51.148 c f 35.75 51.148 m 35.75 47.148 29.75 47.148 29.75 51.148 c 29.75 55.148 35.75 55.148 35.75 51.148 c f q 1 0 0 -1 0 216 cm 35.75 164.852 m 35.75 168.852 29.75 168.852 29.75 164.852 c 29.75 160.852 35.75 160.852 35.75 164.852 c S Q 77.898 72.898 m 77.898 72.234 76.898 72.234 76.898 72.898 c 76.898 73.566 77.898 73.566 77.898 72.898 c f 80.398 72.898 m 80.398 68.898 74.398 68.898 74.398 72.898 c 74.398 76.898 80.398 76.898 80.398 72.898 c f q 1 0 0 -1 0 216 cm 80.398 143.102 m 80.398 147.102 74.398 147.102 74.398 143.102 c 74.398 139.102 80.398 139.102 80.398 143.102 c S Q 122.5 94.699 m 122.5 94.035 121.5 94.035 121.5 94.699 c 121.5 95.367 122.5 95.367 122.5 94.699 c f 125 94.699 m 125 90.699 119 90.699 119 94.699 c 119 98.699 125 98.699 125 94.699 c f q 1 0 0 -1 0 216 cm 125 121.301 m 125 125.301 119 125.301 119 121.301 c 119 117.301 125 117.301 125 121.301 c S Q 167.148 116 m 167.148 115.332 166.148 115.332 166.148 116 c 166.148 116.668 167.148 116.668 167.148 116 c f 169.648 116 m 169.648 112 163.648 112 163.648 116 c 163.648 120 169.648 120 169.648 116 c f q 1 0 0 -1 0 216 cm 169.648 100 m 169.648 104 163.648 104 163.648 100 c 163.648 96 169.648 96 169.648 100 c S Q 211.75 134.551 m 211.75 133.883 210.75 133.883 210.75 134.551 c 210.75 135.215 211.75 135.215 211.75 134.551 c f 214.25 134.551 m 214.25 130.551 208.25 130.551 208.25 134.551 c 208.25 138.551 214.25 138.551 214.25 134.551 c f q 1 0 0 -1 0 216 cm 214.25 81.449 m 214.25 85.449 208.25 85.449 208.25 81.449 c 208.25 77.449 214.25 77.449 214.25 81.449 c S Q 256.398 153.949 m 256.398 153.285 255.398 153.285 255.398 153.949 c 255.398 154.617 256.398 154.617 256.398 153.949 c f 258.898 153.949 m 258.898 149.949 252.898 149.949 252.898 153.949 c 252.898 157.949 258.898 157.949 258.898 153.949 c f q 1 0 0 -1 0 216 cm 258.898 62.051 m 258.898 66.051 252.898 66.051 252.898 62.051 c 252.898 58.051 258.898 58.051 258.898 62.051 c S Q 301 180.148 m 301 179.484 300 179.484 300 180.148 c 300 180.816 301 180.816 301 180.148 c f 303.5 180.148 m 303.5 176.148 297.5 176.148 297.5 180.148 c 297.5 184.148 303.5 184.148 303.5 180.148 c f q 1 0 0 -1 0 216 cm 303.5 35.852 m 303.5 39.852 297.5 39.852 297.5 35.852 c 297.5 31.852 303.5 31.852 303.5 35.852 c S Q 345.648 195.648 m 345.648 194.984 344.648 194.984 344.648 195.648 c 344.648 196.316 345.648 196.316 345.648 195.648 c f 348.148 195.648 m 348.148 191.648 342.148 191.648 342.148 195.648 c 342.148 199.648 348.148 199.648 348.148 195.648 c f q 1 0 0 -1 0 216 cm 348.148 20.352 m 348.148 24.352 342.148 24.352 342.148 20.352 c 342.148 16.352 348.148 16.352 348.148 20.352 c S Q 86.102 141.102 m 86.102 140.434 85.102 140.434 85.102 141.102 c 85.102 141.766 86.102 141.766 86.102 141.102 c f 88.602 141.102 m 88.602 137.102 82.602 137.102 82.602 141.102 c 82.602 145.102 88.602 145.102 88.602 141.102 c f q 1 0 0 -1 0 216 cm 88.602 74.898 m 88.602 78.898 82.602 78.898 82.602 74.898 c 82.602 70.898 88.602 70.898 88.602 74.898 c S Q BT 8 0 0 8 53.15625 129.050781 Tm /f-0-0 1 Tf (512)Tj ET 1 0.3 0 rg q 1 0 0 -1 0 216 cm 73.551 84.199 m 97.648 84.199 l S Q q 1 0 0 -1 0 216 cm 32.75 164.801 m 77.398 142.949 l 122 121.148 l 166.648 99.352 l 211.25 79 l 255.898 58.199 l 300.5 37.602 l 345.148 17.051 l S Q 33.25 51.199 m 33.25 50.535 32.25 50.535 32.25 51.199 c 32.25 51.867 33.25 51.867 33.25 51.199 c f q 1 0 0 -1 0 216 cm 29.75 166.801 m 32.75 161.801 l 35.75 166.801 l h S Q 77.898 73.051 m 77.898 72.383 76.898 72.383 76.898 73.051 c 76.898 73.715 77.898 73.715 77.898 73.051 c f q 1 0 0 -1 0 216 cm 74.398 144.949 m 77.398 139.949 l 80.398 144.949 l h S Q 122.5 94.852 m 122.5 94.184 121.5 94.184 121.5 94.852 c 121.5 95.516 122.5 95.516 122.5 94.852 c f q 1 0 0 -1 0 216 cm 119 123.148 m 122 118.148 l 125 123.148 l h S Q 167.148 116.648 m 167.148 115.984 166.148 115.984 166.148 116.648 c 166.148 117.316 167.148 117.316 167.148 116.648 c f q 1 0 0 -1 0 216 cm 163.648 101.352 m 166.648 96.352 l 169.648 101.352 l h S Q 211.75 137 m 211.75 136.332 210.75 136.332 210.75 137 c 210.75 137.668 211.75 137.668 211.75 137 c f q 1 0 0 -1 0 216 cm 208.25 81 m 211.25 76 l 214.25 81 l h S Q 256.398 157.801 m 256.398 157.133 255.398 157.133 255.398 157.801 c 255.398 158.465 256.398 158.465 256.398 157.801 c f q 1 0 0 -1 0 216 cm 252.898 60.199 m 255.898 55.199 l 258.898 60.199 l h S Q 301 178.398 m 301 177.734 300 177.734 300 178.398 c 300 179.066 301 179.066 301 178.398 c f q 1 0 0 -1 0 216 cm 297.5 39.602 m 300.5 34.602 l 303.5 39.602 l h S Q 345.648 198.949 m 345.648 198.285 344.648 198.285 344.648 198.949 c 344.648 199.617 345.648 199.617 345.648 198.949 c f q 1 0 0 -1 0 216 cm 342.148 19.051 m 345.148 14.051 l 348.148 19.051 l h S Q 86.102 131.801 m 86.102 131.133 85.102 131.133 85.102 131.801 c 85.102 132.465 86.102 132.465 86.102 131.801 c f q 1 0 0 -1 0 216 cm 82.602 86.199 m 85.602 81.199 l 88.602 86.199 l h S Q 0 g BT 8 0 0 8 48.066406 119.75 Tm /f-0-0 1 Tf (1024)Tj ET 0.5 g q 1 0 0 -1 0 216 cm 73.551 93.5 m 97.648 93.5 l S Q q 1 0 0 -1 0 216 cm 32.75 164.801 m 77.398 142.898 l 122 121 l 166.648 99.051 l 211.25 77.449 l 255.898 56.699 l 300.5 35.199 l 345.148 14.25 l S Q 33.25 51.199 m 33.25 50.535 32.25 50.535 32.25 51.199 c 32.25 51.867 33.25 51.867 33.25 51.199 c f 29.75 49.199 m 32.75 54.199 l 35.75 49.199 l h f q 1 0 0 -1 0 216 cm 29.75 166.801 m 32.75 161.801 l 35.75 166.801 l h S Q 77.898 73.102 m 77.898 72.434 76.898 72.434 76.898 73.102 c 76.898 73.766 77.898 73.766 77.898 73.102 c f 74.398 71.102 m 77.398 76.102 l 80.398 71.102 l h f q 1 0 0 -1 0 216 cm 74.398 144.898 m 77.398 139.898 l 80.398 144.898 l h S Q 122.5 95 m 122.5 94.332 121.5 94.332 121.5 95 c 121.5 95.668 122.5 95.668 122.5 95 c f 119 93 m 122 98 l 125 93 l h f q 1 0 0 -1 0 216 cm 119 123 m 122 118 l 125 123 l h S Q 167.148 116.949 m 167.148 116.285 166.148 116.285 166.148 116.949 c 166.148 117.617 167.148 117.617 167.148 116.949 c f 163.648 114.949 m 166.648 119.949 l 169.648 114.949 l h f q 1 0 0 -1 0 216 cm 163.648 101.051 m 166.648 96.051 l 169.648 101.051 l h S Q 211.75 138.551 m 211.75 137.883 210.75 137.883 210.75 138.551 c 210.75 139.215 211.75 139.215 211.75 138.551 c f 208.25 136.551 m 211.25 141.551 l 214.25 136.551 l h f q 1 0 0 -1 0 216 cm 208.25 79.449 m 211.25 74.449 l 214.25 79.449 l h S Q 256.398 159.301 m 256.398 158.633 255.398 158.633 255.398 159.301 c 255.398 159.965 256.398 159.965 256.398 159.301 c f 252.898 157.301 m 255.898 162.301 l 258.898 157.301 l h f q 1 0 0 -1 0 216 cm 252.898 58.699 m 255.898 53.699 l 258.898 58.699 l h S Q 301 180.801 m 301 180.133 300 180.133 300 180.801 c 300 181.465 301 181.465 301 180.801 c f 297.5 178.801 m 300.5 183.801 l 303.5 178.801 l h f q 1 0 0 -1 0 216 cm 297.5 37.199 m 300.5 32.199 l 303.5 37.199 l h S Q 345.648 201.75 m 345.648 201.082 344.648 201.082 344.648 201.75 c 344.648 202.418 345.648 202.418 345.648 201.75 c f 342.148 199.75 m 345.148 204.75 l 348.148 199.75 l h f q 1 0 0 -1 0 216 cm 342.148 16.25 m 345.148 11.25 l 348.148 16.25 l h S Q 86.102 122.5 m 86.102 121.832 85.102 121.832 85.102 122.5 c 85.102 123.168 86.102 123.168 86.102 122.5 c f 82.602 120.5 m 85.602 125.5 l 88.602 120.5 l h f q 1 0 0 -1 0 216 cm 82.602 95.5 m 85.602 90.5 l 88.602 95.5 l h S Q 0 g BT 8 0 0 8 48.066406 110.449219 Tm /f-0-0 1 Tf (2048)Tj ET 1 0 0 rg q 1 0 0 -1 0 216 cm 73.551 102.801 m 97.648 102.801 l S Q q 1 0 0 -1 0 216 cm 32.75 164.75 m 77.398 142.801 l 122 120.949 l 166.648 98.898 l 211.25 77.352 l 255.898 55.898 l 300.5 34.148 l 345.148 12.449 l S Q 33.25 51.25 m 33.25 50.582 32.25 50.582 32.25 51.25 c 32.25 51.918 33.25 51.918 33.25 51.25 c f q 1 0 0 -1 0 216 cm 29.75 162.75 m 32.75 167.75 l 35.75 162.75 l h S Q 77.898 73.199 m 77.898 72.535 76.898 72.535 76.898 73.199 c 76.898 73.867 77.898 73.867 77.898 73.199 c f q 1 0 0 -1 0 216 cm 74.398 140.801 m 77.398 145.801 l 80.398 140.801 l h S Q 122.5 95.051 m 122.5 94.383 121.5 94.383 121.5 95.051 c 121.5 95.715 122.5 95.715 122.5 95.051 c f q 1 0 0 -1 0 216 cm 119 118.949 m 122 123.949 l 125 118.949 l h S Q 167.148 117.102 m 167.148 116.434 166.148 116.434 166.148 117.102 c 166.148 117.766 167.148 117.766 167.148 117.102 c f q 1 0 0 -1 0 216 cm 163.648 96.898 m 166.648 101.898 l 169.648 96.898 l h S Q 211.75 138.648 m 211.75 137.984 210.75 137.984 210.75 138.648 c 210.75 139.316 211.75 139.316 211.75 138.648 c f q 1 0 0 -1 0 216 cm 208.25 75.352 m 211.25 80.352 l 214.25 75.352 l h S Q 256.398 160.102 m 256.398 159.434 255.398 159.434 255.398 160.102 c 255.398 160.766 256.398 160.766 256.398 160.102 c f q 1 0 0 -1 0 216 cm 252.898 53.898 m 255.898 58.898 l 258.898 53.898 l h S Q 301 181.852 m 301 181.184 300 181.184 300 181.852 c 300 182.516 301 182.516 301 181.852 c f q 1 0 0 -1 0 216 cm 297.5 32.148 m 300.5 37.148 l 303.5 32.148 l h S Q 345.648 203.551 m 345.648 202.883 344.648 202.883 344.648 203.551 c 344.648 204.215 345.648 204.215 345.648 203.551 c f q 1 0 0 -1 0 216 cm 342.148 10.449 m 345.148 15.449 l 348.148 10.449 l h S Q 86.102 113.199 m 86.102 112.535 85.102 112.535 85.102 113.199 c 85.102 113.867 86.102 113.867 86.102 113.199 c f q 1 0 0 -1 0 216 cm 82.602 100.801 m 85.602 105.801 l 88.602 100.801 l h S Q 0 g BT 8 0 0 8 48.066406 101.148438 Tm /f-0-0 1 Tf (4096)Tj ET 0 1 0 rg q 1 0 0 -1 0 216 cm 73.551 112.102 m 97.648 112.102 l S Q q 1 0 0 -1 0 216 cm 32.75 164.75 m 77.398 142.75 l 122 120.949 l 166.648 98.852 l 211.25 77.051 l 255.898 55.148 l 300.5 33.551 l 345.148 11.551 l S Q 33.25 51.25 m 33.25 50.582 32.25 50.582 32.25 51.25 c 32.25 51.918 33.25 51.918 33.25 51.25 c f 29.75 53.25 m 32.75 48.25 l 35.75 53.25 l h f q 1 0 0 -1 0 216 cm 29.75 162.75 m 32.75 167.75 l 35.75 162.75 l h S Q 77.898 73.25 m 77.898 72.582 76.898 72.582 76.898 73.25 c 76.898 73.918 77.898 73.918 77.898 73.25 c f 74.398 75.25 m 77.398 70.25 l 80.398 75.25 l h f q 1 0 0 -1 0 216 cm 74.398 140.75 m 77.398 145.75 l 80.398 140.75 l h S Q 122.5 95.051 m 122.5 94.383 121.5 94.383 121.5 95.051 c 121.5 95.715 122.5 95.715 122.5 95.051 c f 119 97.051 m 122 92.051 l 125 97.051 l h f q 1 0 0 -1 0 216 cm 119 118.949 m 122 123.949 l 125 118.949 l h S Q 167.148 117.148 m 167.148 116.484 166.148 116.484 166.148 117.148 c 166.148 117.816 167.148 117.816 167.148 117.148 c f 163.648 119.148 m 166.648 114.148 l 169.648 119.148 l h f q 1 0 0 -1 0 216 cm 163.648 96.852 m 166.648 101.852 l 169.648 96.852 l h S Q 211.75 138.949 m 211.75 138.285 210.75 138.285 210.75 138.949 c 210.75 139.617 211.75 139.617 211.75 138.949 c f 208.25 140.949 m 211.25 135.949 l 214.25 140.949 l h f q 1 0 0 -1 0 216 cm 208.25 75.051 m 211.25 80.051 l 214.25 75.051 l h S Q 256.398 160.852 m 256.398 160.184 255.398 160.184 255.398 160.852 c 255.398 161.516 256.398 161.516 256.398 160.852 c f 252.898 162.852 m 255.898 157.852 l 258.898 162.852 l h f q 1 0 0 -1 0 216 cm 252.898 53.148 m 255.898 58.148 l 258.898 53.148 l h S Q 301 182.449 m 301 181.785 300 181.785 300 182.449 c 300 183.117 301 183.117 301 182.449 c f 297.5 184.449 m 300.5 179.449 l 303.5 184.449 l h f q 1 0 0 -1 0 216 cm 297.5 31.551 m 300.5 36.551 l 303.5 31.551 l h S Q 345.648 204.449 m 345.648 203.785 344.648 203.785 344.648 204.449 c 344.648 205.117 345.648 205.117 345.648 204.449 c f 342.148 206.449 m 345.148 201.449 l 348.148 206.449 l h f q 1 0 0 -1 0 216 cm 342.148 9.551 m 345.148 14.551 l 348.148 9.551 l h S Q 86.102 103.898 m 86.102 103.234 85.102 103.234 85.102 103.898 c 85.102 104.566 86.102 104.566 86.102 103.898 c f 82.602 105.898 m 85.602 100.898 l 88.602 105.898 l h f q 1 0 0 -1 0 216 cm 82.602 110.102 m 85.602 115.102 l 88.602 110.102 l h S Q 0 g BT 8 0 0 8 45.796875 91.847656 Tm /f-0-0 1 Tf (linear)Tj ET 0 0 1 rg q 1 0 0 -1 0 216 cm 73.551 121.398 m 97.648 121.398 l S Q q 1 0 0 -1 0 216 cm 32.75 164.75 m 35.898 163.199 l 39.051 161.648 l 42.199 160.102 l 45.352 158.551 l 48.551 156.949 l 51.699 155.398 l 54.852 153.852 l 61.148 150.75 l 64.301 149.199 l 67.449 147.648 l 70.602 146.102 l 73.75 144.551 l 76.949 142.949 l 80.102 141.398 l 83.25 139.852 l 86.398 138.301 l 89.551 136.75 l 92.699 135.199 l 95.852 133.648 l 99 132.102 l 102.148 130.551 l 105.352 128.949 l 108.5 127.398 l 111.648 125.852 l 114.801 124.301 l 117.949 122.75 l 121.102 121.199 l 124.25 119.648 l 127.398 118.102 l 130.551 116.551 l 133.75 114.949 l 136.898 113.398 l 140.051 111.852 l 143.199 110.301 l 146.352 108.75 l 152.648 105.648 l 155.801 104.102 l 158.949 102.551 l 162.148 100.949 l 165.301 99.398 l 168.449 97.852 l 171.602 96.301 l 177.898 93.199 l 181.051 91.648 l 184.199 90.102 l 187.352 88.551 l 190.551 86.949 l 193.699 85.398 l 196.852 83.852 l 203.148 80.75 l 206.301 79.199 l 209.449 77.648 l 212.602 76.102 l 215.75 74.551 l 218.949 72.949 l 222.102 71.398 l 225.25 69.852 l 228.398 68.301 l 231.551 66.75 l 234.699 65.199 l 237.852 63.648 l 241 62.102 l 244.148 60.551 l 247.352 58.949 l 250.5 57.398 l 253.648 55.852 l 256.801 54.301 l 259.949 52.75 l 263.102 51.199 l 266.25 49.648 l 269.398 48.102 l 272.551 46.551 l 275.75 44.949 l 278.898 43.398 l 282.051 41.852 l 285.199 40.301 l 288.352 38.75 l 294.648 35.648 l 297.801 34.102 l 300.949 32.551 l 304.148 30.949 l 307.301 29.398 l 310.449 27.852 l 313.602 26.301 l 319.898 23.199 l 323.051 21.648 l 326.199 20.102 l 329.352 18.551 l 332.551 16.949 l 335.699 15.398 l 338.852 13.852 l 345.148 10.75 l S Q 0 g q 1 0 0 -1 0 216 cm 32.75 10.75 312.398 176 re S Q Q Q showpage %%Trailer end restore %%EOF starpu-1.1.5/doc/doxygen/chapters/starpu_starpu_slu_lu_model_11.png0000644000373600000000000001671512571536552022514 00000000000000PNG  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>(